]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/diff_continuous.sh
update ceph source to reef 18.1.2
[ceph.git] / ceph / qa / workunits / rbd / diff_continuous.sh
CommitLineData
11fdf7f2 1#!/usr/bin/env bash
1e59de90 2
11fdf7f2 3set -ex
1e59de90
TL
4set -o pipefail
5
6function 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
16function 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
34readonly DEVICE_TYPE="${RBD_DEVICE_TYPE:-krbd}"
35
36BASE_UUID="$(uuidgen)"
37readonly BASE_UUID
38
39readonly SIZE="2G"
40readonly SRC="${BASE_UUID}-src"
41readonly DST="${BASE_UUID}-dst"
42readonly MOUNT="${BASE_UUID}-mnt"
43
44rbd create -s "${SIZE}" --stripe-unit 64K --stripe-count 8 \
45 --image-feature exclusive-lock,object-map,fast-diff "${SRC}"
46rbd create -s "${SIZE}" --object-size 512K "${DST}"
47
48dev="$(sudo rbd device map -t "${DEVICE_TYPE}" "${SRC}")"
49sudo mkfs.ext4 "${dev}"
50mkdir "${MOUNT}"
51sudo mount "${dev}" "${MOUNT}"
52sudo chown "$(whoami)" "${MOUNT}"
53
54# start untar in the background
55wget https://download.ceph.com/qa/linux-5.4.tar.gz
56untar_workload &
57untar_pid=$!
58
59# export initial incremental
60snap_num=1
61rbd snap create "${SRC}@snap${snap_num}"
62rbd export-diff "${SRC}@snap${snap_num}" "${BASE_UUID}@snap${snap_num}.diff"
63
64# keep exporting successive incrementals while untar is running
65while 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
71done
72
1e59de90
TL
73sudo umount "${MOUNT}"
74sudo rbd device unmap -t "${DEVICE_TYPE}" "${dev}"
75
76if ! wait "${untar_pid}"; then
77 echo "untar_workload failed"
78 exit 1
79fi
80
81echo "Exported ${snap_num} incrementals"
82if ((snap_num < 30)); then
83 echo "Too few incrementals"
84 exit 1
85fi
7c673cae
FG
86
87# validate
1e59de90
TL
88for ((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
104done
105
7c673cae 106echo OK