3 # V1 image unsupported but required for testing purposes
4 export RBD_FORCE_ALLOW_V1
=1
6 # returns data pool for a given image
7 get_image_data_pool
() {
9 data_pool
=$
(rbd info
$image |
grep "data_pool: " |
awk -F':' '{ print $NF }')
10 if [ -z $data_pool ]; then
17 # return list of object numbers populated in image
20 prefix
=$
(rbd info
$image |
grep block_name_prefix |
awk '{print $NF;}')
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)
30 # return false if either files don't compare or their ondisk
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
42 TMPDIR
=/tmp
/rbd_import_export_$$
45 trap "rm -rf $TMPDIR" INT TERM EXIT
49 rbd import foo.$$ foo.dir
&& exit 1 || true
# should fail
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
60 rbd
rm testimg || true
62 rbd import
$RBD_CREATE_ARGS ${TMPDIR}/img testimg
63 rbd
export testimg
${TMPDIR}/img2
64 rbd
export testimg
- > ${TMPDIR}/img3
66 cmp ${TMPDIR}/img
${TMPDIR}/img2
67 cmp ${TMPDIR}/img
${TMPDIR}/img3
68 rm ${TMPDIR}/img2
${TMPDIR}/img3
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
75 cmp ${TMPDIR}/img
${TMPDIR}/img2
76 cmp ${TMPDIR}/img
${TMPDIR}/img3
78 rm ${TMPDIR}/img ${TMPDIR}/img2 ${TMPDIR}/img3
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" ]
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
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
103 rm ${TMPDIR}/img_import
104 rm ${TMPDIR}/img_snap
105 rm ${TMPDIR}/img_snap_import
107 rbd snap
rm testimg_import@snap
108 rbd remove testimg_import
109 rbd snap
rm testimg@snap
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
120 rbd remove testimg_import
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
135 rbd remove testimg_import
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
147 rbd remove testimg_import
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'
160 rm ${TMPDIR}/snap_protect
162 rbd snap unprotect testimg@snap2
163 rbd snap unprotect testimg_import@snap2
164 rbd snap purge testimg
165 rbd snap purge testimg_import
167 rbd remove testimg_import
171 if ceph osd dump |
grep ^pool |
grep "'rbd'" |
grep tier
; then
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
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
182 # 1M-block images; validate resulting blocks
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' ]
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
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
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
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
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
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.
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' ]
237 echo "zeros import through stdin to sparse image"
239 dd if=/dev
/zero bs
=1M count
=4 | rbd import
$RBD_CREATE_ARGS - sparse
240 [ $tiered -eq 1 -o "$(objects sparse)" = '' ]
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' ]
257 rm ${TMPDIR}/sparse ${TMPDIR}/sparse1 ${TMPDIR}/sparse2 ${TMPDIR}/sparse3 || true