test: check all offsets touched for randtrimwrite
authorVincent Fu <vincent.fu@samsung.com>
Wed, 5 Oct 2022 00:20:09 +0000 (17:20 -0700)
committerVincent Fu <vincent.fu@samsung.com>
Wed, 5 Oct 2022 22:15:40 +0000 (18:15 -0400)
Make sure that all of the offsets are touched for the randtrimwrite test
when randommap is enabled.

This exposes a problem where mixed ddir workloads that use a random map
may not have all blocks touched when the different data directions use
different block sizes. Resolve this for now by setting the same block
size for all data directions for the job named bs.

Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
t/jobs/t0023.fio
t/run-fio-tests.py

index 4d76b4a35f9456b5e91193bc0dbe5c18f628ded4..4f0bef89020a1a1886234af6e46d726e0bf48efc 100644 (file)
@@ -6,7 +6,6 @@ rw=randtrimwrite
 log_offset=1
 per_job_logs=0
 randrepeat=0
-stonewall
 write_bw_log
 
 # Expected result:     trim issued to random offset followed by write to same offset
@@ -20,7 +19,7 @@ write_bw_log
 #                      block sizes 8k for both write and trim
 # Buggy result:        something else
 [bs]
-bs=4k,4k,8k
+bs=8k,8k,8k
 
 # Expected result:     trim issued to random offset followed by write to same offset
 #                      all offsets trimmed
index 07dafc0c448769f07ab46221536392b4e9e8f0c3..f183668aa8bb01480915237cc405e13c7a95e8cb 100755 (executable)
@@ -691,9 +691,46 @@ class FioJobTest_t0023(FioJobTest):
             prev_offset = offset
 
 
+    def check_all_offsets(self, filename, sectorsize, filesize):
+        file_data, success = self.get_file(os.path.join(self.test_dir, filename))
+        if not success:
+            self.passed = False
+            self.failure_reason = " could not open {0}".format(filename)
+            return
+
+        log_lines = file_data.split('\n')
+
+        offsets = set()
+
+        for line in log_lines:
+            if len(line.strip()) == 0:
+                continue
+            vals = line.split(',')
+            bs = int(vals[3])
+            offset = int(vals[4])
+            if offset % sectorsize != 0:
+                self.passed = False
+                self.failure_reason += " {0}: offset {1} not a multiple of sector size {2}".format(filename, offset, sectorsize)
+                break;
+            if bs % sectorsize != 0:
+                self.passed = False
+                self.failure_reason += " {0}: block size {1} not a multiple of sector size {2}".format(filename, bs, sectorsize)
+                break;
+            for i in range(int(bs/sectorsize)):
+                offsets.add(offset/sectorsize + i)
+
+        if len(offsets) != filesize/sectorsize:
+            self.passed = False
+            self.failure_reason += " {0}: only {1} offsets touched; expected {2}".format(filename, len(offsets), filesize/sectorsize)
+        else:
+            logging.debug("{0}: {1}  sectors touched".format(filename, len(offsets)))
+
+
     def check_result(self):
         super(FioJobTest_t0023, self).check_result()
 
+        filesize = 1024*1024
+
         self.check_trimwrite("basic_bw.log")
         self.check_trimwrite("bs_bw.log")
         self.check_trimwrite("bsrange_bw.log")
@@ -703,7 +740,10 @@ class FioJobTest_t0023(FioJobTest):
         self.check_trimwrite("bsrange_no_rm_bw.log")
         self.check_trimwrite("bssplit_no_rm_bw.log")
 
-        # TODO make sure all offsets were touched
+        self.check_all_offsets("basic_bw.log", 4096, filesize)
+        self.check_all_offsets("bs_bw.log", 8192, filesize)
+        self.check_all_offsets("bsrange_bw.log", 512, filesize)
+        self.check_all_offsets("bssplit_bw.log", 512, filesize)
 
 
 class FioJobTest_iops_rate(FioJobTest):