]>
Commit | Line | Data |
---|---|---|
11fdf7f2 | 1 | #!/usr/bin/env bash |
1e59de90 | 2 | |
11fdf7f2 | 3 | set -ex |
1e59de90 TL |
4 | set -o pipefail |
5 | ||
6 | function untar_workload() { | |
7 | local i | |
8 | for ((i = 0; i < 10; i++)); do | |
9 | pv -L 10M linux-5.4.tar.gz > "${MOUNT}/linux-5.4.tar.gz" | |
10 | tar -C "${MOUNT}" -xzf "${MOUNT}/linux-5.4.tar.gz" | |
11 | sync "${MOUNT}" | |
12 | rm -rf "${MOUNT}"/linux-5.4* | |
13 | done | |
14 | } | |
15 | ||
16 | function check_object_map() { | |
17 | local spec="$1" | |
18 | ||
19 | rbd object-map check "${spec}" | |
7c673cae | 20 | |
1e59de90 TL |
21 | local flags |
22 | flags="$(rbd info "${spec}" | grep 'flags: ')" | |
23 | if [[ "${flags}" =~ object\ map\ invalid ]]; then | |
24 | echo "Object map invalid at ${spec}" | |
25 | exit 1 | |
26 | fi | |
27 | if [[ "${flags}" =~ fast\ diff\ invalid ]]; then | |
28 | echo "Fast diff invalid at ${spec}" | |
29 | exit 1 | |
30 | fi | |
7c673cae | 31 | } |
1e59de90 TL |
32 | |
33 | # RBD_DEVICE_TYPE is intended to be set from yaml, default to krbd | |
34 | readonly DEVICE_TYPE="${RBD_DEVICE_TYPE:-krbd}" | |
35 | ||
36 | BASE_UUID="$(uuidgen)" | |
37 | readonly BASE_UUID | |
38 | ||
39 | readonly SIZE="2G" | |
40 | readonly SRC="${BASE_UUID}-src" | |
41 | readonly DST="${BASE_UUID}-dst" | |
42 | readonly MOUNT="${BASE_UUID}-mnt" | |
43 | ||
44 | rbd create -s "${SIZE}" --stripe-unit 64K --stripe-count 8 \ | |
45 | --image-feature exclusive-lock,object-map,fast-diff "${SRC}" | |
46 | rbd create -s "${SIZE}" --object-size 512K "${DST}" | |
47 | ||
48 | dev="$(sudo rbd device map -t "${DEVICE_TYPE}" "${SRC}")" | |
49 | sudo mkfs.ext4 "${dev}" | |
50 | mkdir "${MOUNT}" | |
51 | sudo mount "${dev}" "${MOUNT}" | |
52 | sudo chown "$(whoami)" "${MOUNT}" | |
53 | ||
54 | # start untar in the background | |
55 | wget https://download.ceph.com/qa/linux-5.4.tar.gz | |
56 | untar_workload & | |
57 | untar_pid=$! | |
58 | ||
59 | # export initial incremental | |
60 | snap_num=1 | |
61 | rbd snap create "${SRC}@snap${snap_num}" | |
62 | rbd export-diff "${SRC}@snap${snap_num}" "${BASE_UUID}@snap${snap_num}.diff" | |
63 | ||
64 | # keep exporting successive incrementals while untar is running | |
65 | while kill -0 "${untar_pid}"; do | |
66 | snap_num=$((snap_num + 1)) | |
67 | rbd snap create "${SRC}@snap${snap_num}" | |
68 | sleep $((RANDOM % 4 + 1)) | |
69 | rbd export-diff --whole-object --from-snap "snap$((snap_num - 1))" \ | |
70 | "${SRC}@snap${snap_num}" "${BASE_UUID}@snap${snap_num}.diff" | |
7c673cae FG |
71 | done |
72 | ||
1e59de90 TL |
73 | sudo umount "${MOUNT}" |
74 | sudo rbd device unmap -t "${DEVICE_TYPE}" "${dev}" | |
75 | ||
76 | if ! wait "${untar_pid}"; then | |
77 | echo "untar_workload failed" | |
78 | exit 1 | |
79 | fi | |
80 | ||
81 | echo "Exported ${snap_num} incrementals" | |
82 | if ((snap_num < 30)); then | |
83 | echo "Too few incrementals" | |
84 | exit 1 | |
85 | fi | |
7c673cae FG |
86 | |
87 | # validate | |
1e59de90 TL |
88 | for ((i = 1; i <= snap_num; i++)); do |
89 | rbd import-diff "${BASE_UUID}@snap${i}.diff" "${DST}" | |
90 | src_sum="$(rbd export "${SRC}@snap${i}" - | md5sum | awk '{print $1}')" | |
91 | dst_sum="$(rbd export "${DST}@snap${i}" - | md5sum | awk '{print $1}')" | |
92 | if [[ "${src_sum}" != "${dst_sum}" ]]; then | |
93 | echo "Mismatch at snap${i}: ${src_sum} != ${dst_sum}" | |
94 | exit 1 | |
7c673cae | 95 | fi |
1e59de90 TL |
96 | check_object_map "${SRC}@snap${i}" |
97 | # FIXME: this reproduces http://tracker.ceph.com/issues/37876 | |
98 | # there is no fstrim involved but "rbd import-diff" can produce | |
99 | # write-zeroes requests which turn into discards under the hood | |
100 | # actual: EXISTS, expected: EXISTS_CLEAN inconsistency is harmless | |
101 | # from a data integrity POV and data is validated above regardless, | |
102 | # so just waive it for now | |
103 | #check_object_map "${DST}@snap${i}" | |
7c673cae FG |
104 | done |
105 | ||
7c673cae | 106 | echo OK |