From: Vincent Fu Date: Mon, 29 Aug 2022 15:30:30 +0000 (-0400) Subject: test: add some tests for seq and rand offsets X-Git-Tag: fio-3.32~5 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=ef54f290e8d585a267bd3588ad92d1aedcb4246e;p=fio.git test: add some tests for seq and rand offsets t/jobs/t0019.fio is a seq read test t/jobs/t0020.fio is a rand read test We don't have any automated tests which make sure that sequential access patterns are actually sequential and that random access patterns are not sequential. Add these two tests to help detect the possibility that these features could break. Signed-off-by: Vincent Fu --- diff --git a/t/jobs/t0019.fio b/t/jobs/t0019.fio new file mode 100644 index 00000000..b60d27d2 --- /dev/null +++ b/t/jobs/t0019.fio @@ -0,0 +1,10 @@ +# Expected result: offsets are accessed sequentially and all offsets are read +# Buggy result: offsets are not accessed sequentially and one or more offsets are missed +# run with --debug=io or logging to see which offsets are accessed + +[test] +ioengine=null +filesize=1M +write_bw_log=test +per_job_logs=0 +log_offset=1 diff --git a/t/jobs/t0020.fio b/t/jobs/t0020.fio new file mode 100644 index 00000000..1c1c5166 --- /dev/null +++ b/t/jobs/t0020.fio @@ -0,0 +1,11 @@ +# Expected result: offsets are not accessed sequentially and all offsets are touched +# Buggy result: offsets are accessed sequentially and one or more offsets are missed +# run with --debug=io or logging to see which offsets are read + +[test] +ioengine=null +filesize=1M +rw=randread +write_bw_log=test +per_job_logs=0 +log_offset=1 diff --git a/t/run-fio-tests.py b/t/run-fio-tests.py index 1e5e9f24..78f43521 100755 --- a/t/run-fio-tests.py +++ b/t/run-fio-tests.py @@ -548,6 +548,72 @@ class FioJobTest_t0015(FioJobTest): self.passed = False +class FioJobTest_t0019(FioJobTest): + """Test consists of fio test job t0019 + Confirm that all offsets were touched sequentially""" + + def check_result(self): + super(FioJobTest_t0019, self).check_result() + + bw_log_filename = os.path.join(self.test_dir, "test_bw.log") + file_data, success = self.get_file(bw_log_filename) + log_lines = file_data.split('\n') + + prev = -4096 + for line in log_lines: + if len(line.strip()) == 0: + continue + cur = int(line.split(',')[4]) + if cur - prev != 4096: + self.passed = False + self.failure_reason = "offsets {0}, {1} not sequential".format(prev, cur) + return + prev = cur + + if cur/4096 != 255: + self.passed = False + self.failure_reason = "unexpected last offset {0}".format(cur) + + +class FioJobTest_t0020(FioJobTest): + """Test consists of fio test job t0020 + Confirm that almost all offsets were touched non-sequentially""" + + def check_result(self): + super(FioJobTest_t0020, self).check_result() + + bw_log_filename = os.path.join(self.test_dir, "test_bw.log") + file_data, success = self.get_file(bw_log_filename) + log_lines = file_data.split('\n') + + seq_count = 0 + offsets = set() + + prev = int(log_lines[0].split(',')[4]) + for line in log_lines[1:]: + offsets.add(prev/4096) + if len(line.strip()) == 0: + continue + cur = int(line.split(',')[4]) + if cur - prev == 4096: + seq_count += 1 + prev = cur + + # 10 is an arbitrary threshold + if seq_count > 10: + self.passed = False + self.failure_reason = "too many ({0}) consecutive offsets".format(seq_count) + + if len(offsets) != 256: + self.passed = False + self.failure_reason += " number of offsets is {0} instead of 256".format(len(offsets)) + + for i in range(256): + if not i in offsets: + self.passed = False + self.failure_reason += " missing offset {0}".format(i*4096) + + class FioJobTest_iops_rate(FioJobTest): """Test consists of fio test job t0009 Confirm that job0 iops == 1000 @@ -889,6 +955,24 @@ TEST_LIST = [ 'pre_success': None, 'requirements': [Requirements.linux, Requirements.io_uring], }, + { + 'test_id': 19, + 'test_class': FioJobTest_t0019, + 'job': 't0019.fio', + 'success': SUCCESS_DEFAULT, + 'pre_job': None, + 'pre_success': None, + 'requirements': [], + }, + { + 'test_id': 20, + 'test_class': FioJobTest_t0020, + 'job': 't0020.fio', + 'success': SUCCESS_DEFAULT, + 'pre_job': None, + 'pre_success': None, + 'requirements': [], + }, { 'test_id': 1000, 'test_class': FioExeTest,