]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh -ex | |
2 | ||
3 | # V1 image unsupported but required for testing purposes | |
4 | export RBD_FORCE_ALLOW_V1=1 | |
5 | ||
6 | # returns data pool for a given image | |
7 | get_image_data_pool () { | |
8 | image=$1 | |
9 | data_pool=$(rbd info $image | grep "data_pool: " | awk -F':' '{ print $NF }') | |
10 | if [ -z $data_pool ]; then | |
11 | data_pool='rbd' | |
12 | fi | |
13 | ||
14 | echo $data_pool | |
15 | } | |
16 | ||
17 | # return list of object numbers populated in image | |
18 | objects () { | |
19 | image=$1 | |
20 | prefix=$(rbd info $image | grep block_name_prefix | awk '{print $NF;}') | |
21 | ||
22 | # strip off prefix and leading zeros from objects; sort, although | |
23 | # it doesn't necessarily make sense as they're hex, at least it makes | |
24 | # the list repeatable and comparable | |
25 | objects=$(rados ls -p $(get_image_data_pool $image) | grep $prefix | \ | |
26 | sed -e 's/'$prefix'\.//' -e 's/^0*\([0-9a-f]\)/\1/' | sort -u) | |
27 | echo $objects | |
28 | } | |
29 | ||
30 | # return false if either files don't compare or their ondisk | |
31 | # sizes don't compare | |
32 | ||
33 | compare_files_and_ondisk_sizes () { | |
34 | cmp -l $1 $2 || return 1 | |
35 | origsize=$(stat $1 --format %b) | |
36 | exportsize=$(stat $2 --format %b) | |
37 | difference=$(($exportsize - $origsize)) | |
38 | difference=${difference#-} # absolute value | |
39 | test $difference -ge 0 -a $difference -lt 4096 | |
40 | } | |
41 | ||
42 | TMPDIR=/tmp/rbd_import_export_$$ | |
43 | rm -rf $TMPDIR | |
44 | mkdir $TMPDIR | |
45 | trap "rm -rf $TMPDIR" INT TERM EXIT | |
46 | ||
47 | # cannot import a dir | |
48 | mkdir foo.$$ | |
49 | rbd import foo.$$ foo.dir && exit 1 || true # should fail | |
50 | rmdir foo.$$ | |
51 | ||
52 | # create a sparse file | |
53 | dd if=/bin/sh of=${TMPDIR}/img bs=1k count=1 seek=10 | |
54 | dd if=/bin/dd of=${TMPDIR}/img bs=1k count=10 seek=100 | |
55 | dd if=/bin/rm of=${TMPDIR}/img bs=1k count=100 seek=1000 | |
56 | dd if=/bin/ls of=${TMPDIR}/img bs=1k seek=10000 | |
57 | dd if=/bin/ln of=${TMPDIR}/img bs=1k seek=100000 | |
58 | dd if=/bin/grep of=${TMPDIR}/img bs=1k seek=1000000 | |
59 | ||
60 | rbd rm testimg || true | |
61 | ||
62 | rbd import $RBD_CREATE_ARGS ${TMPDIR}/img testimg | |
63 | rbd export testimg ${TMPDIR}/img2 | |
64 | rbd export testimg - > ${TMPDIR}/img3 | |
65 | rbd rm testimg | |
66 | cmp ${TMPDIR}/img ${TMPDIR}/img2 | |
67 | cmp ${TMPDIR}/img ${TMPDIR}/img3 | |
68 | rm ${TMPDIR}/img2 ${TMPDIR}/img3 | |
69 | ||
70 | # try again, importing from stdin | |
71 | rbd import $RBD_CREATE_ARGS - testimg < ${TMPDIR}/img | |
72 | rbd export testimg ${TMPDIR}/img2 | |
73 | rbd export testimg - > ${TMPDIR}/img3 | |
74 | rbd rm testimg | |
75 | cmp ${TMPDIR}/img ${TMPDIR}/img2 | |
76 | cmp ${TMPDIR}/img ${TMPDIR}/img3 | |
77 | ||
78 | rm ${TMPDIR}/img ${TMPDIR}/img2 ${TMPDIR}/img3 | |
79 | ||
80 | if rbd help export | grep -q export-format; then | |
81 | # try with --export-format for snapshots | |
82 | dd if=/bin/dd of=${TMPDIR}/img bs=1k count=10 seek=100 | |
83 | rbd import $RBD_CREATE_ARGS ${TMPDIR}/img testimg | |
84 | rbd snap create testimg@snap | |
85 | rbd image-meta set testimg key1 value1 | |
86 | IMAGEMETA_BEFORE=`rbd image-meta list testimg` | |
87 | rbd export --export-format 2 testimg ${TMPDIR}/img_v2 | |
88 | rbd import --export-format 2 ${TMPDIR}/img_v2 testimg_import | |
89 | rbd info testimg_import | |
90 | rbd info testimg_import@snap | |
91 | IMAGEMETA_AFTER=`rbd image-meta list testimg_import` | |
92 | [ "$IMAGEMETA_BEFORE" = "$IMAGEMETA_AFTER" ] | |
93 | ||
94 | # compare the contents between testimg and testimg_import | |
95 | rbd export testimg_import ${TMPDIR}/img_import | |
96 | compare_files_and_ondisk_sizes ${TMPDIR}/img ${TMPDIR}/img_import | |
97 | ||
98 | rbd export testimg@snap ${TMPDIR}/img_snap | |
99 | rbd export testimg_import@snap ${TMPDIR}/img_snap_import | |
100 | compare_files_and_ondisk_sizes ${TMPDIR}/img_snap ${TMPDIR}/img_snap_import | |
101 | ||
102 | rm ${TMPDIR}/img_v2 | |
103 | rm ${TMPDIR}/img_import | |
104 | rm ${TMPDIR}/img_snap | |
105 | rm ${TMPDIR}/img_snap_import | |
106 | ||
107 | rbd snap rm testimg_import@snap | |
108 | rbd remove testimg_import | |
109 | rbd snap rm testimg@snap | |
110 | rbd rm testimg | |
111 | ||
112 | # order | |
113 | rbd import --order 20 ${TMPDIR}/img testimg | |
114 | rbd export --export-format 2 testimg ${TMPDIR}/img_v2 | |
115 | rbd import --export-format 2 ${TMPDIR}/img_v2 testimg_import | |
116 | rbd info testimg_import|grep order|awk '{print $2}'|grep 20 | |
117 | ||
118 | rm ${TMPDIR}/img_v2 | |
119 | ||
120 | rbd remove testimg_import | |
121 | rbd remove testimg | |
122 | ||
123 | # features | |
124 | rbd import --image-feature layering ${TMPDIR}/img testimg | |
125 | FEATURES_BEFORE=`rbd info testimg|grep features` | |
126 | rbd export --export-format 2 testimg ${TMPDIR}/img_v2 | |
127 | rbd import --export-format 2 ${TMPDIR}/img_v2 testimg_import | |
128 | FEATURES_AFTER=`rbd info testimg_import|grep features` | |
129 | if [ "$FEATURES_BEFORE" != "$FEATURES_AFTER" ]; then | |
130 | false | |
131 | fi | |
132 | ||
133 | rm ${TMPDIR}/img_v2 | |
134 | ||
135 | rbd remove testimg_import | |
136 | rbd remove testimg | |
137 | ||
138 | # stripe | |
139 | rbd import --stripe-count 1000 --stripe-unit 4096 ${TMPDIR}/img testimg | |
140 | rbd export --export-format 2 testimg ${TMPDIR}/img_v2 | |
141 | rbd import --export-format 2 ${TMPDIR}/img_v2 testimg_import | |
142 | rbd info testimg_import|grep "stripe unit"|grep -Ei '(4 KiB|4096)' | |
143 | rbd info testimg_import|grep "stripe count"|awk '{print $3}'|grep 1000 | |
144 | ||
145 | rm ${TMPDIR}/img_v2 | |
146 | ||
147 | rbd remove testimg_import | |
148 | rbd remove testimg | |
149 | ||
150 | # snap protect | |
151 | rbd import --image-format=2 ${TMPDIR}/img testimg | |
152 | rbd snap create testimg@snap1 | |
153 | rbd snap create testimg@snap2 | |
154 | rbd snap protect testimg@snap2 | |
155 | rbd export --export-format 2 testimg ${TMPDIR}/snap_protect | |
156 | rbd import --export-format 2 ${TMPDIR}/snap_protect testimg_import | |
157 | rbd info testimg_import@snap1 | grep 'protected: False' | |
158 | rbd info testimg_import@snap2 | grep 'protected: True' | |
159 | ||
160 | rm ${TMPDIR}/snap_protect | |
161 | ||
162 | rbd snap unprotect testimg@snap2 | |
163 | rbd snap unprotect testimg_import@snap2 | |
164 | rbd snap purge testimg | |
165 | rbd snap purge testimg_import | |
166 | rbd remove testimg | |
167 | rbd remove testimg_import | |
168 | fi | |
169 | ||
170 | tiered=0 | |
171 | if ceph osd dump | grep ^pool | grep "'rbd'" | grep tier; then | |
172 | tiered=1 | |
173 | fi | |
174 | ||
175 | # create specifically sparse files | |
176 | # 1 1M block of sparse, 1 1M block of random | |
177 | dd if=/dev/urandom bs=1M seek=1 count=1 of=${TMPDIR}/sparse1 | |
178 | ||
179 | # 1 1M block of random, 1 1M block of sparse | |
180 | dd if=/dev/urandom bs=1M count=1 of=${TMPDIR}/sparse2; truncate ${TMPDIR}/sparse2 -s 2M | |
181 | ||
182 | # 1M-block images; validate resulting blocks | |
183 | ||
184 | # 1M sparse, 1M data | |
185 | rbd rm sparse1 || true | |
186 | rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse1 | |
187 | rbd ls -l | grep sparse1 | grep -Ei '(2 MiB|2048k)' | |
188 | [ $tiered -eq 1 -o "$(objects sparse1)" = '1' ] | |
189 | ||
190 | # export, compare contents and on-disk size | |
191 | rbd export sparse1 ${TMPDIR}/sparse1.out | |
192 | compare_files_and_ondisk_sizes ${TMPDIR}/sparse1 ${TMPDIR}/sparse1.out | |
193 | rm ${TMPDIR}/sparse1.out | |
194 | rbd rm sparse1 | |
195 | ||
196 | # 1M data, 1M sparse | |
197 | rbd rm sparse2 || true | |
198 | rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse2 | |
199 | rbd ls -l | grep sparse2 | grep -Ei '(2 MiB|2048k)' | |
200 | [ $tiered -eq 1 -o "$(objects sparse2)" = '0' ] | |
201 | rbd export sparse2 ${TMPDIR}/sparse2.out | |
202 | compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out | |
203 | rm ${TMPDIR}/sparse2.out | |
204 | rbd rm sparse2 | |
205 | ||
206 | # extend sparse1 to 10 1M blocks, sparse at the end | |
207 | truncate ${TMPDIR}/sparse1 -s 10M | |
208 | # import from stdin just for fun, verify still sparse | |
209 | rbd import $RBD_CREATE_ARGS --order 20 - sparse1 < ${TMPDIR}/sparse1 | |
210 | rbd ls -l | grep sparse1 | grep -Ei '(10 MiB|10240k)' | |
211 | [ $tiered -eq 1 -o "$(objects sparse1)" = '1' ] | |
212 | rbd export sparse1 ${TMPDIR}/sparse1.out | |
213 | compare_files_and_ondisk_sizes ${TMPDIR}/sparse1 ${TMPDIR}/sparse1.out | |
214 | rm ${TMPDIR}/sparse1.out | |
215 | rbd rm sparse1 | |
216 | ||
217 | # extend sparse2 to 4M total with two more nonsparse megs | |
218 | dd if=/dev/urandom bs=2M count=1 of=${TMPDIR}/sparse2 oflag=append conv=notrunc | |
219 | # again from stding | |
220 | rbd import $RBD_CREATE_ARGS --order 20 - sparse2 < ${TMPDIR}/sparse2 | |
221 | rbd ls -l | grep sparse2 | grep -Ei '(4 MiB|4096k)' | |
222 | [ $tiered -eq 1 -o "$(objects sparse2)" = '0 2 3' ] | |
223 | rbd export sparse2 ${TMPDIR}/sparse2.out | |
224 | compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out | |
225 | rm ${TMPDIR}/sparse2.out | |
226 | rbd rm sparse2 | |
227 | ||
228 | # zeros import to a sparse image. Note: all zeros currently | |
229 | # doesn't work right now due to the way we handle 'empty' fiemaps; | |
230 | # the image ends up zero-filled. | |
231 | ||
232 | echo "partially-sparse file imports to partially-sparse image" | |
233 | rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse1 sparse | |
234 | [ $tiered -eq 1 -o "$(objects sparse)" = '1' ] | |
235 | rbd rm sparse | |
236 | ||
237 | echo "zeros import through stdin to sparse image" | |
238 | # stdin | |
239 | dd if=/dev/zero bs=1M count=4 | rbd import $RBD_CREATE_ARGS - sparse | |
240 | [ $tiered -eq 1 -o "$(objects sparse)" = '' ] | |
241 | rbd rm sparse | |
242 | ||
243 | echo "zeros export to sparse file" | |
244 | # Must be tricky to make image "by hand" ; import won't create a zero image | |
245 | rbd create $RBD_CREATE_ARGS sparse --size 4 | |
246 | prefix=$(rbd info sparse | grep block_name_prefix | awk '{print $NF;}') | |
247 | # drop in 0 object directly | |
248 | dd if=/dev/zero bs=4M count=1 | rados -p $(get_image_data_pool sparse) \ | |
249 | put ${prefix}.000000000000 - | |
250 | [ $tiered -eq 1 -o "$(objects sparse)" = '0' ] | |
251 | # 1 object full of zeros; export should still create 0-disk-usage file | |
252 | rm ${TMPDIR}/sparse || true | |
253 | rbd export sparse ${TMPDIR}/sparse | |
254 | [ $(stat ${TMPDIR}/sparse --format=%b) = '0' ] | |
255 | rbd rm sparse | |
256 | ||
257 | rm ${TMPDIR}/sparse ${TMPDIR}/sparse1 ${TMPDIR}/sparse2 ${TMPDIR}/sparse3 || true | |
258 | ||
259 | echo OK |