]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | #!/bin/bash |
2 | ||
3 | set -ex | |
4 | ||
5 | function fill_image() { | |
6 | local spec=$1 | |
7 | ||
8 | local dev | |
9 | dev=$(sudo rbd map $spec) | |
10 | xfs_io -c "pwrite -b $OBJECT_SIZE -S 0x78 -W 0 $IMAGE_SIZE" $dev | |
11 | sudo rbd unmap $dev | |
12 | } | |
13 | ||
14 | function create_clones() { | |
15 | local spec=$1 | |
16 | ||
17 | rbd snap create $spec@snap | |
18 | rbd snap protect $spec@snap | |
19 | ||
20 | local pool=${spec%/*} # pool/image is assumed | |
21 | local image=${spec#*/} | |
22 | local child_pool | |
23 | for child_pool in $pool clonesonly; do | |
24 | rbd clone $spec@snap $child_pool/$pool-$image-clone1 | |
25 | rbd clone $spec@snap --data-pool repdata $child_pool/$pool-$image-clone2 | |
26 | rbd clone $spec@snap --data-pool ecdata $child_pool/$pool-$image-clone3 | |
27 | done | |
28 | } | |
29 | ||
30 | function trigger_copyup() { | |
31 | local spec=$1 | |
32 | ||
33 | local dev | |
34 | dev=$(sudo rbd map $spec) | |
35 | local i | |
36 | { | |
37 | for ((i = 0; i < $NUM_OBJECTS; i++)); do | |
38 | echo pwrite -b $OBJECT_SIZE -S 0x59 $((i * OBJECT_SIZE + OBJECT_SIZE / 2)) $((OBJECT_SIZE / 2)) | |
39 | done | |
40 | echo fsync | |
41 | echo quit | |
42 | } | xfs_io $dev | |
43 | sudo rbd unmap $dev | |
44 | } | |
45 | ||
46 | function compare() { | |
47 | local spec=$1 | |
48 | local object=$2 | |
49 | ||
50 | local dev | |
51 | dev=$(sudo rbd map $spec) | |
52 | local i | |
53 | for ((i = 0; i < $NUM_OBJECTS; i++)); do | |
54 | dd if=$dev bs=$OBJECT_SIZE count=1 skip=$i | cmp $object - | |
55 | done | |
56 | sudo rbd unmap $dev | |
57 | } | |
58 | ||
59 | function mkfs_and_mount() { | |
60 | local spec=$1 | |
61 | ||
62 | local dev | |
63 | dev=$(sudo rbd map $spec) | |
64 | mkfs.ext4 -q -E discard $dev | |
65 | sudo mount $dev /mnt | |
66 | sudo umount /mnt | |
67 | sudo rbd unmap $dev | |
68 | } | |
69 | ||
70 | function count_data_objects() { | |
71 | local spec=$1 | |
72 | ||
73 | local pool | |
74 | pool=$(rbd info $spec | grep 'data_pool: ' | awk '{ print $NF }') | |
75 | if [[ -z $pool ]]; then | |
76 | pool=${spec%/*} # pool/image is assumed | |
77 | fi | |
78 | ||
79 | local prefix | |
80 | prefix=$(rbd info $spec | grep 'block_name_prefix: ' | awk '{ print $NF }') | |
81 | echo $(rados -p $pool ls | grep -c $prefix) | |
82 | } | |
83 | ||
84 | ceph osd pool create repdata 24 24 | |
85 | ceph osd erasure-code-profile set teuthologyprofile ruleset-failure-domain=osd m=1 k=2 | |
86 | ceph osd pool create ecdata 24 24 erasure teuthologyprofile | |
87 | ceph osd pool set ecdata allow_ec_overwrites true | |
88 | ceph osd pool create rbdnonzero 24 24 | |
89 | ceph osd pool create clonesonly 24 24 | |
90 | ||
91 | for pool in rbd rbdnonzero; do | |
92 | rbd create --size 200 --image-format 1 $pool/img0 | |
93 | rbd create --size 200 $pool/img1 | |
94 | rbd create --size 200 --data-pool repdata $pool/img2 | |
95 | rbd create --size 200 --data-pool ecdata $pool/img3 | |
96 | done | |
97 | ||
98 | IMAGE_SIZE=$(rbd info --format=json img1 | python -c 'import sys, json; print json.load(sys.stdin)["size"]') | |
99 | OBJECT_SIZE=$(rbd info --format=json img1 | python -c 'import sys, json; print json.load(sys.stdin)["object_size"]') | |
100 | NUM_OBJECTS=$((IMAGE_SIZE / OBJECT_SIZE)) | |
101 | [[ $((IMAGE_SIZE % OBJECT_SIZE)) -eq 0 ]] | |
102 | ||
103 | OBJECT_X=$(mktemp) # xxxx | |
104 | xfs_io -c "pwrite -b $OBJECT_SIZE -S 0x78 0 $OBJECT_SIZE" $OBJECT_X | |
105 | ||
106 | OBJECT_XY=$(mktemp) # xxYY | |
107 | xfs_io -c "pwrite -b $OBJECT_SIZE -S 0x78 0 $((OBJECT_SIZE / 2))" \ | |
108 | -c "pwrite -b $OBJECT_SIZE -S 0x59 $((OBJECT_SIZE / 2)) $((OBJECT_SIZE / 2))" \ | |
109 | $OBJECT_XY | |
110 | ||
111 | for pool in rbd rbdnonzero; do | |
112 | for i in {0..3}; do | |
113 | fill_image $pool/img$i | |
114 | if [[ $i -ne 0 ]]; then | |
115 | create_clones $pool/img$i | |
116 | for child_pool in $pool clonesonly; do | |
117 | for j in {1..3}; do | |
118 | trigger_copyup $child_pool/$pool-img$i-clone$j | |
119 | done | |
120 | done | |
121 | fi | |
122 | done | |
123 | done | |
124 | ||
125 | # rbd_directory, rbd_children, rbd_info + img0 header + ... | |
126 | NUM_META_RBDS=$((3 + 1 + 3 * (1*2 + 3*2))) | |
127 | # rbd_directory, rbd_children, rbd_info + ... | |
128 | NUM_META_CLONESONLY=$((3 + 2 * 3 * (3*2))) | |
129 | ||
130 | [[ $(rados -p rbd ls | wc -l) -eq $((NUM_META_RBDS + 5 * NUM_OBJECTS)) ]] | |
131 | [[ $(rados -p repdata ls | wc -l) -eq $((1 + 14 * NUM_OBJECTS)) ]] | |
132 | [[ $(rados -p ecdata ls | wc -l) -eq $((1 + 14 * NUM_OBJECTS)) ]] | |
133 | [[ $(rados -p rbdnonzero ls | wc -l) -eq $((NUM_META_RBDS + 5 * NUM_OBJECTS)) ]] | |
134 | [[ $(rados -p clonesonly ls | wc -l) -eq $((NUM_META_CLONESONLY + 6 * NUM_OBJECTS)) ]] | |
135 | ||
136 | for pool in rbd rbdnonzero; do | |
137 | for i in {0..3}; do | |
138 | [[ $(count_data_objects $pool/img$i) -eq $NUM_OBJECTS ]] | |
139 | if [[ $i -ne 0 ]]; then | |
140 | for child_pool in $pool clonesonly; do | |
141 | for j in {1..3}; do | |
142 | [[ $(count_data_objects $child_pool/$pool-img$i-clone$j) -eq $NUM_OBJECTS ]] | |
143 | done | |
144 | done | |
145 | fi | |
146 | done | |
147 | done | |
148 | ||
149 | for pool in rbd rbdnonzero; do | |
150 | for i in {0..3}; do | |
151 | compare $pool/img$i $OBJECT_X | |
152 | mkfs_and_mount $pool/img$i | |
153 | if [[ $i -ne 0 ]]; then | |
154 | for child_pool in $pool clonesonly; do | |
155 | for j in {1..3}; do | |
156 | compare $child_pool/$pool-img$i-clone$j $OBJECT_XY | |
157 | done | |
158 | done | |
159 | fi | |
160 | done | |
161 | done | |
162 | ||
163 | # mkfs should discard some objects everywhere but in clonesonly | |
164 | [[ $(rados -p rbd ls | wc -l) -lt $((NUM_META_RBDS + 5 * NUM_OBJECTS)) ]] | |
165 | [[ $(rados -p repdata ls | wc -l) -lt $((1 + 14 * NUM_OBJECTS)) ]] | |
166 | [[ $(rados -p ecdata ls | wc -l) -lt $((1 + 14 * NUM_OBJECTS)) ]] | |
167 | [[ $(rados -p rbdnonzero ls | wc -l) -lt $((NUM_META_RBDS + 5 * NUM_OBJECTS)) ]] | |
168 | [[ $(rados -p clonesonly ls | wc -l) -eq $((NUM_META_CLONESONLY + 6 * NUM_OBJECTS)) ]] | |
169 | ||
170 | echo OK |