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

Re: [PATCHv12 08/10] send-pack.c: add --atomic command line argument

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 12, 2015, 21:57 UTC
Message-ID
<xmqq8uh77jct.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1420687404-13997-9-git-send-email-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
Show 21 quoted lines
> +static int atomic_push_failure(struct send_pack_args *args,
> +			       struct ref *remote_refs,
> +			       struct ref *failing_ref)
> +{
> +	struct ref *ref;
> +	/* Mark other refs as failed */
> +	for (ref = remote_refs; ref; ref = ref->next) {
> +		if (!ref->peer_ref && !args->send_mirror)
> +			continue;
> +
> +		switch (ref->status) {
> +		case REF_STATUS_EXPECTING_REPORT:
> +			ref->status = REF_STATUS_ATOMIC_PUSH_FAILED;
> +			continue;
> +		default:
> +			; /* do nothing */
> +		}
> +	}
> +	return error("atomic push failed for ref %s. status: %d\n",
> +		     failing_ref->name, failing_ref->status);
> +}

Given remote_refs, this will mark all refs that are still in the "expecting" state as "failed".

Show 21 quoted lines
> @@ -363,9 +396,21 @@ int send_pack(struct send_pack_args *args,
>  	 * the pack data.
>  	 */
>  	for (ref = remote_refs; ref; ref = ref->next) {
> -		if (check_to_send_update(ref, args) < 0)
> +		switch (check_to_send_update(ref, args)) {
> +		case 0: /* no error */
> +			break;
> +		case CHECK_REF_STATUS_REJECTED:
> +			/*
> +			 * When we know the server would reject a ref update if
> +			 * we were to send it and we're trying to send the refs
> +			 * atomically, abort the whole operation.
> +			 */
> +			if (use_atomic)
> +				return atomic_push_failure(args, remote_refs, ref);
> +			/* Fallthrough for non atomic case. */
> +		default:
>  			continue;
> -
> +		}

And this loop stops when it sees one that would certainly get rejected, letting the other function mark "expecting" ones as "would fail".

We could have skipped refs that are OK (e.g. REF_STATUS_UPTODATE) before we saw the first rejection, but it is OK not to go back and mark them as "would fail", because the other side will not be seeing our attempt to update these refs anyway.

OK, it makes sense to me.
Previous: Stefan BellerNext: Stefan Beller
Message 14 of 17 in “[PATCHv12 00/10] atomic pushes”
  1. Stefan BellerJan 8, 2015
  2. 01/10 receive-pack.c: shorten the execute_commands loop over all commandsStefan Beller, Jan 8, 2015
  3. 02/10 receive-pack.c: die instead of error in case of possible future bugStefan Beller, Jan 8, 2015
  4. 03/10 receive-pack.c: move iterating over all commands outside execute_commandsStefan Beller, Jan 8, 2015
  5. 04/10 receive-pack.c: move transaction handling in a central placeStefan Beller, Jan 8, 2015
  6. 05/10 receive-pack.c: add execute_commands_atomic functionStefan Beller, Jan 8, 2015
  7. 06/10 receive-pack.c: negotiate atomic push supportStefan Beller, Jan 8, 2015
  8. Junio C HamanoJan 8, 2015
  9. Eric SunshineJan 12, 2015
  10. Stefan BellerJan 12, 2015
  11. Junio C HamanoJan 13, 2015
  12. 07/10 send-pack: rename ref_update_to_be_sent to check_to_send_updateStefan Beller, Jan 8, 2015
  13. 08/10 send-pack.c: add --atomic command line argumentStefan Beller, Jan 8, 2015
  14. Junio C HamanoJan 12, 2015
  15. 09/10 push.c: add an --atomic argumentStefan Beller, Jan 8, 2015
  16. 10/10 t5543-atomic-push.sh: add basic tests for atomic pushesStefan Beller, Jan 8, 2015
  17. Eric SunshineJan 12, 2015

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.