All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Felipe Contreras <felipe.contreras@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 5/5] transport-helper: fix sync issue on crashes
Date: Mon, 14 Apr 2014 14:25:38 -0700	[thread overview]
Message-ID: <xmqq38hfmwml.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: 1397334812-12215-6-git-send-email-felipe.contreras@gmail.com

Felipe Contreras <felipe.contreras@gmail.com> writes:

> When a remote helper crashes while pushing we should revert back to the
> state before the push, however, it's possible that `git fast-export`
> already finished its job, and therefore has exported the marks already.
>
> This creates a synchronization problem because from that moment on
> `git fast-{import,export}` will have marks that the remote helper is not
> aware of and all further commands fail (if those marks are referenced).
>
> The fix is to tell `git fast-export` to export to a temporary file, and
> only after the remote helper has finishes successfully, move to the
> final destination.
>
> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> ---

This seems to be based on a somewhat older codebase; I tried to be
careful while adjusting the patch to the current codebase, but
please give it an eyeball to see if I didn't make any silly mistake
when I push today's integration result out in a few hours.

Thanks.

>  t/t5801-remote-helpers.sh | 17 ++++++++++++++++-
>  transport-helper.c        | 13 +++++++++++--
>  2 files changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
> index 613f69a..cf7fd43 100755
> --- a/t/t5801-remote-helpers.sh
> +++ b/t/t5801-remote-helpers.sh
> @@ -207,6 +207,17 @@ test_expect_success 'push update refs failure' '
>  	)
>  '
>  
> +clean_mark () {
> +	cut -f 2 -d ' ' $1 | git cat-file --batch-check | grep commit | sort > $(basename $1)
> +}
> +
> +cmp_marks () {
> +	test_when_finished "rm -rf git.marks testgit.marks" &&
> +	clean_mark .git/testgit/$1/git.marks &&
> +	clean_mark .git/testgit/$1/testgit.marks &&
> +	test_cmp git.marks testgit.marks
> +}
> +
>  test_expect_success 'proper failure checks for fetching' '
>  	(GIT_REMOTE_TESTGIT_FAILURE=1 &&
>  	export GIT_REMOTE_TESTGIT_FAILURE &&
> @@ -221,7 +232,11 @@ test_expect_success 'proper failure checks for pushing' '
>  	(GIT_REMOTE_TESTGIT_FAILURE=1 &&
>  	export GIT_REMOTE_TESTGIT_FAILURE &&
>  	cd local &&
> -	test_must_fail git push --all
> +	git checkout -b crash master &&
> +	echo crash >> file &&
> +	git commit -a -m crash &&
> +	test_must_fail git push --all &&
> +	cmp_marks origin
>  	)
>  '
>  
> diff --git a/transport-helper.c b/transport-helper.c
> index 2747f98..090c863 100644
> --- a/transport-helper.c
> +++ b/transport-helper.c
> @@ -434,7 +434,7 @@ static int get_exporter(struct transport *transport,
>  	fastexport->argv[argc++] = data->signed_tags ?
>  		"--signed-tags=verbatim" : "--signed-tags=warn-strip";
>  	if (data->export_marks) {
> -		strbuf_addf(&tmp, "--export-marks=%s", data->export_marks);
> +		strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
>  		fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
>  	}
>  	if (data->import_marks) {
> @@ -901,7 +901,16 @@ static int push_refs_with_export(struct transport *transport,
>  
>  	if (finish_command(&exporter))
>  		die("Error while running fast-export");
> -	return push_update_refs_status(data, remote_refs);
> +	if (push_update_refs_status(data, remote_refs))
> +		return 1;
> +
> +	if (data->export_marks) {
> +		strbuf_addf(&buf, "%s.tmp", data->export_marks);
> +		rename(buf.buf, data->export_marks);
> +		strbuf_release(&buf);
> +	}
> +
> +	return 0;
>  }
>  
>  static int push_refs(struct transport *transport,

  reply	other threads:[~2014-04-14 21:25 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-12 20:33 [PATCH 0/5] transport-helper: serious crash fix Felipe Contreras
2014-04-12 20:33 ` [PATCH 1/5] transport-helper: remove barely used xchgline() Felipe Contreras
2014-04-12 20:33 ` [PATCH 2/5] remote-helpers: make recvline return an error Felipe Contreras
2014-04-12 20:33 ` [PATCH 3/5] transport-helper: propagate recvline() error pushing Felipe Contreras
2014-04-12 20:33 ` [PATCH 4/5] transport-helper: trivial cleanup Felipe Contreras
2014-04-14 21:14   ` Junio C Hamano
2014-04-12 20:33 ` [PATCH 5/5] transport-helper: fix sync issue on crashes Felipe Contreras
2014-04-14 21:25   ` Junio C Hamano [this message]
2014-04-15 21:28 ` [PATCH 0/5] transport-helper: serious crash fix Junio C Hamano
2014-04-19  7:00 ` [PATCH 0/5] fc/transport-helper-sync-error-fix rebased Junio C Hamano
2014-04-19  7:00   ` [PATCH 1/5] transport-helper: remove barely used xchgline() Junio C Hamano
2014-04-19  7:00   ` [PATCH 2/5] remote-helpers: make recvline return an error Junio C Hamano
2014-04-19  7:00   ` [PATCH 3/5] transport-helper: propagate recvline() error pushing Junio C Hamano
2014-04-19  7:00   ` [PATCH 4/5] transport-helper: trivial cleanup Junio C Hamano
2014-04-19  7:00   ` [PATCH 5/5] transport-helper: fix sync issue on crashes Junio C Hamano
2014-04-20 18:36   ` [PATCH 0/5] fc/transport-helper-sync-error-fix rebased Felipe Contreras
2014-04-20 21:10     ` Junio C Hamano
2014-04-20 21:12       ` Felipe Contreras
2014-04-20 21:52         ` Junio C Hamano
2014-04-20 21:54           ` Felipe Contreras

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=xmqq38hfmwml.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    /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.