Merge branch 'ls/p4-test-timeouts'
Work around some test flakiness with p4d. * ls/p4-test-timeouts: git-p4: add trap to kill p4d on test exit git-p4: add p4d timeout in tests git-p4: retry kill/cleanup operations in tests with timeoutmaint
						commit
						fa7095e63d
					
				|  | @ -6,6 +6,14 @@ | ||||||
| # a subdirectory called "$git" | # a subdirectory called "$git" | ||||||
| TEST_NO_CREATE_REPO=NoThanks | TEST_NO_CREATE_REPO=NoThanks | ||||||
|  |  | ||||||
|  | # Some operations require multiple attempts to be successful. Define | ||||||
|  | # here the maximal retry timeout in seconds. | ||||||
|  | RETRY_TIMEOUT=60 | ||||||
|  |  | ||||||
|  | # Sometimes p4d seems to hang. Terminate the p4d process automatically after | ||||||
|  | # the defined timeout in seconds. | ||||||
|  | P4D_TIMEOUT=300 | ||||||
|  |  | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| if ! test_have_prereq PYTHON | if ! test_have_prereq PYTHON | ||||||
|  | @ -36,6 +44,15 @@ native_path() { | ||||||
| 	echo "$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 | # Try to pick a unique port: guess a large number, then hope | ||||||
| # no more than one of each test is running. | # no more than one of each test is running. | ||||||
| # | # | ||||||
|  | @ -57,6 +74,15 @@ cli="$TRASH_DIRECTORY/cli" | ||||||
| git="$TRASH_DIRECTORY/git" | git="$TRASH_DIRECTORY/git" | ||||||
| pidfile="$TRASH_DIRECTORY/p4d.pid" | 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 | ||||||
|  | } | ||||||
|  | trap cleanup EXIT | ||||||
|  |  | ||||||
| # git p4 submit generates a temp file, which will | # git p4 submit generates a temp file, which will | ||||||
| # not get cleaned up if the submission fails.  Don't | # not get cleaned up if the submission fails.  Don't | ||||||
| # clutter up /tmp on the test machine. | # clutter up /tmp on the test machine. | ||||||
|  | @ -81,6 +107,19 @@ start_p4d() { | ||||||
| 	# will be caught with the "kill -0" check below. | 	# will be caught with the "kill -0" check below. | ||||||
| 	i=${P4D_START_PATIENCE:-300} | 	i=${P4D_START_PATIENCE:-300} | ||||||
| 	pid=$(cat "$pidfile") | 	pid=$(cat "$pidfile") | ||||||
|  |  | ||||||
|  | 	timeout=$(($(time_in_seconds) + $P4D_TIMEOUT)) | ||||||
|  | 	while true | ||||||
|  | 	do | ||||||
|  | 		if test $(time_in_seconds) -gt $timeout | ||||||
|  | 		then | ||||||
|  | 			kill -9 $pid | ||||||
|  | 			exit 1 | ||||||
|  | 		fi | ||||||
|  | 		sleep 1 | ||||||
|  | 	done & | ||||||
|  | 	watchdog_pid=$! | ||||||
|  |  | ||||||
| 	ready= | 	ready= | ||||||
| 	while test $i -gt 0 | 	while test $i -gt 0 | ||||||
| 	do | 	do | ||||||
|  | @ -121,22 +160,36 @@ p4_add_user() { | ||||||
| 	EOF | 	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() { | kill_p4d() { | ||||||
| 	pid=$(cat "$pidfile") | 	pid=$(cat "$pidfile") | ||||||
| 	# it had better exist for the first kill | 	retry_until_fail kill $pid | ||||||
| 	kill $pid && | 	retry_until_fail kill -9 $pid | ||||||
| 	for i in 1 2 3 4 5 ; do |  | ||||||
| 		kill $pid >/dev/null 2>&1 || break |  | ||||||
| 		sleep 1 |  | ||||||
| 	done && |  | ||||||
| 	# complain if it would not die | 	# complain if it would not die | ||||||
| 	test_must_fail kill $pid >/dev/null 2>&1 && | 	test_must_fail kill $pid >/dev/null 2>&1 && | ||||||
| 	rm -rf "$db" "$cli" "$pidfile" | 	rm -rf "$db" "$cli" "$pidfile" && | ||||||
|  | 	retry_until_fail kill -9 $watchdog_pid | ||||||
| } | } | ||||||
|  |  | ||||||
| cleanup_git() { | cleanup_git() { | ||||||
| 	rm -rf "$git" && | 	retry_until_success rm -r "$git" | ||||||
| 	mkdir "$git" | 	test_must_fail test -d "$git" && | ||||||
|  | 	retry_until_success mkdir "$git" | ||||||
| } | } | ||||||
|  |  | ||||||
| marshal_dump() { | marshal_dump() { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King