From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Adam Dinwoodie <adam@dinwoodie.org>
Cc: "Jeff Hostetler via GitGitGadget" <gitgitgadget@gmail.com>,
git@vger.kernel.org, "Eric Sunshine" <sunshine@sunshineco.com>,
"Taylor Blau" <me@ttaylorr.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Jeff Hostetler" <git@jeffhostetler.com>,
"Carlo Arenas" <carenas@gmail.com>,
"Jeff Hostetler" <jeffhost@microsoft.com>
Subject: Re: [PATCH v2 7/7] t/helper/simple-ipc: convert test-simple-ipc to use start_bg_command
Date: Tue, 9 Nov 2021 00:59:34 +0100 (CET) [thread overview]
Message-ID: <nycvar.QRO.7.76.6.2111090051530.54@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <20211104194619.GA12886@dinwoodie.org>
Hi Adam,
On Thu, 4 Nov 2021, Adam Dinwoodie wrote:
> On Monday 20 September 2021 at 03:36 pm +0000, Jeff Hostetler via GitGitGadget wrote:
> > From: Jeff Hostetler <jeffhost@microsoft.com>
> >
> > Convert test helper to use `start_bg_command()` when spawning a server
> > daemon in the background rather than blocks of platform-specific code.
> >
> > Also, while here, remove _() translation around error messages since
> > this is a test helper and not Git code.
>
> As part of testing the v2.34.0-rc0 release candidate on Cygwin, I've
> found this commit -- 05881a6fc9 (t/helper/simple-ipc: convert
> test-simple-ipc to use start_bg_command, 2021-09-20), according to my
> bisecting -- is causing t0052.1 to fail on 32-bit Cygwin. Somehow this
> is only affecting the 32-bit Cygwin build; the 64-bit build is working
> as expected.
>
> Specifically, the failure I'm seeing is as below:
>
> ```
> $ GIT_TRACE=1 sh t0052-simple-ipc.sh -vix
> trace: built-in: git init '/cygdrive/d/git-32/t/trash directory.t0052-simple-ipc'
> Initialized empty Git repository in /cygdrive/d/git-32/t/trash directory.t0052-simple-ipc/.git/
> expecting success of 0052.1 'start simple command server':
> test_atexit stop_simple_IPC_server &&
> test-tool simple-ipc start-daemon --threads=8 &&
> test-tool simple-ipc is-active
>
> ++ test_atexit stop_simple_IPC_server
> ++ test 0 = 0
> ++ test_atexit_cleanup='{ stop_simple_IPC_server
> } && (exit "$eval_ret"); eval_ret=$?; :'
> ++ test-tool simple-ipc start-daemon --threads=8
> trace: run_command: test-tool simple-ipc run-daemon --name=ipc-test --threads=8
> error: daemon failed to start
> error: last command exited with $?=1
> not ok 1 - start simple command server
> #
> # test_atexit stop_simple_IPC_server &&
> # test-tool simple-ipc start-daemon --threads=8 &&
> # test-tool simple-ipc is-active
> #
> ++ stop_simple_IPC_server
> ++ test-tool simple-ipc stop-daemon
> ++ exit 1
> ++ eval_ret=1
> ++ :
> ```
>
> I've had a look at the code changes, and cannot work out what might be
> being handled differently in 32-bit and 64-bit Cygwin environments.
> Given the Cygwin project is considering dropping support for 32-bit
> Cygwin anyway, it might not be worth doing anything about this. But I
> thought it worth reporting in case there's something obvious to folk
> more familiar with this code.
I had a look at this and could reproduce... partially. I only managed to
make it fail every once in a while.
Digging deeper, it turns out that the `lstat()` call in
`ipc_get_active_state()` does not receive an `st_mode` indicating a
socket, but rather a file (in my tests, it was usually 0100644, but
sometimes even 0100755).
The reason is, of course, that Cygwin _emulates_ Unix sockets. What is in
the file system is just a special file, it is marked with the `system` bit
(which only exists on Windows), and its contents start with the tell-tale
`!<socket>`.
And as you might have guessed, there is a race going on between Cygwin
writing that file _and_ flipping that `system` bit, and Git trying to
access the Unix socket and encountering an unexpected file.
Now, why this only happens in your 32-bit setup, I have no idea.
In my tests, the following patch works around the issue. Could I ask you
to test it in your environment?
-- snip --
diff --git a/compat/simple-ipc/ipc-unix-socket.c
b/compat/simple-ipc/ipc-unix-socket.c
index 4e28857a0a..1c591b2adf 100644
--- a/compat/simple-ipc/ipc-unix-socket.c
+++ b/compat/simple-ipc/ipc-unix-socket.c
@@ -36,6 +36,23 @@ enum ipc_active_state ipc_get_active_state(const char
*path)
}
/* also complain if a plain file is in the way */
+#ifdef __CYGWIN__
+ {
+ static const int delay[] = { 1, 10, 20, 40, -1 };
+ int i;
+
+ for (i = 0; S_ISREG(st.st_mode) && delay[i] > 0; i++) {
+ /*
+ * Cygwin might still be in the process of marking the
+ * underlying file as a system file.
+ */
+ sleep_millisec(delay[i]);
+ if (lstat(path, &st) == -1)
+ return IPC_STATE__INVALID_PATH;
+ }
+ }
+#endif
+
if ((st.st_mode & S_IFMT) != S_IFSOCK)
return IPC_STATE__INVALID_PATH;
-- snap --
FWIW it looks as if the loop might be a bit of an overkill, as I could not
get the code to need more than a single one-millisecond sleep, but it's
probably safer to just keep the delay loop in place as-is.
Ciao,
Dscho
next prev parent reply other threads:[~2021-11-08 23:59 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-15 20:36 [PATCH 0/7] Builtin FSMonitor Part 1 Jeff Hostetler via GitGitGadget
2021-09-15 20:36 ` [PATCH 1/7] trace2: fix memory leak of thread name Jeff Hostetler via GitGitGadget
2021-09-15 21:01 ` Junio C Hamano
2021-09-16 4:19 ` Taylor Blau
2021-09-16 5:35 ` Ævar Arnfjörð Bjarmason
2021-09-16 5:43 ` Taylor Blau
2021-09-16 8:01 ` Ævar Arnfjörð Bjarmason
2021-09-16 15:35 ` Jeff Hostetler
2021-09-16 15:47 ` Ævar Arnfjörð Bjarmason
2021-09-16 19:13 ` Junio C Hamano
2021-09-15 20:36 ` [PATCH 2/7] simple-ipc: preparations for supporting binary messages Jeff Hostetler via GitGitGadget
2021-09-15 20:43 ` Eric Sunshine
2021-09-17 16:52 ` Jeff Hostetler
2021-09-15 20:36 ` [PATCH 3/7] simple-ipc: move definition of ipc_active_state outside of ifdef Jeff Hostetler via GitGitGadget
2021-09-15 21:06 ` Junio C Hamano
2021-09-17 16:58 ` Jeff Hostetler
2021-09-18 7:03 ` Carlo Arenas
2021-09-20 15:51 ` Junio C Hamano
2021-09-15 20:36 ` [PATCH 4/7] simple-ipc/ipc-win32: add trace2 debugging Jeff Hostetler via GitGitGadget
2021-09-16 5:40 ` Ævar Arnfjörð Bjarmason
2021-09-17 17:27 ` Jeff Hostetler
2021-09-15 20:36 ` [PATCH 5/7] simple-ipc/ipc-win32: add Windows ACL to named pipe Jeff Hostetler via GitGitGadget
2021-09-16 5:47 ` Ævar Arnfjörð Bjarmason
2021-09-17 18:10 ` Jeff Hostetler
2021-09-17 19:14 ` Ævar Arnfjörð Bjarmason
2021-09-15 20:36 ` [PATCH 6/7] run-command: create start_bg_command Jeff Hostetler via GitGitGadget
2021-09-16 4:53 ` Taylor Blau
2021-09-16 4:58 ` Taylor Blau
2021-09-16 5:56 ` Ævar Arnfjörð Bjarmason
2021-09-15 20:36 ` [PATCH 7/7] t/helper/simple-ipc: convert test-simple-ipc to use start_bg_command Jeff Hostetler via GitGitGadget
2021-09-16 5:06 ` Taylor Blau
2021-09-17 19:41 ` Jeff Hostetler
2021-09-18 8:59 ` Ævar Arnfjörð Bjarmason
2021-09-16 5:55 ` Ævar Arnfjörð Bjarmason
2021-09-20 15:36 ` [PATCH v2 0/7] Builtin FSMonitor Part 1 Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 1/7] trace2: add trace2_child_ready() to report on background children Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 2/7] simple-ipc: preparations for supporting binary messages Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 3/7] simple-ipc: move definition of ipc_active_state outside of ifdef Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 4/7] simple-ipc/ipc-win32: add trace2 debugging Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 5/7] simple-ipc/ipc-win32: add Windows ACL to named pipe Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 6/7] run-command: create start_bg_command Jeff Hostetler via GitGitGadget
2021-09-20 15:36 ` [PATCH v2 7/7] t/helper/simple-ipc: convert test-simple-ipc to use start_bg_command Jeff Hostetler via GitGitGadget
2021-09-23 15:03 ` Ævar Arnfjörð Bjarmason
2021-09-23 17:58 ` Jeff Hostetler
2021-09-23 18:37 ` Junio C Hamano
2021-11-04 19:46 ` Adam Dinwoodie
2021-11-04 20:14 ` Ramsay Jones
2021-11-08 14:58 ` Jeff Hostetler
2021-11-08 23:59 ` Johannes Schindelin [this message]
2021-11-09 18:53 ` Ramsay Jones
2021-11-09 23:01 ` Johannes Schindelin
2021-11-09 23:34 ` Junio C Hamano
2021-11-10 12:27 ` Johannes Schindelin
2021-11-12 8:56 ` Adam Dinwoodie
2021-11-12 16:01 ` Junio C Hamano
2021-11-12 21:33 ` Adam Dinwoodie
2021-11-16 10:56 ` Johannes Schindelin
2021-11-16 11:02 ` Johannes Schindelin
2021-11-13 19:11 ` Ramsay Jones
2021-11-14 19:34 ` Ramsay Jones
2021-11-14 20:10 ` Adam Dinwoodie
2021-09-23 14:33 ` [PATCH v2 0/7] Builtin FSMonitor Part 1 Ævar Arnfjörð Bjarmason
2021-09-23 17:12 ` Jeff Hostetler
2021-09-23 20:47 ` Ævar Arnfjörð Bjarmason
2021-09-27 13:37 ` Jeff Hostetler
2021-09-23 17:51 ` Taylor Blau
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=nycvar.QRO.7.76.6.2111090051530.54@tvgsbejvaqbjf.bet \
--to=johannes.schindelin@gmx.de \
--cc=adam@dinwoodie.org \
--cc=avarab@gmail.com \
--cc=carenas@gmail.com \
--cc=git@jeffhostetler.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=jeffhost@microsoft.com \
--cc=me@ttaylorr.com \
--cc=sunshine@sunshineco.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).