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

Re: [PATCH 6/7] push.c: add an --atomic argument

From
Junio C Hamano <gitster@pobox.com>
Date
Dec 29, 2014, 20:33 UTC
Message-ID
<xmqq7fxayz4u.fsf@gitster.dls.corp.google.com>
In-Reply-To
<549D0B78.402@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
Show 14 quoted lines
> I'd like to discuss the big picture around this feature. I don't think
> that any of these questions are blockers, with the possible exception of
> the question of whether "--atomic" should fall back to non-atomic if the
> server doesn't support atomic pushes.
>
> 1. Should "--atomic" someday become the default?
>
> You seem to imply that "--atomic" might become the default sometime in
> the future. (I realize that this patch series does not propose to change
> the default but let's talk about it anyway.) In the real world, the most
> common reason for an "--atomic" push to fail would be that somebody else
> has pushed to a branch since our last update, resulting in a non-ff
> error. Would I find out about such an error before or after I have
> transferred my objects to the server?

That question is pretty much rhetorical, as certain rejections you cannot fundamentally implement without having the data at hand.

> If I only find out at the end of the transfer, then it could be a pretty
> frustrating experience pushing a lot of references to a server over a
> slow connection.

We'd like to have a long overdue protocol update for fetch and push soonish anyawy (perhaps in the first half of 2015) and part of that should include unified logic for common ancestor negotiation between fetch and push [*1*]. We should be able to ease that with an optimization similar to quickfetch done on the fetch side once that happens.

Show 5 quoted lines
> Even *if* "--atomic" becomes the default, we would certainly want to
> support a "--no-atomic" (or "--non-atomic"?) option to get the old
> behavior. It might be a good idea to add that option now, so that
> forward-looking script writers can start explicitly choosing "--atomic"
> vs. "--no-atomic".

Perhaps. But on the other hand, pushing multiple refs at the same time is a sign that they are related and need to go together. The reason why one but not others fails would be an indication that there is somebody else pushing into the same repository and the pusher and the other party are stepping on each other's toes, which should be resolved primarily by inter-developer communication, not with "--no-atomic" workaround.

Show 14 quoted lines
> 2. Is this an option that users will want to specify via the command line?
>
> For scripts that want to insist on "atomic" updates, it is no problem to
> specify "--atomic" on the command line.
>
> But supposing that "--atomic" is a good default for some people, it
> would be awkward for them to have to specify it on every "git push"
> invocation. It therefore might be nice to have a configuration setting
> to choose whether "--atomic" is the default.
>
> Also (see above) it might be useful to set "--atomic" only for
> particular servers (for example, only for those to which you have a fast
> connection). This suggests that the "atomic/non-atomic" configuration
> should be settable on a per-remote basis.

I think you are hinting to have remote.atomicPush = {yes,no} that is weaker than remote.$nick.atomicPush = {yes,no} or something like that. I agree that would be a good direction to go.

> 3. What should happen if the server doesn't support atomic pushes?

If you asked for atomic push explicitly and if the server cannot support it, push should fail.

If the only reason we are doing atomic is because in some future we flipped the default (i.e. no remote.*.atomicPush or --atomic option from the command line), then it might be OK to continue with a warning.

I however think that the automatic demotion is too much complexity for such a simple option. "Please be atomic if you can but I'd take non-atomic one if you do not want to give me atomic one" that is responded by "I'd do non-atomic then, as you are perfectly happy without" is not very useful---such a pusher should just say "I accept non-atomic", which is what "--no-atomic" is for.

[Footnotes]
*1* Two other big ones are syntax change to have an explicit
    extension packets instead of hiding the capability after NUL,
    and resolving the "who speaks first" issue.
Previous: Stefan BellerNext: Stefan Beller
Message 18 of 20 in “[PATCHv6 0/7] atomic pushes”
  1. Stefan BellerDec 19, 2014
  2. 1/7 receive-pack.c: add protocol support to negotiate atomic-pushStefan Beller, Dec 19, 2014
  3. Eric SunshineDec 22, 2014
  4. Stefan BellerDec 23, 2014
  5. Michael HaggertyDec 24, 2014
  6. Junio C HamanoDec 30, 2014
  7. 2/7 send-pack: Rename ref_update_to_be_sent to check_to_send_updateStefan Beller, Dec 19, 2014
  8. 3/7 send-pack.c: add --atomic command line argumentStefan Beller, Dec 19, 2014
  9. Eric SunshineDec 22, 2014
  10. 4/7 receive-pack.c: receive-pack.c: use a single ref_transaction for atomic pushesStefan Beller, Dec 19, 2014
  11. Eric SunshineDec 23, 2014
  12. 5/7 receive-pack: move execute_commands_non_atomic before execute_commandsStefan Beller, Dec 19, 2014
  13. Junio C HamanoDec 22, 2014
  14. Stefan BellerDec 24, 2014
  15. 6/7 push.c: add an --atomic argumentStefan Beller, Dec 19, 2014
  16. Michael HaggertyDec 26, 2014
  17. Stefan BellerDec 29, 2014
  18. Junio C HamanoDec 29, 2014
  19. 7/7 t5543-atomic-push.sh: add basic tests for atomic pushesStefan Beller, Dec 19, 2014
  20. Junio C HamanoDec 22, 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.