git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pete Wyckoff <pw@padd.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Stefano Lattarini <stefano.lattarini@gmail.com>,
	Sverre Rabbelier <srabbelier@gmail.com>,
	git@vger.kernel.org, Clemens Buchacher <drizzd@aon.at>
Subject: [PATCHv2] git-remote-testgit: fix race when spawning fast-import
Date: Sun, 22 Apr 2012 16:30:58 -0400	[thread overview]
Message-ID: <20120422203058.GA17290@padd.com> (raw)
In-Reply-To: <xmqqty0cxtcd.fsf@junio.mtv.corp.google.com>

Test "pushing to local repo" in t5800-remote-helpers can hang
due to a race condition in git-remote-testgit.  Fix it by
setting stdin to unbuffered.

On the writer side, "git push" invokes push_refs_with_export(),
which sends to stdout the command "export\n" and immediately
starts up "git fast-export".  The latter writes its output stream
to the same stdout.

On the reader side, remote helper "git-remote-testgit" reads from
stdin to get its next command.  It uses getc() to read characters
from libc up until \n.  Libc has buffered a potentially much
larger chunk of stdin.  When it sees the "export\n" command, it
forks "git fast-import" to read the stream.

If fast-export finishes before git fast-import starts, the
fast-export output can end up in libc's buffer in
git-remote-testgit, rather than in git fast-import.  The latter
hangs indefinitely on a now-empty stdin.

Signed-off-by: Pete Wyckoff <pw@padd.com>
---
gitster@pobox.com wrote on Sat, 21 Apr 2012 21:50 -0700:
> If I understand your explanation correctly, the primary purpose of the
> remote-testgit is to test the parts of the system that talk to remote
> helpers that are used in production in the t/t5800 script, and this
> "sleep" is to make it easier to trigger the particular bug you fixed 
> in *this* script.  The bug is _not_ in the parts of the system being
> tested, but is in this test scaffolding.

Indeed.  I tried to make that more obvious in the commit message.

> If that is the case, then it should not be enabled unconditionally.
> When somebody wants to see if remote-testgit was broken again (perhaps
> after observing occassional hangs), the environment should be set when
> running the test, but not in t5800.

Clemens suggested disabling the test by default, as I've done
here.  I think it would be okay to remove it entirely, too.

		-- Pete

 git-remote-testgit.py     |    7 +++++++
 t/t5800-remote-helpers.sh |   14 ++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/git-remote-testgit.py b/git-remote-testgit.py
index 3dc4851..5f3ebd2 100644
--- a/git-remote-testgit.py
+++ b/git-remote-testgit.py
@@ -22,6 +22,7 @@ except ImportError:
     _digest = sha.new
 import sys
 import os
+import time
 sys.path.insert(0, os.getenv("GITPYTHONLIB","."))
 
 from git_remote_helpers.util import die, debug, warn
@@ -204,6 +205,11 @@ def read_one_line(repo):
     """Reads and processes one command.
     """
 
+    sleepy = os.environ.get("GIT_REMOTE_TESTGIT_SLEEPY")
+    if sleepy:
+        debug("Sleeping %d sec before readline" % int(sleepy))
+        time.sleep(int(sleepy))
+
     line = sys.stdin.readline()
 
     cmdline = line
@@ -258,6 +264,7 @@ def main(args):
 
     more = True
 
+    sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', 0)
     while (more):
         more = read_one_line(repo)
 
diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh
index 1c62001..85a8042 100755
--- a/t/t5800-remote-helpers.sh
+++ b/t/t5800-remote-helpers.sh
@@ -72,6 +72,20 @@ test_expect_success 'pushing to local repo' '
 	compare_refs localclone HEAD server HEAD
 '
 
+# Generally, skip this test.  It demonstrates a now-fixed
+# race in git-remote-testgit, but is too slow to leave in
+# for general use.
+test_expect_success DEBUG_TESTGIT_RACE 'racily pushing to local repo' '
+	cp -a server server2 &&
+	git clone "testgit::${PWD}/server2" localclone2 &&
+	test_when_finished "rm -rf server2 localclone2" &&
+	(cd localclone2 &&
+	echo content >>file &&
+	git commit -a -m three &&
+	GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
+	compare_refs localclone2 HEAD server2 HEAD
+'
+
 test_expect_success 'synch with changes from localclone' '
 	(cd clone &&
 	 git pull)
-- 
1.7.10.57.g437cb.dirty

  reply	other threads:[~2012-04-22 20:31 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-14  9:01 master: t5800-remote-helpers.sh hangs on test "pulling from remote remote" Stefano Lattarini
2012-04-14 20:14 ` Clemens Buchacher
2012-04-15  0:00   ` Stefano Lattarini
2012-04-15  1:11     ` Clemens Buchacher
2012-04-15  8:08       ` Stefano Lattarini
2012-04-15 10:59         ` Clemens Buchacher
2012-04-15 11:18           ` Stefano Lattarini
2012-04-15 11:45             ` Clemens Buchacher
2012-04-15 11:58               ` Stefano Lattarini
2012-04-15 12:09                 ` Clemens Buchacher
2012-04-15 13:19                   ` Stefano Lattarini
2012-04-15 12:51                 ` Clemens Buchacher
2012-04-17  1:46                   ` Sverre Rabbelier
2012-04-19 23:34                   ` Pete Wyckoff
     [not found]                     ` <4F9145A1.6020201@gmail.com>
2012-04-21 20:15                       ` Pete Wyckoff
2012-04-21 23:35                         ` Clemens Buchacher
2012-04-22  2:17                           ` Pete Wyckoff
2012-04-21 23:45                         ` [PATCH] git-remote-testgit: fix race when spawning fast-import Pete Wyckoff
2012-04-21 23:42                           ` Clemens Buchacher
2012-04-22  2:16                             ` Pete Wyckoff
2012-04-22  9:49                               ` Clemens Buchacher
2012-04-22  4:50                           ` Junio C Hamano
2012-04-22 20:30                             ` Pete Wyckoff [this message]
2012-04-23  2:40                               ` [PATCHv2] " Junio C Hamano
2012-04-23 11:35                                 ` Pete Wyckoff
2012-04-15 11:12       ` master: t5800-remote-helpers.sh hangs on test "pulling from remote remote" Stefano Lattarini

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=20120422203058.GA17290@padd.com \
    --to=pw@padd.com \
    --cc=drizzd@aon.at \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=srabbelier@gmail.com \
    --cc=stefano.lattarini@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).