2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved.
7 # Stress send running in parallel with balance and deduplication against files
8 # that belong to the snapshots used by send. The goal is to verify that these
9 # operations running in parallel do not lead to send crashing (trigger assertion
10 # failures and BUG_ONs), or send finding an inconsistent snapshot that leads to
11 # a failure (reported in dmesg/syslog). The test needs big trees (snapshots)
12 # with large differences between the parent and send snapshots in order to hit
13 # such issues with a good probability.
16 seqres=$RESULT_DIR/$seq
17 echo "QA output created by $seq"
19 status=1 # failure is the default!
20 trap "_cleanup; exit \$status" 0 1 2 3 15
28 # get standard environment, filters and checks
34 # real QA test starts here
37 _require_scratch_dedupe
42 # We at least need 8GB of free space on $SCRATCH_DEV
43 _require_scratch_size $((8 * 1024 * 1024))
45 _scratch_mkfs >>$seqres.full 2>&1
50 trap "wait; exit" SIGTERM
52 local f1=$(find $SCRATCH_MNT/snap1 -type f | shuf -n 1)
53 local f2=$(find $SCRATCH_MNT/snap2 -type f | shuf -n 1)
55 if (( RANDOM % 2 )); then
61 # Ignore errors from dedupe. We just want to test for crashes and
63 $XFS_IO_PROG -r -c "dedupe $f1 0 0 64K" $f2 &> /dev/null
68 trap "wait; exit" SIGTERM
71 for ((i = 1; i <= 5; i++)); do
80 trap "wait; exit" SIGTERM
83 # Balance only metadata block groups, since this is makes it
84 # easier to hit problems (crashes and errors) in send.
85 # Ignore errors from balance. We just want to test for crashes
87 _run_btrfs_balance_start -f -m $SCRATCH_MNT &> /dev/null
94 trap "wait; exit" SIGTERM
98 for ((i = 1; i <= $count; i++)); do
99 # Ignore errors from send. We will check for errors later in
101 $BTRFS_UTIL_PROG send -f /dev/null \
102 $SCRATCH_MNT/snap1 &> /dev/null
103 sleep $((RANDOM % 3))
109 trap "wait; exit" SIGTERM
113 for ((i = 1; i <= $count; i++)); do
114 # Ignore errors from send. We will check for errors later in
116 $BTRFS_UTIL_PROG send -f /dev/null \
117 -p $SCRATCH_MNT/snap1 $SCRATCH_MNT/snap2 &> /dev/null
118 sleep $((RANDOM % 3))
127 for ((i = 1; i <= $count; i++)); do
128 $XFS_IO_PROG -f -c "pwrite -S 0xea 0 64K" \
129 $SCRATCH_MNT/file_$((i + offset)) >/dev/null
138 for ((i = 1; i <= $count; i++)); do
139 $SETFATTR_PROG -n 'user.x1' -v $xattr_value \
140 $SCRATCH_MNT/file_$((i + offset))
144 # Number of files created before first snapshot. Must be divisable by 4.
145 nr_initial_files=40000
146 # Number of files created after the first snapshot. Must be divisable by 4.
149 # Create initial files.
150 step=$((nr_initial_files / 4))
151 for ((n = 0; n < 4; n++)); do
152 offset=$((step * $n))
153 write_files_loop $step $offset &
156 wait ${create_pids[@]}
158 $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap1 \
161 # Add some more files, so that that are substantial differences between the
162 # two test snapshots used for an incremental send later.
165 step=$((nr_more_files / 4))
166 for ((n = 0; n < 4; n++)); do
167 offset=$((nr_initial_files + step * $n))
168 write_files_loop $step $offset &
171 wait ${create_pids[@]}
173 # Add some xattrs to all files, so that every leaf and node of the fs tree is
174 # COWed. Adding more files does only adds leafs and nodes to the tree's right
175 # side, since inode numbers are based on a counter and form the first part
176 # (objectid) of btree keys (we only modifying the right most leaf of the tree).
177 # Use large values for the xattrs to quickly increase the height of the tree.
178 xattr_value=$(printf '%0.sX' $(seq 1 3800))
180 # Split the work into 4 workers working on consecutive ranges to avoid contention
181 # on the same leafs as much as possible.
182 step=$(((nr_more_files + nr_initial_files) / 4))
183 for ((n = 0; n < 4; n++)); do
184 offset=$((step * $n))
185 set_xattrs_loop $step $offset &
188 wait ${setxattr_pids[@]}
190 $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap2 \
214 # Check for errors messages that happen due to inconsistent snapshot caused by
215 # deduplication and balance running in parallel with send, causing btree nodes
216 # and leafs to disappear and getting reused while send is using them.
220 # BTRFS error (device sdc): did not find backref in send_root. inode=63292, \
221 # offset=0, disk_byte=5228134400 found extent=5228134400
223 # BTRFS error (device sdc): parent transid verify failed on 32243712 wanted 24 \
226 _dmesg_since_test_start | egrep -e '\bBTRFS error \(device .*?\):'