tests: automatically kill regressions that take too long
When GNU coreutils 'timeout' is available, limit each regression simulation to 4 hours.
This commit is contained in:
parent
4f0e3cd4d7
commit
e553ca67d4
2 changed files with 13 additions and 2 deletions
|
@ -752,6 +752,11 @@ if compareVersions(swig_version[2], min_swig_version) < 0:
|
||||||
swig_flags=Split('-c++ -python -modern -templatereduce $_CPPINCFLAGS')
|
swig_flags=Split('-c++ -python -modern -templatereduce $_CPPINCFLAGS')
|
||||||
main.Append(SWIGFLAGS=swig_flags)
|
main.Append(SWIGFLAGS=swig_flags)
|
||||||
|
|
||||||
|
# Check for 'timeout' from GNU coreutils. If present, regressions
|
||||||
|
# will be run with a time limit.
|
||||||
|
TIMEOUT_version = readCommand(['timeout', '--version'], exception=False)
|
||||||
|
main['TIMEOUT'] = TIMEOUT_version and TIMEOUT_version.find('timeout') == 0
|
||||||
|
|
||||||
# filter out all existing swig scanners, they mess up the dependency
|
# filter out all existing swig scanners, they mess up the dependency
|
||||||
# stuff for some reason
|
# stuff for some reason
|
||||||
scanners = []
|
scanners = []
|
||||||
|
|
|
@ -104,6 +104,10 @@ def run_test(target, source, env):
|
||||||
timeout = 15 * 60 # used to be a param, probably should be again
|
timeout = 15 * 60 # used to be a param, probably should be again
|
||||||
if env['BATCH']:
|
if env['BATCH']:
|
||||||
cmd = '%s -t %d %s' % (env['BATCH_CMD'], timeout, cmd)
|
cmd = '%s -t %d %s' % (env['BATCH_CMD'], timeout, cmd)
|
||||||
|
# The slowest regression (bzip2) requires ~2.8 hours;
|
||||||
|
# 4 hours was chosen to be conservative.
|
||||||
|
elif env['TIMEOUT']:
|
||||||
|
cmd = 'timeout 4h %s' % cmd
|
||||||
|
|
||||||
# Create a default value for the status string, changed as needed
|
# Create a default value for the status string, changed as needed
|
||||||
# based on the status.
|
# based on the status.
|
||||||
|
@ -152,7 +156,9 @@ def run_test(target, source, env):
|
||||||
# Consider it a failed test unless the exit status is 2
|
# Consider it a failed test unless the exit status is 2
|
||||||
status_str = "FAILED!"
|
status_str = "FAILED!"
|
||||||
# gem5 did not terminate properly, so no need to check the output
|
# gem5 did not terminate properly, so no need to check the output
|
||||||
if signaled(status):
|
if env['TIMEOUT'] and status == 124:
|
||||||
|
status_str = "TIMED-OUT!"
|
||||||
|
elif signaled(status):
|
||||||
print 'gem5 terminated with signal', signum(status)
|
print 'gem5 terminated with signal', signum(status)
|
||||||
if signum(status) in retry_signals:
|
if signum(status) in retry_signals:
|
||||||
# Consider the test incomplete; don't create a 'status' output.
|
# Consider the test incomplete; don't create a 'status' output.
|
||||||
|
@ -192,7 +198,7 @@ def print_test(target, source, env):
|
||||||
|
|
||||||
# if the test failed make it red, if it passed make it green, and
|
# if the test failed make it red, if it passed make it green, and
|
||||||
# skip the punctuation
|
# skip the punctuation
|
||||||
if status == "FAILED!":
|
if status == "FAILED!" or status == "TIMED-OUT!":
|
||||||
status = termcap.Red + status[:-1] + termcap.Normal + status[-1]
|
status = termcap.Red + status[:-1] + termcap.Normal + status[-1]
|
||||||
elif status == "CHANGED!":
|
elif status == "CHANGED!":
|
||||||
status = termcap.Yellow + status[:-1] + termcap.Normal + status[-1]
|
status = termcap.Yellow + status[:-1] + termcap.Normal + status[-1]
|
||||||
|
|
Loading…
Reference in a new issue