mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-04-06 17:49:11 +03:00
ZTS: Log test name to /dev/kmsg on Linux
Add a -K option to the test suite to log each test name to /dev/kmsg (on Linux), so if there's a kernel warning we'll be able to match it up to a particular test. Reviewed-by: John Kennedy <john.kennedy@delphix.com> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #13227
This commit is contained in:
parent
6b444cb971
commit
b73505c7e0
@ -39,6 +39,7 @@ VERBOSE="no"
|
|||||||
QUIET=""
|
QUIET=""
|
||||||
CLEANUP="yes"
|
CLEANUP="yes"
|
||||||
CLEANUPALL="no"
|
CLEANUPALL="no"
|
||||||
|
KMSG=""
|
||||||
LOOPBACK="yes"
|
LOOPBACK="yes"
|
||||||
STACK_TRACER="no"
|
STACK_TRACER="no"
|
||||||
FILESIZE="4G"
|
FILESIZE="4G"
|
||||||
@ -326,6 +327,7 @@ OPTIONS:
|
|||||||
-q Quiet test-runner output
|
-q Quiet test-runner output
|
||||||
-x Remove all testpools, dm, lo, and files (unsafe)
|
-x Remove all testpools, dm, lo, and files (unsafe)
|
||||||
-k Disable cleanup after test failure
|
-k Disable cleanup after test failure
|
||||||
|
-K Log test names to /dev/kmsg
|
||||||
-f Use files only, disables block device tests
|
-f Use files only, disables block device tests
|
||||||
-S Enable stack tracer (negative performance impact)
|
-S Enable stack tracer (negative performance impact)
|
||||||
-c Only create and populate constrained path
|
-c Only create and populate constrained path
|
||||||
@ -357,7 +359,7 @@ $0 -x
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
while getopts 'hvqxkfScRmn:d:s:r:?t:T:u:I:' OPTION; do
|
while getopts 'hvqxkKfScRmn:d:s:r:?t:T:u:I:' OPTION; do
|
||||||
case $OPTION in
|
case $OPTION in
|
||||||
h)
|
h)
|
||||||
usage
|
usage
|
||||||
@ -375,6 +377,9 @@ while getopts 'hvqxkfScRmn:d:s:r:?t:T:u:I:' OPTION; do
|
|||||||
k)
|
k)
|
||||||
CLEANUP="no"
|
CLEANUP="no"
|
||||||
;;
|
;;
|
||||||
|
K)
|
||||||
|
KMSG="yes"
|
||||||
|
;;
|
||||||
f)
|
f)
|
||||||
LOOPBACK="no"
|
LOOPBACK="no"
|
||||||
;;
|
;;
|
||||||
@ -705,6 +710,7 @@ REPORT_FILE=$(mktemp_file zts-report)
|
|||||||
msg "${TEST_RUNNER}" \
|
msg "${TEST_RUNNER}" \
|
||||||
"${QUIET:+-q}" \
|
"${QUIET:+-q}" \
|
||||||
"${KMEMLEAK:+-m}" \
|
"${KMEMLEAK:+-m}" \
|
||||||
|
"${KMSG:+-K}" \
|
||||||
"-c \"${RUNFILES}\"" \
|
"-c \"${RUNFILES}\"" \
|
||||||
"-T \"${TAGS}\"" \
|
"-T \"${TAGS}\"" \
|
||||||
"-i \"${STF_SUITE}\"" \
|
"-i \"${STF_SUITE}\"" \
|
||||||
@ -712,6 +718,7 @@ msg "${TEST_RUNNER}" \
|
|||||||
{ ${TEST_RUNNER} \
|
{ ${TEST_RUNNER} \
|
||||||
${QUIET:+-q} \
|
${QUIET:+-q} \
|
||||||
${KMEMLEAK:+-m} \
|
${KMEMLEAK:+-m} \
|
||||||
|
${KMSG:+-K} \
|
||||||
-c "${RUNFILES}" \
|
-c "${RUNFILES}" \
|
||||||
-T "${TAGS}" \
|
-T "${TAGS}" \
|
||||||
-i "${STF_SUITE}" \
|
-i "${STF_SUITE}" \
|
||||||
|
@ -34,6 +34,7 @@ from subprocess import Popen
|
|||||||
from subprocess import check_output
|
from subprocess import check_output
|
||||||
from threading import Timer
|
from threading import Timer
|
||||||
from time import time, CLOCK_MONOTONIC
|
from time import time, CLOCK_MONOTONIC
|
||||||
|
from os.path import exists
|
||||||
|
|
||||||
BASEDIR = '/var/tmp/test_results'
|
BASEDIR = '/var/tmp/test_results'
|
||||||
TESTDIR = '/usr/share/zfs/'
|
TESTDIR = '/usr/share/zfs/'
|
||||||
@ -256,7 +257,7 @@ User: %s
|
|||||||
|
|
||||||
return out.lines, err.lines
|
return out.lines, err.lines
|
||||||
|
|
||||||
def run(self, dryrun, kmemleak):
|
def run(self, dryrun, kmemleak, kmsg):
|
||||||
"""
|
"""
|
||||||
This is the main function that runs each individual test.
|
This is the main function that runs each individual test.
|
||||||
Determine whether or not the command requires sudo, and modify it
|
Determine whether or not the command requires sudo, and modify it
|
||||||
@ -275,6 +276,18 @@ User: %s
|
|||||||
except OSError as e:
|
except OSError as e:
|
||||||
fail('%s' % e)
|
fail('%s' % e)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Log each test we run to /dev/kmsg (on Linux), so if there's a kernel
|
||||||
|
warning we'll be able to match it up to a particular test.
|
||||||
|
"""
|
||||||
|
if kmsg is True and exists("/dev/kmsg"):
|
||||||
|
try:
|
||||||
|
kp = Popen([SUDO, "sh", "-c",
|
||||||
|
f"echo ZTS run {self.pathname} > /dev/kmsg"])
|
||||||
|
kp.wait()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
self.result.starttime = monotonic_time()
|
self.result.starttime = monotonic_time()
|
||||||
|
|
||||||
if kmemleak:
|
if kmemleak:
|
||||||
@ -459,14 +472,14 @@ Tags: %s
|
|||||||
|
|
||||||
cont = True
|
cont = True
|
||||||
if len(pretest.pathname):
|
if len(pretest.pathname):
|
||||||
pretest.run(options.dryrun, False)
|
pretest.run(options.dryrun, False, options.kmsg)
|
||||||
cont = pretest.result.result == 'PASS'
|
cont = pretest.result.result == 'PASS'
|
||||||
pretest.log(options)
|
pretest.log(options)
|
||||||
|
|
||||||
if cont:
|
if cont:
|
||||||
test.run(options.dryrun, options.kmemleak)
|
test.run(options.dryrun, options.kmemleak, options.kmsg)
|
||||||
if test.result.result == 'KILLED' and len(failsafe.pathname):
|
if test.result.result == 'KILLED' and len(failsafe.pathname):
|
||||||
failsafe.run(options.dryrun, False)
|
failsafe.run(options.dryrun, False, options.kmsg)
|
||||||
failsafe.log(options, suppress_console=True)
|
failsafe.log(options, suppress_console=True)
|
||||||
else:
|
else:
|
||||||
test.skip()
|
test.skip()
|
||||||
@ -474,7 +487,7 @@ Tags: %s
|
|||||||
test.log(options)
|
test.log(options)
|
||||||
|
|
||||||
if len(posttest.pathname):
|
if len(posttest.pathname):
|
||||||
posttest.run(options.dryrun, False)
|
posttest.run(options.dryrun, False, options.kmsg)
|
||||||
posttest.log(options)
|
posttest.log(options)
|
||||||
|
|
||||||
|
|
||||||
@ -577,7 +590,7 @@ Tags: %s
|
|||||||
|
|
||||||
cont = True
|
cont = True
|
||||||
if len(pretest.pathname):
|
if len(pretest.pathname):
|
||||||
pretest.run(options.dryrun, False)
|
pretest.run(options.dryrun, False, options.kmsg)
|
||||||
cont = pretest.result.result == 'PASS'
|
cont = pretest.result.result == 'PASS'
|
||||||
pretest.log(options)
|
pretest.log(options)
|
||||||
|
|
||||||
@ -590,9 +603,9 @@ Tags: %s
|
|||||||
failsafe = Cmd(self.failsafe, outputdir=odir, timeout=self.timeout,
|
failsafe = Cmd(self.failsafe, outputdir=odir, timeout=self.timeout,
|
||||||
user=self.failsafe_user, identifier=self.identifier)
|
user=self.failsafe_user, identifier=self.identifier)
|
||||||
if cont:
|
if cont:
|
||||||
test.run(options.dryrun, options.kmemleak)
|
test.run(options.dryrun, options.kmemleak, options.kmsg)
|
||||||
if test.result.result == 'KILLED' and len(failsafe.pathname):
|
if test.result.result == 'KILLED' and len(failsafe.pathname):
|
||||||
failsafe.run(options.dryrun, False)
|
failsafe.run(options.dryrun, False, options.kmsg)
|
||||||
failsafe.log(options, suppress_console=True)
|
failsafe.log(options, suppress_console=True)
|
||||||
else:
|
else:
|
||||||
test.skip()
|
test.skip()
|
||||||
@ -600,7 +613,7 @@ Tags: %s
|
|||||||
test.log(options)
|
test.log(options)
|
||||||
|
|
||||||
if len(posttest.pathname):
|
if len(posttest.pathname):
|
||||||
posttest.run(options.dryrun, False)
|
posttest.run(options.dryrun, False, options.kmsg)
|
||||||
posttest.log(options)
|
posttest.log(options)
|
||||||
|
|
||||||
|
|
||||||
@ -1060,6 +1073,8 @@ def parse_args():
|
|||||||
parser.add_option('-i', action='callback', callback=options_cb,
|
parser.add_option('-i', action='callback', callback=options_cb,
|
||||||
default=TESTDIR, dest='testdir', type='string',
|
default=TESTDIR, dest='testdir', type='string',
|
||||||
metavar='testdir', help='Specify a test directory.')
|
metavar='testdir', help='Specify a test directory.')
|
||||||
|
parser.add_option('-K', action='store_true', default=False, dest='kmsg',
|
||||||
|
help='Log tests names to /dev/kmsg')
|
||||||
parser.add_option('-m', action='callback', callback=kmemleak_cb,
|
parser.add_option('-m', action='callback', callback=kmemleak_cb,
|
||||||
default=False, dest='kmemleak',
|
default=False, dest='kmemleak',
|
||||||
help='Enable kmemleak reporting (Linux only)')
|
help='Enable kmemleak reporting (Linux only)')
|
||||||
|
Loading…
Reference in New Issue
Block a user