11 if [ "$1" == "--tee" ]; then
22 echo "RUN_EXPECT_SUCC: " "$@"
24 [ $?
-ne 0 ] && die
"expected success, but got failure! cmd: $@"
32 if [ -n "$CEPH_BIN" ] ; then
34 RADOS_TOOL
="$CEPH_BIN/rados"
35 CEPH_TOOL
="$CEPH_BIN/ceph"
36 DEDUP_TOOL
="$CEPH_BIN/ceph-dedup-tool"
38 # executables should be installed by the QA env
39 RADOS_TOOL
=$
(which rados
)
40 CEPH_TOOL
=$
(which ceph
)
41 DEDUP_TOOL
=$
(which ceph-dedup-tool
)
47 [ -x "$RADOS_TOOL" ] || die
"couldn't find $RADOS_TOOL binary to test"
48 [ -x "$CEPH_TOOL" ] || die
"couldn't find $CEPH_TOOL binary to test"
50 run_expect_succ
"$CEPH_TOOL" osd pool create
"$POOL" 8
53 function test_dedup_ratio_fixed
()
56 dd if=/dev
/urandom of
=dedup_object_1k bs
=1K count
=1
59 dd if=dedup_object_1k of
=dedup_object_100k bs
=1K oflag
=append conv
=notrunc
63 dd if=/dev
/zero of
=dedup_object_100k bs
=1K count
=1 oflag
=append conv
=notrunc
66 $RADOS_TOOL -p $POOL put
$OBJ .
/dedup_object_100k
67 RESULT
=$
($DEDUP_TOOL --op estimate
--pool $POOL --chunk-size 1024 --chunk-algorithm fixed
--fingerprint-algorithm sha1 |
grep chunk_size_average |
awk '{print$2}' |
sed "s/\,//g")
68 # total size / the number of deduped object = 100K / 1
69 if [ 51200 -ne $RESULT ];
71 die
"Estimate failed expecting 51200 result $RESULT"
75 dd if=/dev
/zero of
=dedup_object_10m bs
=10M count
=1
77 $RADOS_TOOL -p $POOL put
$OBJ .
/dedup_object_10m
78 RESULT
=$
($DEDUP_TOOL --op estimate
--pool $POOL --chunk-size 4096 --chunk-algorithm fixed
--fingerprint-algorithm sha1 |
grep examined_bytes |
awk '{print$2}')
80 if [ 10485760 -ne $RESULT ];
82 die
"Estimate failed expecting 10485760 result $RESULT"
88 dd if=/dev
/zero of
=dedup_object_
$num bs
=4M count
=1
89 $RADOS_TOOL -p $POOL put dedup_object_
$num .
/dedup_object_
$num
92 RESULT
=$
($DEDUP_TOOL --op estimate
--pool $POOL --chunk-size 4096 --chunk-algorithm fixed
--fingerprint-algorithm sha1
--max-thread 4 |
grep chunk_size_average |
awk '{print$2}' |
sed "s/\,//g")
94 if [ 98566144 -ne $RESULT ];
96 die
"Estimate failed expecting 98566144 result $RESULT"
99 rm -rf .
/dedup_object_1k .
/dedup_object_100k .
/dedup_object_10m
100 for num
in `seq 0 20`
102 rm -rf .
/dedup_object_
$num
104 $RADOS_TOOL -p $POOL rm $OBJ
105 for num
in `seq 0 20`
107 $RADOS_TOOL -p $POOL rm dedup_object_
$num
111 function test_dedup_chunk_scrub
()
114 CHUNK_POOL
=dedup_chunk_pool
115 run_expect_succ
"$CEPH_TOOL" osd pool create
"$CHUNK_POOL" 8
117 echo "hi there" > foo
119 echo "hi there" > bar
121 echo "there" > foo-chunk
123 echo "CHUNK" > bar-chunk
125 $CEPH_TOOL osd pool
set $POOL fingerprint_algorithm sha1
--yes-i-really-mean-it
126 $CEPH_TOOL osd pool
set $POOL dedup_chunk_algorithm fastcdc
--yes-i-really-mean-it
127 $CEPH_TOOL osd pool
set $POOL dedup_cdc_chunk_size
4096 --yes-i-really-mean-it
128 $CEPH_TOOL osd pool
set $POOL dedup_tier
$CHUNK_POOL --yes-i-really-mean-it
130 $RADOS_TOOL -p $POOL put foo .
/foo
131 $RADOS_TOOL -p $POOL put bar .
/bar
133 $RADOS_TOOL -p $CHUNK_POOL put bar-chunk .
/bar-chunk
134 $RADOS_TOOL -p $CHUNK_POOL put foo-chunk .
/foo-chunk
136 $RADOS_TOOL -p $POOL set-chunk bar
0 8 --target-pool $CHUNK_POOL bar-chunk
0 --with-reference
138 echo -n "There hi" > test_obj
140 $RADOS_TOOL -p $POOL put foo .
/test_obj
141 $RADOS_TOOL -p $POOL set-chunk foo
0 8 --target-pool $CHUNK_POOL foo-chunk
0 --with-reference
143 $RADOS_TOOL -p $POOL tier-flush foo
146 $RADOS_TOOL ls -p $CHUNK_POOL
147 CHUNK_OID
=$
(echo -n "There hi" |
sha1sum |
awk '{print $1}')
149 POOL_ID
=$
($CEPH_TOOL osd pool
ls detail |
grep $POOL |
awk '{print$2}')
150 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref bar
--target-ref-pool-id $POOL_ID
151 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID)
153 RESULT
=$
($DEDUP_TOOL --op chunk-scrub
--chunk-pool $CHUNK_POOL |
grep "Damaged object" |
awk '{print$4}')
154 if [ $RESULT -ne "1" ] ; then
155 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
156 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
157 die
"Chunk-scrub failed expecting damaged objects is not 1"
160 $DEDUP_TOOL --op chunk-put-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref bar
--target-ref-pool-id $POOL_ID
161 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep bar
)
162 if [ -n "$RESULT" ] ; then
163 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
164 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
165 die
"Scrub failed expecting bar is removed"
168 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
170 rm -rf .
/foo .
/bar .
/foo-chunk .
/bar-chunk .
/test_obj
171 $RADOS_TOOL -p $POOL rm foo
172 $RADOS_TOOL -p $POOL rm bar
175 function test_dedup_chunk_repair
()
178 CHUNK_POOL
=dedup_chunk_pool
179 run_expect_succ
"$CEPH_TOOL" osd pool create
"$CHUNK_POOL" 8
181 echo -n "hi there" > foo
183 echo -n "hi there" > bar
185 echo -n "there" > foo-chunk
187 echo -n "CHUNK" > bar-chunk
189 $CEPH_TOOL osd pool
set $POOL fingerprint_algorithm sha1
--yes-i-really-mean-it
190 $CEPH_TOOL osd pool
set $POOL dedup_chunk_algorithm fastcdc
--yes-i-really-mean-it
191 $CEPH_TOOL osd pool
set $POOL dedup_cdc_chunk_size
4096 --yes-i-really-mean-it
192 $CEPH_TOOL osd pool
set $POOL dedup_tier
$CHUNK_POOL --yes-i-really-mean-it
194 $RADOS_TOOL -p $POOL put foo .
/foo
195 $RADOS_TOOL -p $POOL put bar .
/bar
197 $RADOS_TOOL -p $CHUNK_POOL put bar-chunk .
/bar-chunk
198 $RADOS_TOOL -p $CHUNK_POOL put foo-chunk .
/foo-chunk
200 $RADOS_TOOL ls -p $CHUNK_POOL
201 CHUNK_OID
=$
(echo -n "hi there" |
sha1sum |
awk '{print $1}')
203 POOL_ID
=$
($CEPH_TOOL osd pool
ls detail |
grep $POOL |
awk '{print$2}')
204 $RADOS_TOOL -p $CHUNK_POOL put
$CHUNK_OID .
/foo
206 # increase ref count by two, resuling in mismatch
207 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref foo
--target-ref-pool-id $POOL_ID
208 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref foo
--target-ref-pool-id $POOL_ID
209 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref foo
--target-ref-pool-id $POOL_ID
210 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref foo
--target-ref-pool-id $POOL_ID
211 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object bar-chunk
--target-ref bar
--target-ref-pool-id $POOL_ID
212 $DEDUP_TOOL --op chunk-get-ref
--chunk-pool $CHUNK_POOL --object bar-chunk
--target-ref bar
--target-ref-pool-id $POOL_ID
214 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID)
215 RESULT
=$
($DEDUP_TOOL --op chunk-scrub
--chunk-pool $CHUNK_POOL |
grep "Damaged object" |
awk '{print$4}')
216 if [ $RESULT -ne "2" ] ; then
217 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
218 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
219 die
"Chunk-scrub failed expecting damaged objects is not 1"
222 $DEDUP_TOOL --op chunk-repair
--chunk-pool $CHUNK_POOL --object $CHUNK_OID --target-ref foo
--target-ref-pool-id $POOL_ID
223 $DEDUP_TOOL --op chunk-repair
--chunk-pool $CHUNK_POOL --object bar-chunk
--target-ref bar
--target-ref-pool-id $POOL_ID
225 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep foo |
wc -l)
226 if [ 0 -ne "$RESULT" ] ; then
227 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
228 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
229 die
"Scrub failed expecting bar is removed"
231 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object bar-chunk |
grep bar |
wc -l)
232 if [ 0 -ne "$RESULT" ] ; then
233 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
234 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
235 die
"Scrub failed expecting bar is removed"
238 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
240 rm -rf .
/foo .
/bar .
/foo-chunk .
/bar-chunk .
/test_obj
241 $RADOS_TOOL -p $POOL rm foo
242 $RADOS_TOOL -p $POOL rm bar
245 function test_dedup_object
()
248 CHUNK_POOL
=dedup_chunk_pool
249 run_expect_succ
"$CEPH_TOOL" osd pool create
"$CHUNK_POOL" 8
251 echo "There hiHI" > foo
253 $CEPH_TOOL osd pool
set $POOL dedup_tier
$CHUNK_POOL --yes-i-really-mean-it
254 $RADOS_TOOL -p $POOL put foo .
/foo
258 rados
ls -p $CHUNK_POOL
260 RESULT
=$
($DEDUP_TOOL --pool $POOL --op chunk-dedup
--object foo
--chunk-pool $CHUNK_POOL --source-off 0 --source-length 10 --fingerprint-algorithm sha1
)
262 POOL_ID
=$
($CEPH_TOOL osd pool
ls detail |
grep $POOL |
awk '{print$2}')
263 CHUNK_OID
=$
(echo -n "There hiHI" |
sha1sum |
awk '{print $1}')
265 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep foo
)
267 if [ -z "$RESULT" ] ; then
268 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
269 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
270 die
"Scrub failed expecting bar is removed"
273 $RADOS_TOOL -p $CHUNK_POOL get
$CHUNK_OID .
/chunk
274 VERIFY
=$
(cat .
/chunk |
sha1sum |
awk '{print $1}')
275 if [ "$CHUNK_OID" != "$VERIFY" ] ; then
276 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
277 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
278 die
"Comparing failed expecting chunk mismatch"
281 echo -n "There hihiHI" > bar
283 $RADOS_TOOL -p $POOL put bar .
/bar
284 RESULT
=$
($DEDUP_TOOL --pool $POOL --op object-dedup
--object bar
--chunk-pool $CHUNK_POOL --fingerprint-algorithm sha1
--dedup-cdc-chunk-size 4096)
286 CHUNK_OID
=$
(echo -n "There hihiHI" |
sha1sum |
awk '{print $1}')
288 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep bar
)
289 if [ -z "$RESULT" ] ; then
290 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
291 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
292 die
"Scrub failed expecting bar is removed"
295 $RADOS_TOOL -p $CHUNK_POOL get
$CHUNK_OID .
/chunk
296 VERIFY
=$
(cat .
/chunk |
sha1sum |
awk '{print $1}')
297 if [ "$CHUNK_OID" != "$VERIFY" ] ; then
298 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
299 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
300 die
"Comparing failed expecting chunk mismatch"
303 echo -n "THERE HIHIHI" > bar
304 $RADOS_TOOL -p $POOL put bar .
/bar
305 $RADOS_TOOL -p $POOL mksnap mysnap
307 echo -n "There HIHIHI" > bar
308 $RADOS_TOOL -p $POOL put bar .
/bar
310 RESULT
=$
($DEDUP_TOOL --pool $POOL --op object-dedup
--object bar
--chunk-pool $CHUNK_POOL --fingerprint-algorithm sha1
--dedup-cdc-chunk-size 4096 --snap)
312 CHUNK_OID
=$
(echo -n "THERE HIHIHI" |
sha1sum |
awk '{print $1}')
313 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep bar
)
314 if [ -z "$RESULT" ] ; then
315 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
316 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
317 die
"Scrub failed expecting bar is removed"
320 CHUNK_OID
=$
(echo -n "There HIHIHI" |
sha1sum |
awk '{print $1}')
321 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep bar
)
322 if [ -z "$RESULT" ] ; then
323 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
324 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
325 die
"Scrub failed expecting bar is removed"
329 RESULT
=$
($DEDUP_TOOL --pool $POOL --op object-dedup
--object bar
--chunk-pool $CHUNK_POOL --fingerprint-algorithm sha1
--dedup-cdc-chunk-size 4096)
331 CHUNK_OID
=$
(echo -n "There HIHIHI" |
sha1sum |
awk '{print $1}')
332 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID |
grep bar
)
333 if [ -z "$RESULT" ] ; then
334 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
335 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
336 die
"Scrub failed expecting bar is removed"
339 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
341 rm -rf .
/foo .
/bar .
/chunk
342 $RADOS_TOOL -p $POOL rm foo
343 $RADOS_TOOL -p $POOL rm bar
346 function test_sample_dedup
()
348 CHUNK_POOL
=dedup_chunk_pool
349 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
350 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
354 run_expect_succ
"$CEPH_TOOL" osd pool create
"$POOL" 8
355 run_expect_succ
"$CEPH_TOOL" osd pool create
"$CHUNK_POOL" 8
356 run_expect_succ
"$CEPH_TOOL" osd pool
set "$POOL" dedup_tier
"$CHUNK_POOL"
357 run_expect_succ
"$CEPH_TOOL" osd pool
set "$POOL" dedup_chunk_algorithm fastcdc
358 run_expect_succ
"$CEPH_TOOL" osd pool
set "$POOL" dedup_cdc_chunk_size
8192
359 run_expect_succ
"$CEPH_TOOL" osd pool
set "$POOL" fingerprint_algorithm sha1
361 # 8 Dedupable objects
362 CONTENT_1
="There hiHI"
363 echo $CONTENT_1 > foo
366 $RADOS_TOOL -p $POOL put foo_
$num .
/foo
370 CONTENT_3
="There hiHI3"
371 echo $CONTENT_3 > foo3
372 $RADOS_TOOL -p $POOL put foo3_1 .
/foo3
376 # Execute dedup crawler
377 RESULT
=$
($DEDUP_TOOL --pool $POOL --chunk-pool $CHUNK_POOL --op sample-dedup
--chunk-algorithm fastcdc
--fingerprint-algorithm sha1
--chunk-dedup-threshold 3 --sampling-ratio 50)
379 CHUNK_OID_1
=$
(echo $CONTENT_1 |
sha1sum |
awk '{print $1}')
380 CHUNK_OID_3
=$
(echo $CONTENT_3 |
sha1sum |
awk '{print $1}')
382 # Find chunk object has references of 8 dedupable meta objects
383 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID_1)
387 GREP_RESULT
=$
(echo $RESULT |
grep foo_
$num)
388 if [ -n "$GREP_RESULT" ]; then
389 DEDUP_COUNT
=$
(($DEDUP_COUNT + 1))
392 if [ $DEDUP_COUNT -lt 2 ]; then
393 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
394 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
395 die
"Chunk object has no reference of first meta object"
398 # 7 Duplicated objects but less than chunk dedup threshold
399 CONTENT_2
="There hiHI2"
400 echo $CONTENT_2 > foo2
403 $RADOS_TOOL -p $POOL put foo2_
$num .
/foo2
405 CHUNK_OID_2
=$
(echo $CONTENT_2 |
sha1sum |
awk '{print $1}')
407 RESULT
=$
($DEDUP_TOOL --pool $POOL --chunk-pool $CHUNK_POOL --op sample-dedup
--chunk-algorithm fastcdc
--fingerprint-algorithm sha1
--sampling-ratio 100 --chunk-dedup-threshold 2)
409 # Objects duplicates less than chunk dedup threshold should be deduplicated because of they satisfies object-dedup-threshold
410 # The only object, which is crawled at the very first, should not be deduplicated because it was not duplicated at initial time
411 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID_2)
415 GREP_RESULT
=$
(echo $RESULT |
grep foo2_
$num)
416 if [ -n "$GREP_RESULT" ]; then
417 DEDUP_COUNT
=$
(($DEDUP_COUNT + 1))
420 if [ $DEDUP_COUNT -ne 6 ]; then
421 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
422 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
423 die
"Chunk object has no reference of first meta object"
426 # Unique object should not be deduplicated
427 RESULT
=$
($DEDUP_TOOL --op dump-chunk-refs
--chunk-pool $CHUNK_POOL --object $CHUNK_OID_3)
428 GREP_RESULT
=$
($RESULT |
grep $CHUNK_OID_3)
429 if [ -n "$GREP_RESULT" ]; then
430 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it
431 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
432 die
"Chunk object has no reference of second meta object"
435 rm -rf .
/foo .
/foo2 .
/foo3
438 $RADOS_TOOL -p $POOL rm foo_
$num
442 $RADOS_TOOL -p $POOL rm foo2_
$num
444 $RADOS_TOOL -p $POOL rm foo3_1
446 $CEPH_TOOL osd pool delete
$CHUNK_POOL $CHUNK_POOL --yes-i-really-really-mean-it
449 test_dedup_ratio_fixed
450 test_dedup_chunk_scrub
451 test_dedup_chunk_repair
455 $CEPH_TOOL osd pool delete
$POOL $POOL --yes-i-really-really-mean-it