Re: [PATCHv8 6/9] receive-pack.c: add execute_commands_atomic function
- From
Eric Sunshine <sunshine@sunshineco.com>
- Date
- Dec 30, 2014, 08:57 UTC
- Message-ID
- <CAPig+cTY3UQsOEut7mqUze1or1i3Hx9=2inrToOFrRKEo08=XQ@mail.gmail.com>
- In-Reply-To
- <1419907007-19387-7-git-send-email-sbeller@google.com>
On Mon, Dec 29, 2014 at 9:36 PM, Stefan Beller <sbeller@google.com> wrote:
> Update receive-pack to use an atomic transaction iff the client negotiated > that it wanted atomic push.
This first line seems germane to this patch...
Show 8 quoted lines
> This leaves the default behavior to be the old > non-atomic one ref at a time update. This is to cause as little disruption > as possible to existing clients. It is unknown if there are client scripts > that depend on the old non-atomic behavior so we make it opt-in for now. > > If it turns out over time that there are no client scripts that depend on the > old behavior we can change git to default to use atomic pushes and instead > offer an opt-out argument for people that do not want atomic pushes.
However, the remainder feels like it belongs with some other patch, such as a patch which introduces an --atomic option.
Show 16 quoted lines
> Inspired-by: Ronnie Sahlberg <sahlberg@google.com> > Helped-by: Eric Sunshine <sunshine@sunshineco.com> > Signed-off-by: Stefan Beller <sbeller@google.com> > --- > diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c > index 5f44466..35a2264 100644 > --- a/builtin/receive-pack.c > +++ b/builtin/receive-pack.c > @@ -1076,8 +1076,8 @@ static void check_shallow_bugs(struct command *commands, > "the reported refs above"); > } > > -static void execute_commands_loop(struct command *commands, > - struct shallow_info *si) > +static void execute_commands_non_atomic(struct command *commands, > + struct shallow_info *si)
Style: Indent the wrapped line to align with the text following the
'(' in the first line.Show 12 quoted lines
> {
> struct command *cmd;
> struct strbuf err = STRBUF_INIT;
> @@ -1104,7 +1104,50 @@ static void execute_commands_loop(struct command *commands,
> }
> ref_transaction_free(transaction);
> }
> + strbuf_release(&err);
> +}
> +
> +static void execute_commands_atomic(struct command *commands,
> + struct shallow_info *si)Style: Indentation.
Show 32 quoted lines
> +{
> + struct command *cmd;
> + struct strbuf err = STRBUF_INIT;
> + const char *reported_error = "atomic push failure";
> +
> + transaction = ref_transaction_begin(&err);
> + if (!transaction) {
> + rp_error("%s", err.buf);
> + strbuf_reset(&err);
> + reported_error = "transaction failed to start";
> + goto failure;
> + }
> +
> + for (cmd = commands; cmd; cmd = cmd->next) {
> + if (!should_process_cmd(cmd))
> + continue;
>
> + cmd->error_string = update(cmd, si);
> +
> + if (cmd->error_string)
> + goto failure;
> + }
> +
> + if (ref_transaction_commit(transaction, &err)) {
> + rp_error("%s", err.buf);
> + reported_error = "atomic transaction failed";
> + goto failure;
> + }
> +
> + ref_transaction_free(transaction);
> + strbuf_release(&err);
> + return;Minor comment: This cleanup code is repeated in both the success and fail branches. It _might_ (or not) be a bit cleaner and more maintainable to replace the above three lines with:
goto done;
Show 5 quoted lines
> + > +failure: > + for (cmd = commands; cmd; cmd = cmd->next) > + if (!cmd->error_string) > + cmd->error_string = reported_error;
And add a 'done' label here:
done:
Show 18 quoted lines
> + ref_transaction_free(transaction);
> strbuf_release(&err);
> }
>
> @@ -1142,7 +1185,10 @@ static void execute_commands(struct command *commands,
> free(head_name_to_free);
> head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
>
> - execute_commands_loop(commands, si);
> + if (use_atomic)
> + execute_commands_atomic(commands, si);
> + else
> + execute_commands_non_atomic(commands, si);
>
> check_shallow_bugs(commands, si);
> }
> --
> 2.2.1.62.g3f15098