Summary: The script runs and kills the stress test periodically. Default values have been used in the script now. Should I make this a part of the Makefile or automated rocksdb build? The values can be easily changed in the script right now, but should I add some support for variable values or input to the script? I believe the script achieves its objective of unsafe crashes and reopening to expect sanity in the database. Test Plan: python tools/db_crashtest.py Reviewers: dhruba, vamsi, MarkCallaghan Reviewed By: vamsi CC: leveldb Differential Revision: https://reviews.facebook.net/D9369main
parent
645ff8f231
commit
e937d47180
@ -0,0 +1,93 @@ |
||||
import os |
||||
import sys |
||||
import time |
||||
import shlex |
||||
import getopt |
||||
import logging |
||||
import subprocess |
||||
|
||||
# This python script runs and kills db_stress multiple times with |
||||
# test-batches-snapshot ON, |
||||
# total operations much less than the total keys, and |
||||
# a high read percentage. |
||||
# This checks consistency in case of unsafe crashes in Rocksdb |
||||
|
||||
def main(argv): |
||||
os.system("make -C ~/rocksdb db_stress") |
||||
try: |
||||
opts, args = getopt.getopt(argv, "hd:t:i:o:b:") |
||||
except getopt.GetoptError: |
||||
print "db_crashtest.py -d <duration_test> -t <#threads> " \ |
||||
"-i <interval for one run> -o <ops_per_thread>\n" |
||||
sys.exit(2) |
||||
|
||||
# default values, will be overridden by cmdline args |
||||
interval = 120 # time for one db_stress instance to run |
||||
duration = 6000 # total time for this script to test db_stress |
||||
threads = 32 |
||||
ops_per_thread = 500000 |
||||
write_buf_size = 4 * 1024 * 1024 |
||||
|
||||
for opt, arg in opts: |
||||
if opt == '-h': |
||||
print "db_crashtest.py -d <duration_test> -t <#threads> " \ |
||||
"-i <interval for one run> -o <ops_per_thread> "\ |
||||
"-b <write_buffer_size>\n" |
||||
sys.exit() |
||||
elif opt == ("-d"): |
||||
duration = int(arg) |
||||
elif opt == ("-t"): |
||||
threads = int(arg) |
||||
elif opt == ("-i"): |
||||
interval = int(arg) |
||||
elif opt == ("-o"): |
||||
ops_per_thread = int(arg) |
||||
elif opt == ("-b"): |
||||
write_buf_size = int(arg) |
||||
else: |
||||
print "db_crashtest.py -d <duration_test> -t <#threads> " \ |
||||
"-i <interval for one run> -o <ops_per_thread> " \ |
||||
"-b <write_buffer_size>\n" |
||||
sys.exit(2) |
||||
|
||||
exit_time = time.time() + duration |
||||
|
||||
while time.time() < exit_time: |
||||
run_had_errors = False |
||||
print "Running db_stress \n" |
||||
os.system("mkdir -p /tmp/rocksdb/crashtest") |
||||
killtime = time.time() + interval |
||||
child = subprocess.Popen(['~/rocksdb/db_stress \ |
||||
--test_batches_snapshots=1 \ |
||||
--ops_per_thread=0' + str(ops_per_thread) + ' \ |
||||
--threads=0' + str(threads) + ' \ |
||||
--write_buffer_size=' + str(write_buf_size) + '\ |
||||
--reopen=10 \ |
||||
--readpercent=50 \ |
||||
--db=/tmp/rocksdb/crashtest \ |
||||
--max_key=100'], stderr=subprocess.PIPE, shell=True) |
||||
time.sleep(interval) |
||||
while True: |
||||
if time.time() > killtime: |
||||
if child.poll() is not None: |
||||
logging.warn("WARNING: db_stress completed before kill\n") |
||||
else: |
||||
child.kill() |
||||
print "KILLED \n" |
||||
time.sleep(1) # time to stabilize after a kill |
||||
|
||||
while True: |
||||
line = child.stderr.readline().strip() |
||||
if line != '': |
||||
run_had_errors = True |
||||
print '***' + line + '^' |
||||
else: |
||||
break |
||||
if run_had_errors: |
||||
sys.exit(2) |
||||
break |
||||
|
||||
time.sleep(1) # time to stabilize before the next run |
||||
|
||||
if __name__ == "__main__": |
||||
sys.exit(main(sys.argv[1:])) |
Loading…
Reference in new issue