From: "SZEDER Gábor" <szeder.dev@gmail.com>
To: git@vger.kernel.org
Cc: "Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
"Jeff King" <peff@peff.net>, "Junio C Hamano" <gitster@pobox.com>,
"Luke Diamand" <luke@diamand.org>,
"Lars Schneider" <larsxschneider@gmail.com>,
"SZEDER Gábor" <szeder.dev@gmail.com>
Subject: [PATCH 08/11] git p4 test: clean up the p4d cleanup functions
Date: Wed, 13 Mar 2019 13:24:16 +0100 [thread overview]
Message-ID: <20190313122419.2210-9-szeder.dev@gmail.com> (raw)
In-Reply-To: <20190313122419.2210-1-szeder.dev@gmail.com>
Confusingly, the 'git p4' tests used two cleanup functions:
- 'kill_p4d' was run in the last test before 'test_done', and it not
only killed 'p4d', but it killed the watchdog process, and cleaned
up after 'p4d' as well by removing all directories used by the P4
daemon and client.
This cleanup is not necessary right before 'test_done', because
the whole trash directory is about to get removed anyway, but it
is necessary in 't9801-git-p4-branch.sh', which uses 'kill_p4d' to
stop 'p4d' before re-starting it in the middle of the test script.
- 'cleanup' was run in the trap on EXIT, and it killed 'p4d', but,
it didn't kill the watchdog process, and, contrarily to its name,
didn't perform any cleanup whatsoever.
Make it clearer what's going on by renaming and simplifying the
cleanup functions, so in the end we'll have:
- 'stop_p4d_and_watchdog' replaces 'cleanup' as it will try to live
up to its name and stop both the 'p4d' and the watchdog processes,
and as the sole function registered with 'test_atexit' it will be
responsible for no leaving any stray processes behind after 'git p4'
tests were finished or interrupted.
- 'stop_and_cleanup_p4d' replaces 'kill_p4d' as it will stop 'p4d'
(and the watchdog) and remove all directories used by the P4
daemon and cliean, so it can be used mid-script to stop and then
re-start 'p4d'.
Note that while 'cleanup' sent a single SIGKILL to 'p4d', 'kill_p4d'
was quite brutal, as it first sent SIGTERM to the daemon repeatedly,
either until its pid disappeared or until a given timeout was up, and
then it sent SIGKILL repeatedly, for good measure. This is overkill
(pardon the pun): a single SIGKILL should be able to take down any
process in a sensible state, and if a process were to somehow end up
stuck in the dreaded uninterruptible sleep state then even repeated
SIGKILLs won't bring immediate help. So ditch all the repeated
SIGTERM/SIGKILL parts, and use a single SIGKILL to stop 'p4d', and
make sure that there are no races between asynchron signal delivery
and subsequent restart of 'p4d' by waiting for it to die.
With this change the 'retry_until_fail' helper has no callers left,
remove it.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---
t/lib-git-p4.sh | 36 ++++++++++--------------------------
t/t9801-git-p4-branch.sh | 4 ++--
2 files changed, 12 insertions(+), 28 deletions(-)
diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh
index 958e33b77e..b5cb5075c2 100644
--- a/t/lib-git-p4.sh
+++ b/t/lib-git-p4.sh
@@ -67,12 +67,8 @@ cli="$TRASH_DIRECTORY/cli"
git="$TRASH_DIRECTORY/git"
pidfile="$TRASH_DIRECTORY/p4d.pid"
-# Sometimes "prove" seems to hang on exit because p4d is still running
-cleanup () {
- if test -f "$pidfile"
- then
- kill -9 $(cat "$pidfile") 2>/dev/null && exit 255
- fi
+stop_p4d_and_watchdog () {
+ kill -9 $p4d_pid $watchdog_pid
}
# git p4 submit generates a temp file, which will
@@ -87,7 +83,7 @@ start_p4d () {
# Don't register and then run the same atexit handlers several times.
if test -z "$registered_stop_p4d_atexit_handler"
then
- test_atexit 'kill_p4d; cleanup'
+ test_atexit 'stop_p4d_and_watchdog'
registered_stop_p4d_atexit_handler=AlreadyDone
fi
@@ -100,6 +96,7 @@ start_p4d () {
echo $! >"$pidfile"
}
) &&
+ p4d_pid=$(cat "$pidfile")
# This gives p4d a long time to start up, as it can be
# quite slow depending on the machine. Set this environment
@@ -107,14 +104,13 @@ start_p4d () {
# an automated test setup. If the p4d process dies, that
# will be caught with the "kill -0" check below.
i=${P4D_START_PATIENCE:-300}
- pid=$(cat "$pidfile")
timeout=$(($(time_in_seconds) + $P4D_TIMEOUT))
while true
do
if test $(time_in_seconds) -gt $timeout
then
- kill -9 $pid
+ kill -9 $p4d_pid
exit 1
fi
sleep 1
@@ -131,7 +127,7 @@ start_p4d () {
break
fi
# fail if p4d died
- kill -0 $pid 2>/dev/null || break
+ kill -0 $p4d_pid 2>/dev/null || break
echo waiting for p4d to start
sleep 1
i=$(( $i - 1 ))
@@ -178,22 +174,10 @@ retry_until_success () {
done
}
-retry_until_fail () {
- timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
- until ! "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
- do
- sleep 1
- done
-}
-
-kill_p4d () {
- pid=$(cat "$pidfile")
- retry_until_fail kill $pid
- retry_until_fail kill -9 $pid
- # complain if it would not die
- test_must_fail kill $pid >/dev/null 2>&1 &&
- rm -rf "$db" "$cli" "$pidfile" &&
- retry_until_fail kill -9 $watchdog_pid
+stop_and_cleanup_p4d () {
+ kill -9 $p4d_pid $watchdog_pid
+ wait $p4d_pid
+ rm -rf "$db" "$cli" "$pidfile"
}
cleanup_git () {
diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh
index 50013132c8..38d6b9043b 100755
--- a/t/t9801-git-p4-branch.sh
+++ b/t/t9801-git-p4-branch.sh
@@ -151,7 +151,7 @@ test_expect_success 'import depot, branch detection, branchList branch definitio
'
test_expect_success 'restart p4d' '
- kill_p4d &&
+ stop_and_cleanup_p4d &&
start_p4d
'
@@ -505,7 +505,7 @@ test_expect_success 'use-client-spec detect-branches skips files in branches' '
'
test_expect_success 'restart p4d' '
- kill_p4d &&
+ stop_and_cleanup_p4d &&
start_p4d
'
--
2.21.0.499.g4d310c7a8e.dirty
next prev parent reply other threads:[~2019-03-13 12:25 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-13 12:24 [PATCH 00/11] tests: introduce 'test_atexit' SZEDER Gábor
2019-03-13 12:24 ` [PATCH 01/11] test-lib: fix interrupt handling with 'dash' and '--verbose-log -x' SZEDER Gábor
2019-03-14 2:18 ` Junio C Hamano
2019-03-14 14:50 ` SZEDER Gábor
2019-03-13 12:24 ` [PATCH 02/11] t/lib-git-daemon: make sure to kill the 'git-daemon' process SZEDER Gábor
2019-03-14 2:35 ` Junio C Hamano
2019-03-13 12:24 ` [PATCH 03/11] test-lib: introduce 'test_atexit' SZEDER Gábor
2019-03-14 3:21 ` Junio C Hamano
2019-03-14 17:40 ` SZEDER Gábor
2019-03-18 1:50 ` Junio C Hamano
2019-03-13 12:24 ` [PATCH 04/11] git-daemon: use 'test_atexit` to stop 'git-daemon' SZEDER Gábor
2019-03-13 12:24 ` [PATCH 05/11] tests: use 'test_atexit' to stop httpd SZEDER Gábor
2019-03-14 3:28 ` Junio C Hamano
2019-03-14 4:34 ` Junio C Hamano
2019-03-14 15:19 ` SZEDER Gábor
2019-03-13 12:24 ` [PATCH 06/11] t0301-credential-cache: use 'test_atexit' to stop the credentials helper SZEDER Gábor
2019-03-13 12:24 ` [PATCH 07/11] git p4 test: use 'test_atexit' to kill p4d and the watchdog process SZEDER Gábor
2019-03-13 12:24 ` SZEDER Gábor [this message]
2019-03-13 12:24 ` [PATCH 09/11] git p4 test: simplify timeout handling SZEDER Gábor
2019-03-13 12:24 ` [PATCH 10/11] git p4 test: disable '-x' tracing in the p4d watchdog loop SZEDER Gábor
2019-03-13 12:24 ` [PATCH 11/11] t9811-git-p4-label-import: fix pipeline negation SZEDER Gábor
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=20190313122419.2210-9-szeder.dev@gmail.com \
--to=szeder.dev@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=larsxschneider@gmail.com \
--cc=luke@diamand.org \
--cc=peff@peff.net \
/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.