git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: Stefan BellerNext: Stefan Beller
Message 21 of 24 in “[PATCHv8 0/9] atomic pushes”
  1. Stefan BellerDec 30, 2014
  2. 1/9 receive-pack.c: add documentation for atomic push supportStefan Beller, Dec 30, 2014
  3. Eric SunshineDec 30, 2014
  4. Stefan BellerDec 30, 2014
  5. Eric SunshineDec 30, 2014
  6. 2/9 send-pack: rename ref_update_to_be_sent to check_to_send_updateStefan Beller, Dec 30, 2014
  7. 3/9 send-pack.c: add --atomic command line argumentStefan Beller, Dec 30, 2014
  8. 4/9 receive-pack.c: simplify execute_commandsStefan Beller, Dec 30, 2014
  9. Eric SunshineDec 30, 2014
  10. Stefan BellerDec 30, 2014
  11. Stefan BellerDec 30, 2014
  12. Eric SunshineDec 30, 2014
  13. Eric SunshineDec 30, 2014
  14. Stefan BellerDec 30, 2014
  15. Eric SunshineDec 30, 2014
  16. 5/9 receive-pack.c: move transaction handling in a central placeStefan Beller, Dec 30, 2014
  17. Eric SunshineDec 30, 2014
  18. Stefan BellerDec 30, 2014
  19. Eric SunshineDec 30, 2014
  20. 6/9 receive-pack.c: add execute_commands_atomic functionStefan Beller, Dec 30, 2014
  21. Eric SunshineDec 30, 2014
  22. 7/9 receive-pack.c: enable atomic push protocol supportStefan Beller, Dec 30, 2014
  23. 8/9 push.c: add an --atomic argumentStefan Beller, Dec 30, 2014
  24. 9/9 t5543-atomic-push.sh: add basic tests for atomic pushesStefan Beller, Dec 30, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.