]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/import_export.sh
bump version to 18.2.2-pve1
[ceph.git] / ceph / qa / workunits / rbd / import_export.sh
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