| From 1eef6cddda678b0d1a120970bc4cc961c285c81e Mon Sep 17 00:00:00 2001 |
| From: Vincent Fu <vincent.fu@samsung.com> |
| Date: Mon, 29 Aug 2022 11:30:30 -0400 |
| Subject: [PATCH] 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 <vincent.fu@samsung.com> |
| --- |
| t/jobs/t0019.fio | 10 ++++++ |
| t/jobs/t0020.fio | 11 ++++++ |
| t/run-fio-tests.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++ |
| 3 files changed, 105 insertions(+) |
| create mode 100644 t/jobs/t0019.fio |
| create mode 100644 t/jobs/t0020.fio |
| |
| 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, |