mdadm: add test case for raid5 write back cache

Started by Song Liu on Dec 16, 2016

Subsystems (1)

Maintainers (1)

DORMANTno replies

open the first message on its own page

Message details and related content
This test cases checks data integrity of raid5 write back cache
under various scenarios:

degraded mode, non-overwrite, raid-5/6.

Signed-off-by: Song Liu <redacted>
---
 tests/21raid5cache | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 tests/21raid5cache
diff --git a/tests/21raid5cache b/tests/21raid5cache
new file mode 100644
index 0000000..0dd97bf
--- /dev/null
+++ b/tests/21raid5cache
@@ -0,0 +1,87 @@
+# check data integrity with raid5 write back cache
+
+# create a 4kB random file and 4 files each with a 1kB chunk of the random file:
+#    randfile: ABCD   randchunk[0-3]:  A  B  C  D
+#
+# then create another random 1kB chunk E, and a new random page with A, B, E, D:
+#    randchunk4: E    newrandfile:   ABED
+create_random_data() {
+    dd if=/dev/urandom of=/tmp/randfile bs=4k count=1
+    for x in {0..3}
+    do
+        dd if=/tmp/randfile of=/tmp/randchunk$x bs=1k count=1 skip=$x count=1
+    done
+
+    dd if=/dev/urandom of=/tmp/randchunk4 bs=1k count=1
+
+    rm /tmp/newrandfile
+    for x in 0 1 4 3
+    do
+        cat /tmp/randchunk$x >> /tmp/newrandfile
+    done
+}
+
+# create array, $1 could be 5 for raid5 and 6 for raid6
+create_array() {
+    if [ $1 -lt 5 -o $1 -gt 6 ]
+    then
+        echo wrong array type $1
+        exit 2
+    fi
+
+    mdadm -CR $md0 -c4 -l5 -n10 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 $dev11 $dev8 $dev9 --write-journal $dev10
+    check wait
+    echo write-back > /sys/block/md0/md/journal_mode
+}
+
+restart_array_write_back() {
+    mdadm -S $md0
+    mdadm -A $md0 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 $dev11 $dev8 $dev9 $dev10
+    echo write-back > /sys/block/md0/md/journal_mode
+}
+
+# compare the first page of md0 with file in $1
+cmp_first_page() {
+    cmp  -n 4096 $1 $md0 || { echo cmp failed ; exit 2 ; }
+}
+
+# write 3 pages after the first page of md0
+write_three_pages() {
+    for x in {1..3}
+    do
+        dd if=/dev/urandom of=$md0 bs=4k count=1 seek=$x count=1
+    done
+}
+
+# run_test <array_type:5/6> <degraded_or_not:yes/no>
+run_test() {
+    create_random_data
+    create_array $1
+
+    if [ $2 == yes ]
+    then
+        mdadm --fail $md0 $dev0
+    fi
+
+    dd if=/tmp/randfile of=$md0 bs=4k count=1
+    restart_array_write_back
+    cmp_first_page /tmp/randfile
+    restart_array_write_back
+    write_three_pages
+    cmp_first_page /tmp/randfile
+
+
+    dd if=/tmp/randchunk4 of=/dev/md0 bs=1k count=1 seek=2
+    restart_array_write_back
+    cmp_first_page /tmp/newrandfile
+    restart_array_write_back
+    write_three_pages
+    cmp_first_page /tmp/newrandfile
+
+    mdadm -S $md0
+}
+
+run_test 5 no
+run_test 5 yes
+run_test 6 no
+run_test 6 yes
-- 
2.9.3
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help