From: Junio C Hamano <gitster@pobox.com>
To: Stefan Beller <sbeller@google.com>
Cc: git@vger.kernel.org, mhagger@alum.mit.edu, jrnieder@gmail.com,
ronniesahlberg@gmail.com, Michael Haggerty <mhagger@alum.mit.edu>
Subject: Re: [PATCH 3/5] receive-pack.c: use a single ref_transaction for atomic pushes
Date: Mon, 15 Dec 2014 13:37:37 -0800 [thread overview]
Message-ID: <xmqqiohcd272.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1418673368-20785-4-git-send-email-sbeller@google.com> (Stefan Beller's message of "Mon, 15 Dec 2014 11:56:06 -0800")
Stefan Beller <sbeller@google.com> writes:
> @@ -832,34 +834,56 @@ static const char *update(struct command *cmd, struct shallow_info *si)
> cmd->did_not_exist = 1;
> }
> }
> - if (delete_ref(namespaced_name, old_sha1, 0)) {
> - rp_error("failed to delete %s", name);
> - return "failed to delete";
> + if (!use_atomic_push) {
> + if (delete_ref(namespaced_name, old_sha1, 0)) {
> + rp_error("failed to delete %s", name);
> + return "failed to delete";
> + }
> + } else {
> + if (ref_transaction_delete(transaction,
> + namespaced_name,
> + old_sha1,
> + 0, old_sha1 != NULL,
> + "push", &err)) {
> + rp_error("%s", err.buf);
> + strbuf_release(&err);
> + return "failed to delete";
> + }
Doesn't the asymmetry between the above (if transaction is there,
use it, otherwise call delete_ref() which conceptually has its sole
operation inside a single transaction by itself) and below (if
transaction is not there, create it and do its thing, and close the
transaction if we created it) bother you?
The above look much simpler, and if it does not switch on
use_atomic_push but on the presense of transaction, it would have
been even better, i.e.
if (transaction
? ref_transaction_delete(transaction, ...)
: delete_ref(...)) {
error(...);
return "failed to delete";
}
I think it makes the code harder to read and maintain if you forced
a caller of the ref API that happen to touch only a single ref to
make three calls to
ref_transaction_begin();
ref_transaction_do_one_thing();
ref_transaction_commit();
instead of making a single call to a simple wrapper
ref_do_one_thing();
I think that I saw Michael make a similar observation in a near-by
thread.
Even if you insist using transactions explicitly in the user of the
ref API, I think a better code organization is possible in this
particular codepath. Because execute_commands() has the loop over
all the proposed updates, why should the update() even need to know
how to open a new transaction and when? In other words, can't the
code be more like this?
static update(transaction, ...)
{
/* do my thing in the transaction given to me */
compute what kind of update is needed;
switch (kind) {
case delete:
ref_transaction_delete(transaction, ...);
break;
case update:
ref_transaction_update(transaction, ...);
break;
...
}
}
execute_commands(...)
{
if (atomic)
transaction = ref_transaction_begin(...);
for (cmd = commands; cmd; cmd = cmd->next) {
if (!atomic)
transaction = ref_transaction_begin(...);
update(transaction, ...);
if (!atomic)
ref_transaction_commit(transaction);
}
if (atomic)
ref_transaction_commit(transaction);
}
That is, update() assumes it is always in _some_ transaction, and
execute_commands(), which is what drives multi-ref updates, knows
if it wants its repeated calls to update() to be in a single
transaction or separate transactions.
next prev parent reply other threads:[~2014-12-15 21:37 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-15 19:56 [PATCH 0/5] Add a flag to push atomically Stefan Beller
2014-12-15 19:56 ` [PATCH 1/5] receive-pack.c: add protocol support to negotiate atomic-push Stefan Beller
2014-12-15 20:53 ` Junio C Hamano
2014-12-15 22:30 ` Stefan Beller
2014-12-15 19:56 ` [PATCH 2/5] send-pack.c: add an --atomic-push command line argument Stefan Beller
2014-12-15 21:01 ` Junio C Hamano
2014-12-15 19:56 ` [PATCH 3/5] receive-pack.c: use a single ref_transaction for atomic pushes Stefan Beller
2014-12-15 21:37 ` Junio C Hamano [this message]
2014-12-15 19:56 ` [PATCH 4/5] push.c: add an --atomic-push argument Stefan Beller
2014-12-15 21:50 ` Junio C Hamano
2014-12-15 19:56 ` [PATCH 5/5] t5543-atomic-push.sh: add basic tests for atomic pushes Stefan Beller
2014-12-15 22:29 ` Junio C Hamano
2014-12-15 22:33 ` [PATCH 0/5] Add a flag to push atomically Junio C Hamano
2014-12-16 18:49 ` [PATCHv2 1/6] receive-pack.c: add protocol support to negotiate atomic-push Stefan Beller
2014-12-16 18:49 ` [PATCHv2 2/6] send-pack: Invert the return value of ref_update_to_be_sent Stefan Beller
2014-12-16 19:14 ` Junio C Hamano
2014-12-16 18:49 ` [PATCHv2 3/6] send-pack.c: add --atomic command line argument Stefan Beller
2014-12-16 19:31 ` Junio C Hamano
2014-12-16 18:49 ` [PATCHv2 4/6] receive-pack.c: use a single ref_transaction for atomic pushes Stefan Beller
2014-12-16 19:29 ` Eric Sunshine
2014-12-16 20:30 ` Eric Sunshine
2014-12-16 19:35 ` Junio C Hamano
2014-12-16 18:49 ` [PATCHv2 5/6] push.c: add an --atomic-push argument Stefan Beller
2014-12-16 19:33 ` Eric Sunshine
2014-12-16 20:43 ` Junio C Hamano
2014-12-16 19:36 ` Junio C Hamano
2014-12-16 18:49 ` [PATCHv2 6/6] t5543-atomic-push.sh: add basic tests for atomic pushes Stefan Beller
2014-12-16 19:14 ` [PATCH] receive-pack: refuse all commands if one fails in atomic mode Stefan Beller
2014-12-16 20:32 ` Junio C Hamano
2014-12-16 19:37 ` [PATCHv2 6/6] t5543-atomic-push.sh: add basic tests for atomic pushes Eric Sunshine
2014-12-16 19:46 ` Junio C Hamano
2014-12-16 19:57 ` Stefan Beller
2014-12-16 20:46 ` Junio C Hamano
2014-12-16 20:51 ` Stefan Beller
2014-12-16 20:30 ` Junio C Hamano
2014-12-16 20:36 ` Stefan Beller
2014-12-16 19:05 ` [PATCHv2 1/6] receive-pack.c: add protocol support to negotiate atomic-push Junio C Hamano
2014-12-17 18:32 ` [PATCHv3 0/6] atomic pushes Stefan Beller
2014-12-17 18:32 ` [PATCHv3 1/6] receive-pack.c: add protocol support to negotiate atomic Stefan Beller
2014-12-19 1:05 ` Eric Sunshine
2014-12-17 18:32 ` [PATCHv3 2/6] send-pack: Rename ref_update_to_be_sent to check_to_send_update Stefan Beller
2014-12-17 22:53 ` Junio C Hamano
2014-12-17 18:32 ` [PATCHv3 3/6] send-pack.c: add --atomic command line argument Stefan Beller
2014-12-17 23:14 ` Junio C Hamano
2014-12-19 1:22 ` Eric Sunshine
2014-12-17 18:32 ` [PATCHv3 4/6] receive-pack.c: use a single ref_transaction for atomic pushes Stefan Beller
2014-12-17 23:26 ` Junio C Hamano
2014-12-17 23:58 ` Stefan Beller
2014-12-18 17:02 ` Junio C Hamano
2014-12-18 17:45 ` [PATCHv4 " Stefan Beller
2014-12-18 22:26 ` Eric Sunshine
2014-12-19 0:22 ` [PATCHv5 " Stefan Beller
2014-12-19 10:14 ` Eric Sunshine
2014-12-17 18:32 ` [PATCHv3 5/6] push.c: add an --atomic argument Stefan Beller
2014-12-19 1:29 ` Eric Sunshine
2014-12-17 18:32 ` [PATCHv3 6/6] t5543-atomic-push.sh: add basic tests for atomic pushes Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqiohcd272.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
--cc=mhagger@alum.mit.edu \
--cc=ronniesahlberg@gmail.com \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.