diff options
author | Lars Schneider <larsxschneider@gmail.com> | 2015-11-19 09:58:08 +0100 |
---|---|---|
committer | Jeff King <peff@peff.net> | 2015-11-20 08:02:06 -0500 |
commit | 23aee4199a69fae861f9d173ee0ef1c2a7fab0d5 (patch) | |
tree | 6be3467d0ff4dc6b985e2ceb0a5eaa2a6984bce9 /t | |
parent | 0c83680e9c047170614fb08ef222ea4f460e514d (diff) | |
download | git-23aee4199a69fae861f9d173ee0ef1c2a7fab0d5.tar.gz |
git-p4: retry kill/cleanup operations in tests with timeout
In rare cases kill/cleanup operations in tests fail. Retry these
operations with a timeout to make the test less flaky.
Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Diffstat (limited to 't')
-rw-r--r-- | t/lib-git-p4.sh | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh index 75482254a3..3c9ad9adcf 100644 --- a/t/lib-git-p4.sh +++ b/t/lib-git-p4.sh @@ -6,6 +6,10 @@ # a subdirectory called "$git" TEST_NO_CREATE_REPO=NoThanks +# Some operations require multiple attempts to be successful. Define +# here the maximal retry timeout in seconds. +RETRY_TIMEOUT=60 + . ./test-lib.sh if ! test_have_prereq PYTHON @@ -36,6 +40,15 @@ native_path() { echo "$path" } +# On Solaris the 'date +%s' function is not supported and therefore we +# need this replacement. +# Attention: This function is not safe again against time offset updates +# at runtime (e.g. via NTP). The 'clock_gettime(CLOCK_MONOTONIC)' +# function could fix that but it is not in Python until 3.3. +time_in_seconds() { + python -c 'import time; print int(time.time())' +} + # Try to pick a unique port: guess a large number, then hope # no more than one of each test is running. # @@ -121,22 +134,35 @@ p4_add_user() { EOF } +retry_until_success() { + timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT)) + until "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout + do + sleep 1 + 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") - # it had better exist for the first kill - kill $pid && - for i in 1 2 3 4 5 ; do - kill $pid >/dev/null 2>&1 || break - sleep 1 - done && + 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" } cleanup_git() { - rm -rf "$git" && - mkdir "$git" + retry_until_success rm -r "$git" + test_must_fail test -d "$git" && + retry_until_success mkdir "$git" } marshal_dump() { |