]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/diff_continuous.sh
6 function untar_workload
() {
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"
12 rm -rf "${MOUNT}"/linux-5.4
*
16 function check_object_map
() {
19 rbd object-map check
"${spec}"
22 flags
="$(rbd info "${spec}" | grep 'flags: ')"
23 if [[ "${flags}" =~ object\ map\ invalid
]]; then
24 echo "Object map invalid at ${spec}"
27 if [[ "${flags}" =~ fast\
diff\ invalid
]]; then
28 echo "Fast diff invalid at ${spec}"
33 # RBD_DEVICE_TYPE is intended to be set from yaml, default to krbd
34 readonly DEVICE_TYPE
="${RBD_DEVICE_TYPE:-krbd}"
36 BASE_UUID
="$(uuidgen)"
40 readonly SRC
="${BASE_UUID}-src"
41 readonly DST
="${BASE_UUID}-dst"
42 readonly MOUNT
="${BASE_UUID}-mnt"
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}"
48 dev
="$(sudo rbd device map -t "${DEVICE_TYPE}" "${SRC}")"
49 sudo mkfs.ext4
"${dev}"
51 sudo mount
"${dev}" "${MOUNT}"
52 sudo chown
"$(whoami)" "${MOUNT}"
54 # start untar in the background
55 wget https
://download.ceph.com
/qa
/linux-5.4.
tar.gz
59 # export initial incremental
61 rbd snap create
"${SRC}@snap${snap_num}"
62 rbd export-diff
"${SRC}@snap${snap_num}" "${BASE_UUID}@snap${snap_num}.diff"
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"
73 sudo umount
"${MOUNT}"
74 sudo rbd device unmap
-t "${DEVICE_TYPE}" "${dev}"
76 if ! wait "${untar_pid}"; then
77 echo "untar_workload failed"
81 echo "Exported ${snap_num} incrementals"
82 if ((snap_num
< 30)); then
83 echo "Too few incrementals"
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}"
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}"