diff --git a/Makefile b/Makefile index 1710843e8..c10a1515e 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ BASH_EXISTS := $(shell which bash) SHELL := $(shell which bash) +PYTHON?=$(shell which python) CLEAN_FILES = # deliberately empty, so we can append below. CFLAGS += ${EXTRA_CFLAGS} @@ -948,9 +949,9 @@ check: all fi rm -rf $(TMPD) ifneq ($(PLATFORM), OS_AIX) - python tools/check_all_python.py + $(PYTHON) tools/check_all_python.py ifeq ($(filter -DROCKSDB_LITE,$(OPT)),) - python tools/ldb_test.py + $(PYTHON) tools/ldb_test.py sh tools/rocksdb_dump_test.sh endif endif @@ -961,7 +962,7 @@ check_some: $(SUBSET) .PHONY: ldb_tests ldb_tests: ldb - python tools/ldb_test.py + $(PYTHON) tools/ldb_test.py crash_test: whitebox_crash_test blackbox_crash_test @@ -970,31 +971,31 @@ crash_test_with_atomic_flush: whitebox_crash_test_with_atomic_flush blackbox_cra crash_test_with_txn: whitebox_crash_test_with_txn blackbox_crash_test_with_txn blackbox_crash_test: db_stress - python -u tools/db_crashtest.py --simple blackbox $(CRASH_TEST_EXT_ARGS) - python -u tools/db_crashtest.py blackbox $(CRASH_TEST_EXT_ARGS) + $(PYTHON) -u tools/db_crashtest.py --simple blackbox $(CRASH_TEST_EXT_ARGS) + $(PYTHON) -u tools/db_crashtest.py blackbox $(CRASH_TEST_EXT_ARGS) blackbox_crash_test_with_atomic_flush: db_stress - python -u tools/db_crashtest.py --cf_consistency blackbox $(CRASH_TEST_EXT_ARGS) + $(PYTHON) -u tools/db_crashtest.py --cf_consistency blackbox $(CRASH_TEST_EXT_ARGS) blackbox_crash_test_with_txn: db_stress - python -u tools/db_crashtest.py --txn blackbox $(CRASH_TEST_EXT_ARGS) + $(PYTHON) -u tools/db_crashtest.py --txn blackbox $(CRASH_TEST_EXT_ARGS) ifeq ($(CRASH_TEST_KILL_ODD),) CRASH_TEST_KILL_ODD=888887 endif whitebox_crash_test: db_stress - python -u tools/db_crashtest.py --simple whitebox --random_kill_odd \ + $(PYTHON) -u tools/db_crashtest.py --simple whitebox --random_kill_odd \ $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS) - python -u tools/db_crashtest.py whitebox --random_kill_odd \ + $(PYTHON) -u tools/db_crashtest.py whitebox --random_kill_odd \ $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS) whitebox_crash_test_with_atomic_flush: db_stress - python -u tools/db_crashtest.py --cf_consistency whitebox --random_kill_odd \ + $(PYTHON) -u tools/db_crashtest.py --cf_consistency whitebox --random_kill_odd \ $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS) whitebox_crash_test_with_txn: db_stress - python -u tools/db_crashtest.py --txn whitebox --random_kill_odd \ + $(PYTHON) -u tools/db_crashtest.py --txn whitebox --random_kill_odd \ $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS) asan_check: @@ -2093,7 +2094,7 @@ jtest_run: jtest: rocksdbjava cd java;$(MAKE) sample;$(MAKE) test; - python tools/check_all_python.py # TODO peterd: find a better place for this check in CI targets + $(PYTHON) tools/check_all_python.py # TODO peterd: find a better place for this check in CI targets jdb_bench: cd java;$(MAKE) db_bench; diff --git a/coverage/coverage_test.sh b/coverage/coverage_test.sh index 2f40ed61a..28c6e360a 100755 --- a/coverage/coverage_test.sh +++ b/coverage/coverage_test.sh @@ -17,16 +17,19 @@ if [ -d /mnt/gvfs/third-party -a -z "$CXX" ]; then else GCOV=$(which gcov) fi +echo -e "Using $GCOV" COVERAGE_DIR="$PWD/COVERAGE_REPORT" mkdir -p $COVERAGE_DIR # Find all gcno files to generate the coverage report +PYTHON=${1:-`which python`} +echo -e "Using $PYTHON" GCNO_FILES=`find $ROOT -name "*.gcno"` $GCOV --preserve-paths --relative-only --no-output $GCNO_FILES 2>/dev/null | # Parse the raw gcov report to more human readable form. - python $ROOT/coverage/parse_gcov_output.py | + $PYTHON $ROOT/coverage/parse_gcov_output.py | # Write the output to both stdout and report file. tee $COVERAGE_DIR/coverage_report_all.txt && echo -e "Generated coverage report for all files: $COVERAGE_DIR/coverage_report_all.txt\n" @@ -41,7 +44,7 @@ RECENT_REPORT=$COVERAGE_DIR/coverage_report_recent.txt echo -e "Recently updated files: $LATEST_FILES\n" > $RECENT_REPORT $GCOV --preserve-paths --relative-only --no-output $GCNO_FILES 2>/dev/null | - python $ROOT/coverage/parse_gcov_output.py -interested-files $LATEST_FILES | + $PYTHON $ROOT/coverage/parse_gcov_output.py -interested-files $LATEST_FILES | tee -a $RECENT_REPORT && echo -e "Generated coverage report for recently updated files: $RECENT_REPORT\n" diff --git a/coverage/parse_gcov_output.py b/coverage/parse_gcov_output.py index a5e987222..02edc2a59 100644 --- a/coverage/parse_gcov_output.py +++ b/coverage/parse_gcov_output.py @@ -1,10 +1,12 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +from __future__ import print_function + +import optparse import re import sys -from optparse import OptionParser - # the gcov report follows certain pattern. Each file will have two lines # of report, from which we can extract the file name, total lines and coverage # percentage. @@ -48,7 +50,7 @@ def parse_gcov_report(gcov_input): def get_option_parser(): usage = "Parse the gcov output and generate more human-readable code " +\ "coverage report." - parser = OptionParser(usage) + parser = optparse.OptionParser(usage) parser.add_option( "--interested-files", "-i", @@ -73,8 +75,8 @@ def display_file_coverage(per_file_coverage, total_coverage): header_template = \ "%" + str(max_file_name_length) + "s\t%s\t%s" separator = "-" * (max_file_name_length + 10 + 20) - print header_template % ("Filename", "Coverage", "Lines") # noqa: E999 T25377293 Grandfathered in - print separator + print(header_template % ("Filename", "Coverage", "Lines")) # noqa: E999 T25377293 Grandfathered in + print(separator) # -- Print body # template for printing coverage report for each file. @@ -82,12 +84,12 @@ def display_file_coverage(per_file_coverage, total_coverage): for fname, coverage_info in per_file_coverage.items(): coverage, lines = coverage_info - print record_template % (fname, coverage, lines) + print(record_template % (fname, coverage, lines)) # -- Print footer if total_coverage: - print separator - print record_template % ("Total", total_coverage[0], total_coverage[1]) + print(separator) + print(record_template % ("Total", total_coverage[0], total_coverage[1])) def report_coverage(): parser = get_option_parser() @@ -111,7 +113,7 @@ def report_coverage(): total_coverage = None if not len(per_file_coverage): - print >> sys.stderr, "Cannot find coverage info for the given files." + print("Cannot find coverage info for the given files.", file=sys.stderr) return display_file_coverage(per_file_coverage, total_coverage) diff --git a/tools/db_crashtest.py b/tools/db_crashtest.py index eb17ddd96..dea2a3fef 100644 --- a/tools/db_crashtest.py +++ b/tools/db_crashtest.py @@ -1,5 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +from __future__ import absolute_import, division, print_function, unicode_literals + import os import sys import time @@ -132,7 +134,7 @@ def is_direct_io_supported(dbname): with tempfile.NamedTemporaryFile(dir=dbname) as f: try: os.open(f.name, os.O_DIRECT) - except: + except BaseException: return False return True @@ -297,8 +299,8 @@ def blackbox_crash_main(args, unknown_args): killtime = time.time() + cmd_params['interval'] cmd = gen_cmd(dict( - cmd_params.items() + - {'db': dbname}.items()), unknown_args) + list(cmd_params.items()) + + list({'db': dbname}.items())), unknown_args) child = subprocess.Popen(cmd, stderr=subprocess.PIPE) print("Running db_stress with pid=%d: %s\n\n" @@ -323,7 +325,7 @@ def blackbox_crash_main(args, unknown_args): time.sleep(1) # time to stabilize after a kill while True: - line = child.stderr.readline().strip() + line = child.stderr.readline().strip().decode('utf-8') if line == '': break elif not line.startswith('WARNING'): @@ -348,7 +350,7 @@ def whitebox_crash_main(args, unknown_args): cur_time = time.time() exit_time = cur_time + cmd_params['duration'] - half_time = cur_time + cmd_params['duration'] / 2 + half_time = cur_time + cmd_params['duration'] // 2 print("Running whitebox-crash-test with \n" + "total-duration=" + str(cmd_params['duration']) + "\n") @@ -374,9 +376,9 @@ def whitebox_crash_main(args, unknown_args): }) elif kill_mode == 1: if cmd_params.get('disable_wal', 0) == 1: - my_kill_odd = kill_random_test / 50 + 1 + my_kill_odd = kill_random_test // 50 + 1 else: - my_kill_odd = kill_random_test / 10 + 1 + my_kill_odd = kill_random_test // 10 + 1 additional_opts.update({ "kill_random_test": my_kill_odd, "kill_prefix_blacklist": "WritableFileWriter::Append," @@ -386,7 +388,7 @@ def whitebox_crash_main(args, unknown_args): # TODO: May need to adjust random odds if kill_random_test # is too small. additional_opts.update({ - "kill_random_test": (kill_random_test / 5000 + 1), + "kill_random_test": (kill_random_test // 5000 + 1), "kill_prefix_blacklist": "WritableFileWriter::Append," "WritableFileWriter::WriteBuffered," "PosixMmapFile::Allocate,WritableFileWriter::Flush", @@ -406,7 +408,7 @@ def whitebox_crash_main(args, unknown_args): # style is quite a bit slower on reads with lot of files additional_opts = { "kill_random_test": None, - "ops_per_thread": cmd_params['ops_per_thread'] / 5, + "ops_per_thread": cmd_params['ops_per_thread'] // 5, "compaction_style": 2, } else: @@ -416,19 +418,24 @@ def whitebox_crash_main(args, unknown_args): "ops_per_thread": cmd_params['ops_per_thread'], } - cmd = gen_cmd(dict(cmd_params.items() + additional_opts.items() - + {'db': dbname}.items()), unknown_args) + cmd = gen_cmd(dict(list(cmd_params.items()) + + list(additional_opts.items()) + + list({'db': dbname}.items())), unknown_args) - print "Running:" + ' '.join(cmd) + "\n" # noqa: E999 T25377293 Grandfathered in + print("Running:" + ' '.join(cmd) + "\n") # noqa: E999 T25377293 Grandfathered in popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdoutdata, stderrdata = popen.communicate() + if stdoutdata: + stdoutdata = stdoutdata.decode('utf-8') + if stderrdata: + stderrdata = stderrdata.decode('utf-8') retncode = popen.returncode msg = ("check_mode={0}, kill option={1}, exitcode={2}\n".format( check_mode, additional_opts['kill_random_test'], retncode)) - print msg - print stdoutdata + print(msg) + print(stdoutdata) expected = False if additional_opts['kill_random_test'] is None and (retncode == 0): @@ -440,19 +447,19 @@ def whitebox_crash_main(args, unknown_args): expected = True if not expected: - print "TEST FAILED. See kill option and exit code above!!!\n" + print("TEST FAILED. See kill option and exit code above!!!\n") sys.exit(1) stdoutdata = stdoutdata.lower() errorcount = (stdoutdata.count('error') - stdoutdata.count('got errors 0 times')) - print "#times error occurred in output is " + str(errorcount) + "\n" + print("#times error occurred in output is " + str(errorcount) + "\n") if (errorcount > 0): - print "TEST FAILED. Output has 'error'!!!\n" + print("TEST FAILED. Output has 'error'!!!\n") sys.exit(2) if (stdoutdata.find('fail') >= 0): - print "TEST FAILED. Output has 'fail'!!!\n" + print("TEST FAILED. Output has 'fail'!!!\n") sys.exit(2) # First half of the duration, keep doing kill test. For the next half, @@ -476,12 +483,12 @@ def main(): parser.add_argument("--cf_consistency", action='store_true') parser.add_argument("--txn", action='store_true') - all_params = dict(default_params.items() - + blackbox_default_params.items() - + whitebox_default_params.items() - + simple_default_params.items() - + blackbox_simple_default_params.items() - + whitebox_simple_default_params.items()) + all_params = dict(list(default_params.items()) + + list(blackbox_default_params.items()) + + list(whitebox_default_params.items()) + + list(simple_default_params.items()) + + list(blackbox_simple_default_params.items()) + + list(whitebox_simple_default_params.items())) for k, v in all_params.items(): parser.add_argument("--" + k, type=type(v() if callable(v) else v)) diff --git a/tools/ldb_test.py b/tools/ldb_test.py index 74bb7fb16..9773b85f8 100644 --- a/tools/ldb_test.py +++ b/tools/ldb_test.py @@ -1,5 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +from __future__ import absolute_import, division, print_function, unicode_literals + import os import glob import os.path @@ -27,7 +29,7 @@ def my_check_output(*popenargs, **kwargs): cmd = popenargs[0] raise Exception("Exit code is not 0. It is %d. Command: %s" % (retcode, cmd)) - return output + return output.decode('utf-8') def run_err_null(cmd): return os.system(cmd + " 2>/dev/null ") @@ -52,7 +54,6 @@ class LDBTestCase(unittest.TestCase): """ All command-line params must be specified. Allows full flexibility in testing; for example: missing db param. - """ output = my_check_output("./ldb %s |grep -v \"Created bg thread\"" % params, shell=True) @@ -72,7 +73,6 @@ class LDBTestCase(unittest.TestCase): """ All command-line params must be specified. Allows full flexibility in testing; for example: missing db param. - """ try: @@ -87,7 +87,6 @@ class LDBTestCase(unittest.TestCase): def assertRunOK(self, params, expectedOutput, unexpected=False): """ Uses the default test db. - """ self.assertRunOKFull("%s %s" % (self.dbParam(self.DB_NAME), params), expectedOutput, unexpected) @@ -99,7 +98,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunFAILFull("%s %s" % (self.dbParam(self.DB_NAME), params)) def testSimpleStringPutGet(self): - print "Running testSimpleStringPutGet..." + print("Running testSimpleStringPutGet...") self.assertRunFAIL("put x1 y1") self.assertRunOK("put --create_if_missing x1 y1", "OK") self.assertRunOK("get x1", "y1") @@ -157,7 +156,7 @@ class LDBTestCase(unittest.TestCase): % (inputSst, params)) def testStringBatchPut(self): - print "Running testStringBatchPut..." + print("Running testStringBatchPut...") self.assertRunOK("batchput x1 y1 --create_if_missing", "OK") self.assertRunOK("scan", "x1 : y1") self.assertRunOK("batchput x2 y2 x3 y3 \"x4 abc\" \"y4 xyz\"", "OK") @@ -167,7 +166,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunFAIL("batchput k1 v1 k2") def testCountDelimDump(self): - print "Running testCountDelimDump..." + print("Running testCountDelimDump...") self.assertRunOK("batchput x.1 x1 --create_if_missing", "OK") self.assertRunOK("batchput y.abc abc y.2 2 z.13c pqr", "OK") self.assertRunOK("dump --count_delim", "x => count:1\tsize:5\ny => count:2\tsize:12\nz => count:1\tsize:8") @@ -176,7 +175,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunOK("dump --count_delim=\",\"", "x => count:2\tsize:14\nx.1 => count:1\tsize:5\ny.2 => count:1\tsize:4\ny.abc => count:1\tsize:8\nz.13c => count:1\tsize:8") def testCountDelimIDump(self): - print "Running testCountDelimIDump..." + print("Running testCountDelimIDump...") self.assertRunOK("batchput x.1 x1 --create_if_missing", "OK") self.assertRunOK("batchput y.abc abc y.2 2 z.13c pqr", "OK") self.assertRunOK("idump --count_delim", "x => count:1\tsize:5\ny => count:2\tsize:12\nz => count:1\tsize:8") @@ -185,7 +184,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunOK("idump --count_delim=\",\"", "x => count:2\tsize:14\nx.1 => count:1\tsize:5\ny.2 => count:1\tsize:4\ny.abc => count:1\tsize:8\nz.13c => count:1\tsize:8") def testInvalidCmdLines(self): - print "Running testInvalidCmdLines..." + print("Running testInvalidCmdLines...") # db not specified self.assertRunFAILFull("put 0x6133 0x6233 --hex --create_if_missing") # No param called he @@ -195,7 +194,7 @@ class LDBTestCase(unittest.TestCase): # hex has invalid boolean value def testHexPutGet(self): - print "Running testHexPutGet..." + print("Running testHexPutGet...") self.assertRunOK("put a1 b1 --create_if_missing", "OK") self.assertRunOK("scan", "a1 : b1") self.assertRunOK("scan --hex", "0x6131 : 0x6231") @@ -225,7 +224,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunOK("checkconsistency", "OK") def testTtlPutGet(self): - print "Running testTtlPutGet..." + print("Running testTtlPutGet...") self.assertRunOK("put a1 b1 --ttl --create_if_missing", "OK") self.assertRunOK("scan --hex", "0x6131 : 0x6231", True) self.assertRunOK("dump --ttl ", "a1 ==> b1", True) @@ -240,7 +239,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunOK("checkconsistency", "OK") def testInvalidCmdLines(self): # noqa: F811 T25377293 Grandfathered in - print "Running testInvalidCmdLines..." + print("Running testInvalidCmdLines...") # db not specified self.assertRunFAILFull("put 0x6133 0x6233 --hex --create_if_missing") # No param called he @@ -251,7 +250,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunFAIL("put 0x6133 0x6233 --hex=Boo --create_if_missing") def testDumpLoad(self): - print "Running testDumpLoad..." + print("Running testDumpLoad...") self.assertRunOK("batchput --create_if_missing x1 y1 x2 y2 x3 y3 x4 y4", "OK") self.assertRunOK("scan", "x1 : y1\nx2 : y2\nx3 : y3\nx4 : y4") @@ -342,7 +341,7 @@ class LDBTestCase(unittest.TestCase): "--db=%s --create_if_missing" % origDbPath, dumpFilePath)) def testIDumpBasics(self): - print "Running testIDumpBasics..." + print("Running testIDumpBasics...") self.assertRunOK("put a val --create_if_missing", "OK") self.assertRunOK("put b val", "OK") self.assertRunOK( @@ -354,7 +353,7 @@ class LDBTestCase(unittest.TestCase): "'a' seq:1, type:1 => val\nInternal keys in range: 1") def testMiscAdminTask(self): - print "Running testMiscAdminTask..." + print("Running testMiscAdminTask...") # These tests need to be improved; for example with asserts about # whether compaction or level reduction actually took place. self.assertRunOK("batchput --create_if_missing x1 y1 x2 y2 x3 y3 x4 y4", @@ -390,7 +389,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunOK("scan", "x1 : y1\nx2 : y2\nx3 : y3\nx4 : y4") def testCheckConsistency(self): - print "Running testCheckConsistency..." + print("Running testCheckConsistency...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) self.assertRunOK("put x1 y1 --create_if_missing", "OK") @@ -414,7 +413,7 @@ class LDBTestCase(unittest.TestCase): params, dumpFile)) def testDumpLiveFiles(self): - print "Running testDumpLiveFiles..." + print("Running testDumpLiveFiles...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) self.assertRunOK("put x1 y1 --create_if_missing", "OK") @@ -439,7 +438,7 @@ class LDBTestCase(unittest.TestCase): return 0 == run_err_null("cp " + src + " " + dest) def testManifestDump(self): - print "Running testManifestDump..." + print("Running testManifestDump...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) self.assertRunOK("put 1 1 --create_if_missing", "OK") self.assertRunOK("put 2 2", "OK") @@ -475,7 +474,7 @@ class LDBTestCase(unittest.TestCase): isPattern=True) def testSSTDump(self): - print "Running testSSTDump..." + print("Running testSSTDump...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) self.assertRunOK("put sst1 sst1_val --create_if_missing", "OK") @@ -495,7 +494,7 @@ class LDBTestCase(unittest.TestCase): isPattern=True) def testWALDump(self): - print "Running testWALDump..." + print("Running testWALDump...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) self.assertRunOK("put wal1 wal1_val --create_if_missing", "OK") @@ -515,7 +514,7 @@ class LDBTestCase(unittest.TestCase): isPattern=True) def testListColumnFamilies(self): - print "Running testListColumnFamilies..." + print("Running testListColumnFamilies...") self.assertRunOK("put x1 y1 --create_if_missing", "OK") cmd = "list_column_families | grep -v \"Column families\"" # Test on valid dbPath. @@ -524,7 +523,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunFAIL(cmd) def testColumnFamilies(self): - print "Running testColumnFamilies..." + print("Running testColumnFamilies...") dbPath = os.path.join(self.TMP_DIR, self.DB_NAME) # noqa: F841 T25377293 Grandfathered in self.assertRunOK("put cf1_1 1 --create_if_missing", "OK") self.assertRunOK("put cf1_2 2 --create_if_missing", "OK") @@ -559,7 +558,7 @@ class LDBTestCase(unittest.TestCase): self.assertRunFAIL("drop_column_family four") def testIngestExternalSst(self): - print "Running testIngestExternalSst..." + print("Running testIngestExternalSst...") # Dump, load, write external sst and ingest it in another db dbPath = os.path.join(self.TMP_DIR, "db1") diff --git a/tools/write_stress_runner.py b/tools/write_stress_runner.py index fc0c99c23..51daa24e8 100644 --- a/tools/write_stress_runner.py +++ b/tools/write_stress_runner.py @@ -1,5 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +from __future__ import absolute_import, division, print_function, unicode_literals + import subprocess import argparse import random @@ -10,7 +12,7 @@ import sys def generate_runtimes(total_runtime): # combination of short runtimes and long runtimes, with heavier # weight on short runtimes - possible_runtimes_sec = range(1, 10) + range(1, 20) + [100, 1000] + possible_runtimes_sec = list(range(1, 10)) + list(range(1, 20)) + [100, 1000] runtimes = [] while total_runtime > 0: chosen = random.choice(possible_runtimes_sec) @@ -22,7 +24,7 @@ def generate_runtimes(total_runtime): def main(args): runtimes = generate_runtimes(int(args.runtime_sec)) - print "Going to execute write stress for " + str(runtimes) # noqa: E999 T25377293 Grandfathered in + print("Going to execute write stress for " + str(runtimes)) # noqa: E999 T25377293 Grandfathered in first_time = True for runtime in runtimes: