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
next prev parent 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).