3 # Copyright (C) 2014 Red Hat <contact@redhat.com>
5 # Author: Loic Dachary <loic@dachary.org>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU Library Public License as published by
9 # the Free Software Foundation; either version 2, or (at your option)
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Library Public License for more details.
17 source $CEPH_ROOT/qa
/standalone
/ceph-helpers.sh
19 if [ `uname` = FreeBSD
]; then
20 # erasure coding overwrites are only tested on Bluestore
21 # erasure coding on filestore is unsafe
22 # http://docs.ceph.com/docs/master/rados/operations/erasure-code/#erasure-coding-with-overwrites
23 use_ec_overwrite
=false
28 # Test development and debugging
29 # Set to "yes" in order to ignore diff errors and save results to update test
32 # Filter out mtime and local_mtime dates, version, prior_version and last_reqid (client) from any object_info.
33 jqfilter
='def walk(f):
35 | if type == "object" then
37 ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
38 elif type == "array" then map( walk(f) ) | f
41 walk(if type == "object" then del(.mtime) else . end)
42 | walk(if type == "object" then del(.local_mtime) else . end)
43 | walk(if type == "object" then del(.last_reqid) else . end)
44 | walk(if type == "object" then del(.version) else . end)
45 | walk(if type == "object" then del(.prior_version) else . end)
46 | walk(if type == "object" then del(.redirect_target) else . end)
47 | walk(if type == "object" then del(.legacy_snaps) else . end)'
49 sortkeys
='import json; import sys ; JSON=sys.stdin.read() ; ud = json.loads(JSON) ; print json.dumps(ud, sort_keys=True, indent=2)'
55 export CEPH_MON
="127.0.0.1:7107" # git grep '\<7107\>' : there must be only one
57 CEPH_ARGS
+="--fsid=$(uuidgen) --auth-supported=none "
58 CEPH_ARGS
+="--mon-host=$CEPH_MON "
60 local funcs
=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
61 for func
in $funcs ; do
62 $func $dir ||
return 1
66 function add_something
() {
69 local obj
=${3:-SOMETHING}
70 local scrub
=${4:-noscrub}
72 if [ "$scrub" = "noscrub" ];
74 ceph osd
set noscrub ||
return 1
75 ceph osd
set nodeep-scrub ||
return 1
77 ceph osd
unset noscrub ||
return 1
78 ceph osd
unset nodeep-scrub ||
return 1
82 echo $payload > $dir/ORIGINAL
83 rados
--pool $poolname put
$obj $dir/ORIGINAL ||
return 1
87 # Corrupt one copy of a replicated pool
89 function TEST_corrupt_and_repair_replicated
() {
93 setup
$dir ||
return 1
94 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
95 run_mgr
$dir x ||
return 1
96 run_osd
$dir 0 ||
return 1
97 run_osd
$dir 1 ||
return 1
98 create_rbd_pool ||
return 1
99 wait_for_clean ||
return 1
101 add_something
$dir $poolname ||
return 1
102 corrupt_and_repair_one
$dir $poolname $
(get_not_primary
$poolname SOMETHING
) ||
return 1
103 # Reproduces http://tracker.ceph.com/issues/8914
104 corrupt_and_repair_one
$dir $poolname $
(get_primary
$poolname SOMETHING
) ||
return 1
106 teardown
$dir ||
return 1
109 function corrupt_and_repair_two
() {
116 # 1) remove the corresponding file from the OSDs
119 run_in_background pids objectstore_tool
$dir $first SOMETHING remove
120 run_in_background pids objectstore_tool
$dir $second SOMETHING remove
123 if [ $return_code -ne 0 ]; then return $return_code; fi
128 local pg
=$
(get_pg
$poolname SOMETHING
)
131 # 3) The files must be back
134 run_in_background pids objectstore_tool
$dir $first SOMETHING list-attrs
135 run_in_background pids objectstore_tool
$dir $second SOMETHING list-attrs
138 if [ $return_code -ne 0 ]; then return $return_code; fi
140 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
141 diff $dir/ORIGINAL
$dir/COPY ||
return 1
146 # 2) remove the corresponding file from a designated OSD
148 # 4) check that the file has been restored in the designated OSD
150 function corrupt_and_repair_one
() {
156 # 1) remove the corresponding file from the OSD
158 objectstore_tool
$dir $osd SOMETHING remove ||
return 1
162 local pg
=$
(get_pg
$poolname SOMETHING
)
165 # 3) The file must be back
167 objectstore_tool
$dir $osd SOMETHING list-attrs ||
return 1
168 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
169 diff $dir/ORIGINAL
$dir/COPY ||
return 1
172 function corrupt_and_repair_erasure_coded
() {
176 add_something
$dir $poolname ||
return 1
178 local primary
=$
(get_primary
$poolname SOMETHING
)
179 local -a osds
=($
(get_osds
$poolname SOMETHING |
sed -e "s/$primary//"))
180 local not_primary_first
=${osds[0]}
181 local not_primary_second
=${osds[1]}
183 # Reproduces http://tracker.ceph.com/issues/10017
184 corrupt_and_repair_one
$dir $poolname $primary ||
return 1
185 # Reproduces http://tracker.ceph.com/issues/10409
186 corrupt_and_repair_one
$dir $poolname $not_primary_first ||
return 1
187 corrupt_and_repair_two
$dir $poolname $not_primary_first $not_primary_second ||
return 1
188 corrupt_and_repair_two
$dir $poolname $primary $not_primary_first ||
return 1
192 function create_ec_pool
() {
194 local allow_overwrites
=$2
196 ceph osd erasure-code-profile
set myprofile crush-failure-domain
=osd
$3 $4 $5 $6 $7 ||
return 1
198 create_pool
"$poolname" 1 1 erasure myprofile ||
return 1
200 if [ "$allow_overwrites" = "true" ]; then
201 ceph osd pool
set "$poolname" allow_ec_overwrites true ||
return 1
204 wait_for_clean ||
return 1
208 function auto_repair_erasure_coded
() {
210 local allow_overwrites
=$2
211 local poolname
=ecpool
213 # Launch a cluster with 5 seconds scrub interval
214 setup
$dir ||
return 1
215 run_mon
$dir a ||
return 1
216 run_mgr
$dir x ||
return 1
217 local ceph_osd_args
="--osd-scrub-auto-repair=true \
218 --osd-deep-scrub-interval=5 \
219 --osd-scrub-max-interval=5 \
220 --osd-scrub-min-interval=5 \
221 --osd-scrub-interval-randomize-ratio=0"
222 for id
in $
(seq 0 2) ; do
223 if [ "$allow_overwrites" = "true" ]; then
224 run_osd_bluestore
$dir $id $ceph_osd_args ||
return 1
226 run_osd
$dir $id $ceph_osd_args ||
return 1
229 create_rbd_pool ||
return 1
230 wait_for_clean ||
return 1
233 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 ||
return 1
237 echo $payload > $dir/ORIGINAL
238 rados
--pool $poolname put SOMETHING
$dir/ORIGINAL ||
return 1
240 # Remove the object from one shard physically
241 # Restarted osd get $ceph_osd_args passed
242 objectstore_tool
$dir $
(get_not_primary
$poolname SOMETHING
) SOMETHING remove ||
return 1
243 # Wait for auto repair
244 local pgid
=$
(get_pg
$poolname SOMETHING
)
245 wait_for_scrub
$pgid "$(get_last_scrub_stamp $pgid)"
246 wait_for_clean ||
return 1
247 # Verify - the file should be back
248 # Restarted osd get $ceph_osd_args passed
249 objectstore_tool
$dir $
(get_not_primary
$poolname SOMETHING
) SOMETHING list-attrs ||
return 1
250 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
251 diff $dir/ORIGINAL
$dir/COPY ||
return 1
254 teardown
$dir ||
return 1
257 function TEST_auto_repair_erasure_coded_appends
() {
258 auto_repair_erasure_coded
$1 false
261 function TEST_auto_repair_erasure_coded_overwrites
() {
262 if [ "$use_ec_overwrite" = "true" ]; then
263 auto_repair_erasure_coded
$1 true
267 function corrupt_and_repair_jerasure
() {
269 local allow_overwrites
=$2
270 local poolname
=ecpool
272 setup
$dir ||
return 1
273 run_mon
$dir a ||
return 1
274 run_mgr
$dir x ||
return 1
275 for id
in $
(seq 0 3) ; do
276 if [ "$allow_overwrites" = "true" ]; then
277 run_osd_bluestore
$dir $id ||
return 1
279 run_osd
$dir $id ||
return 1
282 create_rbd_pool ||
return 1
283 wait_for_clean ||
return 1
285 create_ec_pool
$poolname $allow_overwrites k
=2 m
=2 ||
return 1
286 corrupt_and_repair_erasure_coded
$dir $poolname ||
return 1
288 teardown
$dir ||
return 1
291 function TEST_corrupt_and_repair_jerasure_appends
() {
292 corrupt_and_repair_jerasure
$1
295 function TEST_corrupt_and_repair_jerasure_overwrites
() {
296 if [ "$use_ec_overwrite" = "true" ]; then
297 corrupt_and_repair_jerasure
$1 true
301 function corrupt_and_repair_lrc
() {
303 local allow_overwrites
=$2
304 local poolname
=ecpool
306 setup
$dir ||
return 1
307 run_mon
$dir a ||
return 1
308 run_mgr
$dir x ||
return 1
309 for id
in $
(seq 0 9) ; do
310 if [ "$allow_overwrites" = "true" ]; then
311 run_osd_bluestore
$dir $id ||
return 1
313 run_osd
$dir $id ||
return 1
316 create_rbd_pool ||
return 1
317 wait_for_clean ||
return 1
319 create_ec_pool
$poolname $allow_overwrites k
=4 m
=2 l
=3 plugin
=lrc ||
return 1
320 corrupt_and_repair_erasure_coded
$dir $poolname ||
return 1
322 teardown
$dir ||
return 1
325 function TEST_corrupt_and_repair_lrc_appends
() {
326 corrupt_and_repair_jerasure
$1
329 function TEST_corrupt_and_repair_lrc_overwrites
() {
330 if [ "$use_ec_overwrite" = "true" ]; then
331 corrupt_and_repair_jerasure
$1 true
335 function unfound_erasure_coded
() {
337 local allow_overwrites
=$2
338 local poolname
=ecpool
341 setup
$dir ||
return 1
342 run_mon
$dir a ||
return 1
343 run_mgr
$dir x ||
return 1
344 for id
in $
(seq 0 3) ; do
345 if [ "$allow_overwrites" = "true" ]; then
346 run_osd_bluestore
$dir $id ||
return 1
348 run_osd
$dir $id ||
return 1
351 create_rbd_pool ||
return 1
352 wait_for_clean ||
return 1
354 create_ec_pool
$poolname $allow_overwrites k
=2 m
=2 ||
return 1
356 add_something
$dir $poolname ||
return 1
358 local primary
=$
(get_primary
$poolname SOMETHING
)
359 local -a osds
=($
(get_osds
$poolname SOMETHING |
sed -e "s/$primary//"))
360 local not_primary_first
=${osds[0]}
361 local not_primary_second
=${osds[1]}
362 local not_primary_third
=${osds[2]}
365 # 1) remove the corresponding file from the OSDs
368 run_in_background pids objectstore_tool
$dir $not_primary_first SOMETHING remove
369 run_in_background pids objectstore_tool
$dir $not_primary_second SOMETHING remove
370 run_in_background pids objectstore_tool
$dir $not_primary_third SOMETHING remove
373 if [ $return_code -ne 0 ]; then return $return_code; fi
378 local pg
=$
(get_pg
$poolname SOMETHING
)
383 # it may take a bit to appear due to mon/mgr asynchrony
384 for f
in `seq 1 60`; do
385 ceph
-s |
grep "1/1 objects unfound" && break
388 ceph
-s|
grep "4 osds: 4 up, 4 in" ||
return 1
389 ceph
-s|
grep "1/1 objects unfound" ||
return 1
391 teardown
$dir ||
return 1
394 function TEST_unfound_erasure_coded_appends
() {
395 unfound_erasure_coded
$1
398 function TEST_unfound_erasure_coded_overwrites
() {
399 if [ "$use_ec_overwrite" = "true" ]; then
400 unfound_erasure_coded
$1 true
405 # list_missing for EC pool
407 function list_missing_erasure_coded
() {
409 local allow_overwrites
=$2
410 local poolname
=ecpool
412 setup
$dir ||
return 1
413 run_mon
$dir a ||
return 1
414 run_mgr
$dir x ||
return 1
415 for id
in $
(seq 0 2) ; do
416 if [ "$allow_overwrites" = "true" ]; then
417 run_osd_bluestore
$dir $id ||
return 1
419 run_osd
$dir $id ||
return 1
422 create_rbd_pool ||
return 1
423 wait_for_clean ||
return 1
425 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 ||
return 1
427 # Put an object and remove the two shards (including primary)
428 add_something
$dir $poolname MOBJ0 ||
return 1
429 local -a osds0
=($
(get_osds
$poolname MOBJ0
))
431 # Put another object and remove two shards (excluding primary)
432 add_something
$dir $poolname MOBJ1 ||
return 1
433 local -a osds1
=($
(get_osds
$poolname MOBJ1
))
435 # Stop all osd daemons
436 for id
in $
(seq 0 2) ; do
437 kill_daemons
$dir TERM osd.
$id >&2 < /dev
/null ||
return 1
441 ceph-objectstore-tool
--data-path $dir/$id \
442 MOBJ0 remove ||
return 1
444 ceph-objectstore-tool
--data-path $dir/$id \
445 MOBJ0 remove ||
return 1
448 ceph-objectstore-tool
--data-path $dir/$id \
449 MOBJ1 remove ||
return 1
451 ceph-objectstore-tool
--data-path $dir/$id \
452 MOBJ1 remove ||
return 1
454 for id
in $
(seq 0 2) ; do
455 activate_osd
$dir $id >&2 ||
return 1
457 create_rbd_pool ||
return 1
458 wait_for_clean ||
return 1
460 # Get get - both objects should in the same PG
461 local pg
=$
(get_pg
$poolname MOBJ0
)
463 # Repair the PG, which triggers the recovering,
464 # and should mark the object as unfound
467 for i
in $
(seq 0 120) ; do
468 [ $i -lt 60 ] ||
return 1
469 matches
=$
(ceph pg
$pg list_missing |
egrep "MOBJ0|MOBJ1" |
wc -l)
470 [ $matches -eq 2 ] && break
473 teardown
$dir ||
return 1
476 function TEST_list_missing_erasure_coded_appends
() {
477 list_missing_erasure_coded
$1 false
480 function TEST_list_missing_erasure_coded_overwrites
() {
481 if [ "$use_ec_overwrite" = "true" ]; then
482 list_missing_erasure_coded
$1 true
487 # Corrupt one copy of a replicated pool
489 function TEST_corrupt_scrub_replicated
() {
491 local poolname
=csr_pool
494 setup
$dir ||
return 1
495 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
496 run_mgr
$dir x ||
return 1
497 run_osd
$dir 0 ||
return 1
498 run_osd
$dir 1 ||
return 1
499 create_rbd_pool ||
return 1
500 wait_for_clean ||
return 1
502 create_pool foo
1 ||
return 1
503 create_pool
$poolname 1 1 ||
return 1
504 wait_for_clean ||
return 1
506 for i
in $
(seq 1 $total_objs) ; do
508 add_something
$dir $poolname $objname ||
return 1
510 rados
--pool $poolname setomapheader
$objname hdr-
$objname ||
return 1
511 rados
--pool $poolname setomapval
$objname key-
$objname val-
$objname ||
return 1
514 local pg
=$
(get_pg
$poolname ROBJ0
)
516 # Compute an old omap digest and save oi
517 CEPH_ARGS
='' ceph daemon $
(get_asok_path osd
.0) \
518 config
set osd_deep_scrub_update_digest_min_age
0
519 CEPH_ARGS
='' ceph daemon $
(get_asok_path osd
.1) \
520 config
set osd_deep_scrub_update_digest_min_age
0
523 for i
in $
(seq 1 $total_objs) ; do
526 # Alternate corruption between osd.0 and osd.1
527 local osd
=$
(expr $i % 2)
531 # Size (deep scrub data_digest too)
532 local payload
=UVWXYZZZ
533 echo $payload > $dir/CORRUPT
534 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
538 # digest (deep scrub only)
540 echo $payload > $dir/CORRUPT
541 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
546 objectstore_tool
$dir $osd $objname remove ||
return 1
550 # Modify omap value (deep scrub only)
551 objectstore_tool
$dir $osd $objname set-omap key-
$objname $dir/CORRUPT ||
return 1
555 # Delete omap key (deep scrub only)
556 objectstore_tool
$dir $osd $objname rm-omap key-
$objname ||
return 1
560 # Add extra omap key (deep scrub only)
561 echo extra
> $dir/extra-val
562 objectstore_tool
$dir $osd $objname set-omap key2-
$objname $dir/extra-val ||
return 1
567 # Modify omap header (deep scrub only)
568 echo -n newheader
> $dir/hdr
569 objectstore_tool
$dir $osd $objname set-omaphdr
$dir/hdr ||
return 1
574 rados
--pool $poolname setxattr
$objname key1-
$objname val1-
$objname ||
return 1
575 rados
--pool $poolname setxattr
$objname key2-
$objname val2-
$objname ||
return 1
578 echo -n bad-val
> $dir/bad-val
579 objectstore_tool
$dir $osd $objname set-attr _key1-
$objname $dir/bad-val ||
return 1
580 objectstore_tool
$dir $osd $objname rm-attr _key2-
$objname ||
return 1
581 echo -n val3-
$objname > $dir/newval
582 objectstore_tool
$dir $osd $objname set-attr _key3-
$objname $dir/newval ||
return 1
583 rm $dir/bad-val
$dir/newval
587 objectstore_tool
$dir $osd $objname get-attr _
> $dir/robj9-oi
588 echo -n D
> $dir/change
589 rados
--pool $poolname put
$objname $dir/change
590 objectstore_tool
$dir $osd $objname set-attr _
$dir/robj9-oi
591 rm $dir/oi
$dir/change
594 # ROBJ10 must be handled after digests are re-computed by a deep scrub below
595 # ROBJ11 must be handled with config change before deep scrub
596 # ROBJ12 must be handled with config change before scrubs
597 # ROBJ13 must be handled before scrubs
600 echo -n bad-val
> $dir/bad-val
601 objectstore_tool
$dir 0 $objname set-attr _
$dir/bad-val ||
return 1
602 objectstore_tool
$dir 1 $objname rm-attr _ ||
return 1
607 objectstore_tool
$dir $osd $objname rm-attr _ ||
return 1
611 objectstore_tool
$dir 0 $objname rm-attr snapset ||
return 1
612 echo -n bad-val
> $dir/bad-val
613 objectstore_tool
$dir 1 $objname set-attr snapset
$dir/bad-val ||
return 1
618 local pg
=$
(get_pg
$poolname ROBJ0
)
620 inject_eio rep data
$poolname ROBJ11
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
621 inject_eio rep mdata
$poolname ROBJ12
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
622 inject_eio rep mdata
$poolname ROBJ13
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
623 inject_eio rep data
$poolname ROBJ13
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
627 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
629 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
631 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
633 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
634 # Get epoch for repair-get requests
635 epoch
=$
(jq .epoch
$dir/json
)
637 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
660 "prior_version": "21'3",
661 "last_reqid": "osd.1.0:57",
675 "data_digest": "0x2ddbf8f5",
676 "omap_digest": "0xf5fba2c6",
677 "expected_object_size": 0,
678 "expected_write_size": 0,
679 "alloc_hint_flags": 0,
687 "size_mismatch_info",
688 "obj_size_info_mismatch"
694 "selected_object_info": {
705 "prior_version": "21'3",
706 "last_reqid": "osd.1.0:57",
709 "mtime": "2018-04-05 14:33:19.804040",
710 "local_mtime": "2018-04-05 14:33:19.804839",
720 "data_digest": "0x2ddbf8f5",
721 "omap_digest": "0xf5fba2c6",
722 "expected_object_size": 0,
723 "expected_write_size": 0,
724 "alloc_hint_flags": 0,
730 "union_shard_errors": [
731 "size_mismatch_info",
732 "obj_size_info_mismatch"
761 "selected_object_info": {
772 "prior_version": "43'36",
773 "last_reqid": "osd.1.0:55",
787 "data_digest": "0x2ddbf8f5",
788 "omap_digest": "0x067f306a",
789 "expected_object_size": 0,
790 "expected_write_size": 0,
791 "alloc_hint_flags": 0,
797 "union_shard_errors": [
825 "selected_object_info": {
836 "prior_version": "45'39",
837 "last_reqid": "osd.1.0:58",
851 "data_digest": "0x2ddbf8f5",
852 "omap_digest": "0x6441854d",
853 "expected_object_size": 0,
854 "expected_write_size": 0,
855 "alloc_hint_flags": 0,
861 "union_shard_errors": [
876 "object_info": "bad-val",
893 "union_shard_errors": [
920 "prior_version": "49'45",
921 "last_reqid": "osd.1.0:48",
924 "mtime": "2018-04-05 14:33:29.498969",
925 "local_mtime": "2018-04-05 14:33:29.499890",
935 "data_digest": "0x2ddbf8f5",
936 "omap_digest": "0x2d2a4d6e",
937 "expected_object_size": 0,
938 "expected_write_size": 0,
939 "alloc_hint_flags": 0,
959 "selected_object_info": {
970 "prior_version": "49'45",
971 "last_reqid": "osd.1.0:48",
985 "data_digest": "0x2ddbf8f5",
986 "omap_digest": "0x2d2a4d6e",
987 "expected_object_size": 0,
988 "expected_write_size": 0,
989 "alloc_hint_flags": 0,
995 "union_shard_errors": [
1031 "snapset": "bad-val",
1035 "union_shard_errors": [
1056 "selected_object_info": {
1067 "prior_version": "25'9",
1068 "last_reqid": "osd.1.0:60",
1082 "data_digest": "0x2ddbf8f5",
1083 "omap_digest": "0x00b35dfd",
1084 "expected_object_size": 0,
1085 "expected_write_size": 0,
1086 "alloc_hint_flags": 0,
1092 "union_shard_errors": [
1111 "name": "key1-ROBJ8"
1115 "value": "val2-ROBJ8",
1116 "name": "key2-ROBJ8"
1128 "value": "val1-ROBJ8",
1129 "name": "key1-ROBJ8"
1133 "value": "val3-ROBJ8",
1134 "name": "key3-ROBJ8"
1143 "selected_object_info": {
1154 "prior_version": "79'65",
1155 "last_reqid": "client.4554.0:1",
1169 "data_digest": "0x2ddbf8f5",
1170 "omap_digest": "0xd6be81dc",
1171 "expected_object_size": 0,
1172 "expected_write_size": 0,
1173 "alloc_hint_flags": 0,
1179 "union_shard_errors": [],
1181 "attr_value_mismatch",
1182 "attr_name_mismatch"
1206 "prior_version": "51'64",
1207 "last_reqid": "client.4649.0:1",
1221 "data_digest": "0x2b63260d",
1222 "omap_digest": "0x2eecc539",
1223 "expected_object_size": 0,
1224 "expected_write_size": 0,
1225 "alloc_hint_flags": 0,
1248 "prior_version": "37'27",
1249 "last_reqid": "osd.1.0:63",
1252 "mtime": "2018-04-05 14:33:25.352485",
1253 "local_mtime": "2018-04-05 14:33:25.353746",
1263 "data_digest": "0x2ddbf8f5",
1264 "omap_digest": "0x2eecc539",
1265 "expected_object_size": 0,
1266 "expected_write_size": 0,
1267 "alloc_hint_flags": 0,
1275 "obj_size_info_mismatch"
1281 "selected_object_info": {
1292 "prior_version": "51'64",
1293 "last_reqid": "client.4649.0:1",
1307 "data_digest": "0x2b63260d",
1308 "omap_digest": "0x2eecc539",
1309 "expected_object_size": 0,
1310 "expected_write_size": 0,
1311 "alloc_hint_flags": 0,
1317 "union_shard_errors": [
1318 "obj_size_info_mismatch"
1321 "object_info_inconsistency"
1336 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
1337 diff ${DIFFCOLOPTS} $dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
1338 if test $getjson = "yes"
1340 jq
'.' $dir/json
> save1.json
1343 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
1345 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
1349 # Change data and size again because digest was recomputed
1350 echo -n ZZZ
> $dir/change
1351 rados
--pool $poolname put
$objname $dir/change
1352 # Set one to an even older value
1353 objectstore_tool
$dir 0 $objname set-attr _
$dir/robj9-oi
1354 rm $dir/oi
$dir/change
1357 objectstore_tool
$dir 1 $objname get-attr _
> $dir/oi
1358 rados
--pool $poolname setomapval
$objname key2-
$objname val2-
$objname
1359 objectstore_tool
$dir 0 $objname set-attr _
$dir/oi
1360 objectstore_tool
$dir 1 $objname set-attr _
$dir/oi
1363 inject_eio rep data
$poolname ROBJ11
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
1364 inject_eio rep mdata
$poolname ROBJ12
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
1365 inject_eio rep mdata
$poolname ROBJ13
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
1366 inject_eio rep data
$poolname ROBJ13
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
1369 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
1371 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
1373 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
1375 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
1376 # Get epoch for repair-get requests
1377 epoch
=$
(jq .epoch
$dir/json
)
1379 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
1385 "data_digest": "0x2ddbf8f5",
1386 "omap_digest": "0xf5fba2c6",
1404 "prior_version": "21'3",
1405 "last_reqid": "osd.1.0:57",
1408 "mtime": "2018-04-05 14:33:19.804040",
1409 "local_mtime": "2018-04-05 14:33:19.804839",
1419 "data_digest": "0x2ddbf8f5",
1420 "omap_digest": "0xf5fba2c6",
1421 "expected_object_size": 0,
1422 "expected_write_size": 0,
1423 "alloc_hint_flags": 0,
1429 "data_digest": "0x2d4a11c2",
1430 "omap_digest": "0xf5fba2c6",
1433 "data_digest_mismatch_info",
1434 "size_mismatch_info",
1435 "obj_size_info_mismatch"
1441 "selected_object_info": {
1452 "prior_version": "21'3",
1453 "last_reqid": "osd.1.0:57",
1456 "mtime": "2018-04-05 14:33:19.804040",
1457 "local_mtime": "2018-04-05 14:33:19.804839",
1467 "data_digest": "0x2ddbf8f5",
1468 "omap_digest": "0xf5fba2c6",
1469 "expected_object_size": 0,
1470 "expected_write_size": 0,
1471 "alloc_hint_flags": 0,
1477 "union_shard_errors": [
1478 "data_digest_mismatch_info",
1479 "size_mismatch_info",
1480 "obj_size_info_mismatch"
1483 "data_digest_mismatch",
1497 "data_digest": "0x2ddbf8f5",
1498 "omap_digest": "0xa8dd5adc",
1501 "omap_digest_mismatch_info"
1507 "data_digest": "0x2ddbf8f5",
1508 "omap_digest": "0xa8dd5adc",
1511 "omap_digest_mismatch_info"
1517 "selected_object_info": {
1518 "alloc_hint_flags": 0,
1519 "data_digest": "0x2ddbf8f5",
1520 "expected_object_size": 0,
1521 "expected_write_size": 0,
1528 "last_reqid": "osd.0.0:50",
1529 "local_mtime": "2018-04-05 14:33:26.762368",
1534 "mtime": "2018-04-05 14:33:26.762368",
1544 "omap_digest": "0xc2025a24",
1545 "prior_version": "41'33",
1553 "union_shard_errors": [
1554 "omap_digest_mismatch_info"
1568 "data_digest": "0x2ddbf8f5",
1569 "omap_digest": "0xa03cef03",
1584 "selected_object_info": {
1595 "prior_version": "41'33",
1596 "last_reqid": "osd.1.0:51",
1599 "mtime": "2018-04-05 14:33:26.761286",
1600 "local_mtime": "2018-04-05 14:33:26.762368",
1610 "data_digest": "0x2ddbf8f5",
1611 "omap_digest": "0xa03cef03",
1612 "expected_object_size": 0,
1613 "expected_write_size": 0,
1614 "alloc_hint_flags": 0,
1620 "union_shard_errors": [
1642 "data_digest": "0x2ddbf8f5",
1643 "omap_digest": "0x067f306a",
1650 "selected_object_info": {
1661 "prior_version": "43'36",
1662 "last_reqid": "osd.1.0:55",
1665 "mtime": "2018-04-05 14:33:27.460958",
1666 "local_mtime": "2018-04-05 14:33:27.462109",
1676 "data_digest": "0x2ddbf8f5",
1677 "omap_digest": "0x067f306a",
1678 "expected_object_size": 0,
1679 "expected_write_size": 0,
1680 "alloc_hint_flags": 0,
1686 "union_shard_errors": [
1716 "union_shard_errors": [
1732 "object_info": "bad-val",
1733 "data_digest": "0x2ddbf8f5",
1734 "omap_digest": "0x4f14f849",
1743 "data_digest": "0x2ddbf8f5",
1744 "omap_digest": "0x4f14f849",
1753 "union_shard_errors": [
1780 "prior_version": "49'45",
1781 "last_reqid": "osd.1.0:48",
1784 "mtime": "2018-04-05 14:33:29.498969",
1785 "local_mtime": "2018-04-05 14:33:29.499890",
1795 "data_digest": "0x2ddbf8f5",
1796 "omap_digest": "0x2d2a4d6e",
1797 "expected_object_size": 0,
1798 "expected_write_size": 0,
1799 "alloc_hint_flags": 0,
1805 "data_digest": "0x2ddbf8f5",
1806 "omap_digest": "0x2d2a4d6e",
1813 "data_digest": "0x2ddbf8f5",
1814 "omap_digest": "0x2d2a4d6e",
1823 "selected_object_info": {
1834 "prior_version": "49'45",
1835 "last_reqid": "osd.1.0:48",
1838 "mtime": "2018-04-05 14:33:29.498969",
1839 "local_mtime": "2018-04-05 14:33:29.499890",
1849 "data_digest": "0x2ddbf8f5",
1850 "omap_digest": "0x2d2a4d6e",
1851 "expected_object_size": 0,
1852 "expected_write_size": 0,
1853 "alloc_hint_flags": 0,
1859 "union_shard_errors": [
1882 "data_digest": "0x2ddbf8f5",
1886 "omap_digest": "0x8b699207",
1892 "snapset": "bad-val",
1893 "data_digest": "0x2ddbf8f5",
1897 "omap_digest": "0x8b699207",
1903 "union_shard_errors": [
1911 "data_digest": "0x578a4830",
1912 "omap_digest": "0xf8e11918",
1915 "data_digest_mismatch_info"
1921 "data_digest": "0x2ddbf8f5",
1922 "omap_digest": "0xf8e11918",
1929 "selected_object_info": {
1940 "prior_version": "23'6",
1941 "last_reqid": "osd.1.0:59",
1944 "mtime": "2018-04-05 14:33:20.498756",
1945 "local_mtime": "2018-04-05 14:33:20.499704",
1955 "data_digest": "0x2ddbf8f5",
1956 "omap_digest": "0xf8e11918",
1957 "expected_object_size": 0,
1958 "expected_write_size": 0,
1959 "alloc_hint_flags": 0,
1965 "union_shard_errors": [
1966 "data_digest_mismatch_info"
1969 "data_digest_mismatch"
1982 "data_digest": "0x2ddbf8f5",
1983 "omap_digest": "0x00b35dfd",
1997 "selected_object_info": {
2008 "prior_version": "25'9",
2009 "last_reqid": "osd.1.0:60",
2012 "mtime": "2018-04-05 14:33:21.189382",
2013 "local_mtime": "2018-04-05 14:33:21.190446",
2023 "data_digest": "0x2ddbf8f5",
2024 "omap_digest": "0x00b35dfd",
2025 "expected_object_size": 0,
2026 "expected_write_size": 0,
2027 "alloc_hint_flags": 0,
2033 "union_shard_errors": [
2048 "data_digest": "0x2ddbf8f5",
2049 "omap_digest": "0xd7178dfe",
2052 "omap_digest_mismatch_info"
2058 "data_digest": "0x2ddbf8f5",
2059 "omap_digest": "0xe2d46ea4",
2066 "selected_object_info": {
2077 "prior_version": "27'12",
2078 "last_reqid": "osd.1.0:61",
2081 "mtime": "2018-04-05 14:33:21.862313",
2082 "local_mtime": "2018-04-05 14:33:21.863261",
2092 "data_digest": "0x2ddbf8f5",
2093 "omap_digest": "0xe2d46ea4",
2094 "expected_object_size": 0,
2095 "expected_write_size": 0,
2096 "alloc_hint_flags": 0,
2102 "union_shard_errors": [
2103 "omap_digest_mismatch_info"
2106 "omap_digest_mismatch"
2119 "data_digest": "0x2ddbf8f5",
2120 "omap_digest": "0x1a862a41",
2127 "data_digest": "0x2ddbf8f5",
2128 "omap_digest": "0x06cac8f6",
2131 "omap_digest_mismatch_info"
2137 "selected_object_info": {
2148 "prior_version": "29'15",
2149 "last_reqid": "osd.1.0:62",
2152 "mtime": "2018-04-05 14:33:22.589300",
2153 "local_mtime": "2018-04-05 14:33:22.590376",
2163 "data_digest": "0x2ddbf8f5",
2164 "omap_digest": "0x1a862a41",
2165 "expected_object_size": 0,
2166 "expected_write_size": 0,
2167 "alloc_hint_flags": 0,
2173 "union_shard_errors": [
2174 "omap_digest_mismatch_info"
2177 "omap_digest_mismatch"
2190 "data_digest": "0x2ddbf8f5",
2191 "omap_digest": "0x689ee887",
2194 "omap_digest_mismatch_info"
2200 "data_digest": "0x2ddbf8f5",
2201 "omap_digest": "0x179c919f",
2208 "selected_object_info": {
2219 "prior_version": "31'18",
2220 "last_reqid": "osd.1.0:53",
2223 "mtime": "2018-04-05 14:33:23.289188",
2224 "local_mtime": "2018-04-05 14:33:23.290130",
2234 "data_digest": "0x2ddbf8f5",
2235 "omap_digest": "0x179c919f",
2236 "expected_object_size": 0,
2237 "expected_write_size": 0,
2238 "alloc_hint_flags": 0,
2244 "union_shard_errors": [
2245 "omap_digest_mismatch_info"
2248 "omap_digest_mismatch"
2261 "data_digest": "0x2ddbf8f5",
2262 "omap_digest": "0xefced57a",
2269 "data_digest": "0x2ddbf8f5",
2270 "omap_digest": "0x6a73cc07",
2273 "omap_digest_mismatch_info"
2279 "selected_object_info": {
2290 "prior_version": "33'21",
2291 "last_reqid": "osd.1.0:52",
2294 "mtime": "2018-04-05 14:33:23.979658",
2295 "local_mtime": "2018-04-05 14:33:23.980731",
2305 "data_digest": "0x2ddbf8f5",
2306 "omap_digest": "0xefced57a",
2307 "expected_object_size": 0,
2308 "expected_write_size": 0,
2309 "alloc_hint_flags": 0,
2315 "union_shard_errors": [
2316 "omap_digest_mismatch_info"
2319 "omap_digest_mismatch"
2336 "name": "key1-ROBJ8"
2340 "value": "val2-ROBJ8",
2341 "name": "key2-ROBJ8"
2344 "data_digest": "0x2ddbf8f5",
2345 "omap_digest": "0xd6be81dc",
2355 "value": "val1-ROBJ8",
2356 "name": "key1-ROBJ8"
2360 "value": "val3-ROBJ8",
2361 "name": "key3-ROBJ8"
2364 "data_digest": "0x2ddbf8f5",
2365 "omap_digest": "0xd6be81dc",
2372 "selected_object_info": {
2383 "prior_version": "79'65",
2384 "last_reqid": "client.4554.0:1",
2387 "mtime": "2018-04-05 14:34:05.598688",
2388 "local_mtime": "2018-04-05 14:34:05.599698",
2398 "data_digest": "0x2ddbf8f5",
2399 "omap_digest": "0xd6be81dc",
2400 "expected_object_size": 0,
2401 "expected_write_size": 0,
2402 "alloc_hint_flags": 0,
2408 "union_shard_errors": [],
2410 "attr_value_mismatch",
2411 "attr_name_mismatch"
2435 "prior_version": "37'27",
2436 "last_reqid": "osd.1.0:63",
2439 "mtime": "2018-04-05 14:33:25.352485",
2440 "local_mtime": "2018-04-05 14:33:25.353746",
2450 "data_digest": "0x2ddbf8f5",
2451 "omap_digest": "0x2eecc539",
2452 "expected_object_size": 0,
2453 "expected_write_size": 0,
2454 "alloc_hint_flags": 0,
2460 "data_digest": "0x1f26fb26",
2461 "omap_digest": "0x2eecc539",
2464 "obj_size_info_mismatch"
2480 "version": "119'68",
2481 "prior_version": "51'64",
2482 "last_reqid": "client.4834.0:1",
2485 "mtime": "2018-04-05 14:35:01.500659",
2486 "local_mtime": "2018-04-05 14:35:01.502117",
2496 "data_digest": "0x1f26fb26",
2497 "omap_digest": "0x2eecc539",
2498 "expected_object_size": 0,
2499 "expected_write_size": 0,
2500 "alloc_hint_flags": 0,
2506 "data_digest": "0x1f26fb26",
2507 "omap_digest": "0x2eecc539",
2514 "selected_object_info": {
2524 "version": "119'68",
2525 "prior_version": "51'64",
2526 "last_reqid": "client.4834.0:1",
2529 "mtime": "2018-04-05 14:35:01.500659",
2530 "local_mtime": "2018-04-05 14:35:01.502117",
2540 "data_digest": "0x1f26fb26",
2541 "omap_digest": "0x2eecc539",
2542 "expected_object_size": 0,
2543 "expected_write_size": 0,
2544 "alloc_hint_flags": 0,
2550 "union_shard_errors": [
2551 "obj_size_info_mismatch"
2554 "object_info_inconsistency"
2569 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
2570 diff ${DIFFCOLOPTS} $dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
2571 if test $getjson = "yes"
2573 jq
'.' $dir/json
> save2.json
2576 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
2578 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
2581 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
2582 teardown
$dir ||
return 1
2587 # Test scrub errors for an erasure coded pool
2589 function corrupt_scrub_erasure
() {
2591 local allow_overwrites
=$2
2592 local poolname
=ecpool
2595 setup
$dir ||
return 1
2596 run_mon
$dir a ||
return 1
2597 run_mgr
$dir x ||
return 1
2598 for id
in $
(seq 0 2) ; do
2599 if [ "$allow_overwrites" = "true" ]; then
2600 run_osd_bluestore
$dir $id ||
return 1
2602 run_osd
$dir $id ||
return 1
2605 create_rbd_pool ||
return 1
2608 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 stripe_unit
=2K
--force ||
return 1
2609 wait_for_clean ||
return 1
2611 for i
in $
(seq 1 $total_objs) ; do
2613 add_something
$dir $poolname $objname ||
return 1
2615 local osd
=$
(expr $i % 2)
2619 # Size (deep scrub data_digest too)
2620 local payload
=UVWXYZZZ
2621 echo $payload > $dir/CORRUPT
2622 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
2627 dd if=/dev
/urandom of
=$dir/CORRUPT bs
=2048 count
=1
2628 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
2633 objectstore_tool
$dir $osd $objname remove ||
return 1
2637 rados
--pool $poolname setxattr
$objname key1-
$objname val1-
$objname ||
return 1
2638 rados
--pool $poolname setxattr
$objname key2-
$objname val2-
$objname ||
return 1
2641 echo -n bad-val
> $dir/bad-val
2642 objectstore_tool
$dir $osd $objname set-attr _key1-
$objname $dir/bad-val ||
return 1
2643 objectstore_tool
$dir $osd $objname rm-attr _key2-
$objname ||
return 1
2644 echo -n val3-
$objname > $dir/newval
2645 objectstore_tool
$dir $osd $objname set-attr _key3-
$objname $dir/newval ||
return 1
2646 rm $dir/bad-val
$dir/newval
2651 dd if=/dev
/urandom of
=$dir/CORRUPT bs
=2048 count
=2
2652 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
2656 objectstore_tool
$dir 0 $objname rm-attr hinfo_key ||
return 1
2657 echo -n bad-val
> $dir/bad-val
2658 objectstore_tool
$dir 1 $objname set-attr hinfo_key
$dir/bad-val ||
return 1
2662 local payload
=MAKETHISDIFFERENTFROMOTHEROBJECTS
2663 echo $payload > $dir/DIFFERENT
2664 rados
--pool $poolname put
$objname $dir/DIFFERENT ||
return 1
2666 # Get hinfo_key from EOBJ1
2667 objectstore_tool
$dir 0 EOBJ1 get-attr hinfo_key
> $dir/hinfo
2668 objectstore_tool
$dir 0 $objname set-attr hinfo_key
$dir/hinfo ||
return 1
2675 local pg
=$
(get_pg
$poolname EOBJ0
)
2679 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
2681 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
2683 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
2685 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
2686 # Get epoch for repair-get requests
2687 epoch
=$
(jq .epoch
$dir/json
)
2689 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
2713 "prior_version": "0'0",
2714 "last_reqid": "client.4184.0:1",
2727 "data_digest": "0x2ddbf8f5",
2728 "omap_digest": "0xffffffff",
2729 "expected_object_size": 0,
2730 "expected_write_size": 0,
2731 "alloc_hint_flags": 0,
2740 "size_mismatch_info",
2741 "obj_size_info_mismatch"
2754 "selected_object_info": {
2765 "prior_version": "0'0",
2766 "last_reqid": "client.4184.0:1",
2779 "data_digest": "0x2ddbf8f5",
2780 "omap_digest": "0xffffffff",
2781 "expected_object_size": 0,
2782 "expected_write_size": 0,
2783 "alloc_hint_flags": 0,
2789 "union_shard_errors": [
2790 "size_mismatch_info",
2791 "obj_size_info_mismatch"
2829 "selected_object_info": {
2840 "prior_version": "0'0",
2841 "last_reqid": "client.4252.0:1",
2854 "data_digest": "0x2ddbf8f5",
2855 "omap_digest": "0xffffffff",
2856 "expected_object_size": 0,
2857 "expected_write_size": 0,
2858 "alloc_hint_flags": 0,
2864 "union_shard_errors": [
2883 "name": "key1-EOBJ4"
2887 "value": "val2-EOBJ4",
2888 "name": "key2-EOBJ4"
2906 "value": "val1-EOBJ4",
2907 "name": "key1-EOBJ4"
2911 "value": "val2-EOBJ4",
2912 "name": "key2-EOBJ4"
2925 "value": "val1-EOBJ4",
2926 "name": "key1-EOBJ4"
2930 "value": "val3-EOBJ4",
2931 "name": "key3-EOBJ4"
2936 "selected_object_info": {
2947 "prior_version": "45'5",
2948 "last_reqid": "client.4294.0:1",
2961 "data_digest": "0x2ddbf8f5",
2962 "omap_digest": "0xffffffff",
2963 "expected_object_size": 0,
2964 "expected_write_size": 0,
2965 "alloc_hint_flags": 0,
2971 "union_shard_errors": [],
2973 "attr_value_mismatch",
2974 "attr_name_mismatch"
3005 "prior_version": "0'0",
3006 "last_reqid": "client.4382.0:1",
3019 "data_digest": "0x2ddbf8f5",
3020 "omap_digest": "0xffffffff",
3021 "expected_object_size": 0,
3022 "expected_write_size": 0,
3023 "alloc_hint_flags": 0,
3032 "size_mismatch_info",
3033 "obj_size_info_mismatch"
3046 "selected_object_info": {
3057 "prior_version": "0'0",
3058 "last_reqid": "client.4382.0:1",
3071 "data_digest": "0x2ddbf8f5",
3072 "omap_digest": "0xffffffff",
3073 "expected_object_size": 0,
3074 "expected_write_size": 0,
3075 "alloc_hint_flags": 0,
3081 "union_shard_errors": [
3082 "size_mismatch_info",
3083 "obj_size_info_mismatch"
3105 "selected_object_info": {
3116 "prior_version": "0'0",
3117 "last_reqid": "client.4418.0:1",
3130 "data_digest": "0x2ddbf8f5",
3131 "omap_digest": "0xffffffff",
3132 "expected_object_size": 0,
3133 "expected_write_size": 0,
3134 "alloc_hint_flags": 0,
3157 "hashinfo": "bad-val",
3167 "cumulative_shard_hashes": [
3181 "total_chunk_size": 2048
3185 "union_shard_errors": [
3192 "hinfo_inconsistency"
3201 "selected_object_info": {
3212 "prior_version": "75'9",
3213 "last_reqid": "client.4482.0:1",
3226 "data_digest": "0x136e4e27",
3227 "omap_digest": "0xffffffff",
3228 "expected_object_size": 0,
3229 "expected_write_size": 0,
3230 "alloc_hint_flags": 0,
3239 "cumulative_shard_hashes": [
3253 "total_chunk_size": 2048
3263 "cumulative_shard_hashes": [
3277 "total_chunk_size": 2048
3287 "cumulative_shard_hashes": [
3301 "total_chunk_size": 2048
3310 "union_shard_errors": []
3317 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
3318 diff ${DIFFCOLOPTS} $dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
3319 if test $getjson = "yes"
3321 jq
'.' $dir/json
> save3.json
3324 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
3326 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
3331 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
3333 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
3335 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
3337 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
3338 # Get epoch for repair-get requests
3339 epoch
=$
(jq .epoch
$dir/json
)
3341 if [ "$allow_overwrites" = "true" ]
3343 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
3349 "data_digest": "0x00000000",
3350 "omap_digest": "0xffffffff",
3369 "prior_version": "0'0",
3370 "last_reqid": "client.4184.0:1",
3373 "mtime": "2018-04-05 14:31:33.837147",
3374 "local_mtime": "2018-04-05 14:31:33.840763",
3383 "data_digest": "0x2ddbf8f5",
3384 "omap_digest": "0xffffffff",
3385 "expected_object_size": 0,
3386 "expected_write_size": 0,
3387 "alloc_hint_flags": 0,
3397 "size_mismatch_info",
3398 "obj_size_info_mismatch"
3404 "data_digest": "0x00000000",
3405 "omap_digest": "0xffffffff",
3413 "selected_object_info": {
3424 "prior_version": "0'0",
3425 "last_reqid": "client.4184.0:1",
3428 "mtime": "2018-04-05 14:31:33.837147",
3429 "local_mtime": "2018-04-05 14:31:33.840763",
3438 "data_digest": "0x2ddbf8f5",
3439 "omap_digest": "0xffffffff",
3440 "expected_object_size": 0,
3441 "expected_write_size": 0,
3442 "alloc_hint_flags": 0,
3448 "union_shard_errors": [
3450 "size_mismatch_info",
3451 "obj_size_info_mismatch"
3467 "data_digest": "0x00000000",
3468 "omap_digest": "0xffffffff",
3484 "data_digest": "0x00000000",
3485 "omap_digest": "0xffffffff",
3493 "selected_object_info": {
3504 "prior_version": "0'0",
3505 "last_reqid": "client.4252.0:1",
3508 "mtime": "2018-04-05 14:31:46.841145",
3509 "local_mtime": "2018-04-05 14:31:46.844996",
3518 "data_digest": "0x2ddbf8f5",
3519 "omap_digest": "0xffffffff",
3520 "expected_object_size": 0,
3521 "expected_write_size": 0,
3522 "alloc_hint_flags": 0,
3528 "union_shard_errors": [
3547 "name": "key1-EOBJ4"
3551 "value": "val2-EOBJ4",
3552 "name": "key2-EOBJ4"
3555 "data_digest": "0x00000000",
3556 "omap_digest": "0xffffffff",
3567 "value": "val1-EOBJ4",
3568 "name": "key1-EOBJ4"
3572 "value": "val2-EOBJ4",
3573 "name": "key2-EOBJ4"
3576 "data_digest": "0x00000000",
3577 "omap_digest": "0xffffffff",
3588 "value": "val1-EOBJ4",
3589 "name": "key1-EOBJ4"
3593 "value": "val3-EOBJ4",
3594 "name": "key3-EOBJ4"
3597 "data_digest": "0x00000000",
3598 "omap_digest": "0xffffffff",
3606 "selected_object_info": {
3617 "prior_version": "45'5",
3618 "last_reqid": "client.4294.0:1",
3621 "mtime": "2018-04-05 14:31:54.663622",
3622 "local_mtime": "2018-04-05 14:31:54.664527",
3631 "data_digest": "0x2ddbf8f5",
3632 "omap_digest": "0xffffffff",
3633 "expected_object_size": 0,
3634 "expected_write_size": 0,
3635 "alloc_hint_flags": 0,
3641 "union_shard_errors": [],
3643 "attr_value_mismatch",
3644 "attr_name_mismatch"
3657 "data_digest": "0x00000000",
3658 "omap_digest": "0xffffffff",
3666 "data_digest": "0x00000000",
3667 "omap_digest": "0xffffffff",
3679 "prior_version": "0'0",
3680 "last_reqid": "client.4382.0:1",
3683 "mtime": "2018-04-05 14:32:12.929161",
3684 "local_mtime": "2018-04-05 14:32:12.934707",
3693 "data_digest": "0x2ddbf8f5",
3694 "omap_digest": "0xffffffff",
3695 "expected_object_size": 0,
3696 "expected_write_size": 0,
3697 "alloc_hint_flags": 0,
3705 "size_mismatch_info",
3706 "obj_size_info_mismatch"
3713 "data_digest": "0x00000000",
3714 "omap_digest": "0xffffffff",
3722 "selected_object_info": {
3733 "prior_version": "0'0",
3734 "last_reqid": "client.4382.0:1",
3737 "mtime": "2018-04-05 14:32:12.929161",
3738 "local_mtime": "2018-04-05 14:32:12.934707",
3747 "data_digest": "0x2ddbf8f5",
3748 "omap_digest": "0xffffffff",
3749 "expected_object_size": 0,
3750 "expected_write_size": 0,
3751 "alloc_hint_flags": 0,
3757 "union_shard_errors": [
3758 "size_mismatch_info",
3759 "obj_size_info_mismatch"
3781 "union_shard_errors": [
3786 "selected_object_info": {
3797 "prior_version": "0'0",
3798 "last_reqid": "client.4418.0:1",
3801 "mtime": "2018-04-05 14:32:20.634116",
3802 "local_mtime": "2018-04-05 14:32:20.637999",
3811 "data_digest": "0x2ddbf8f5",
3812 "omap_digest": "0xffffffff",
3813 "expected_object_size": 0,
3814 "expected_write_size": 0,
3815 "alloc_hint_flags": 0,
3841 "hashinfo": "bad-val"
3849 "omap_digest": "0xffffffff",
3850 "data_digest": "0x00000000",
3852 "cumulative_shard_hashes": [
3866 "total_chunk_size": 2048
3880 "hinfo_inconsistency"
3882 "union_shard_errors": [],
3883 "selected_object_info": {
3894 "prior_version": "75'9",
3895 "last_reqid": "client.4482.0:1",
3898 "mtime": "2018-04-05 14:32:33.058782",
3899 "local_mtime": "2018-04-05 14:32:33.059679",
3908 "data_digest": "0x136e4e27",
3909 "omap_digest": "0xffffffff",
3910 "expected_object_size": 0,
3911 "expected_write_size": 0,
3912 "alloc_hint_flags": 0,
3925 "omap_digest": "0xffffffff",
3926 "data_digest": "0x00000000",
3928 "cumulative_shard_hashes": [
3942 "total_chunk_size": 2048
3951 "omap_digest": "0xffffffff",
3952 "data_digest": "0x00000000",
3954 "cumulative_shard_hashes": [
3968 "total_chunk_size": 2048
3977 "omap_digest": "0xffffffff",
3978 "data_digest": "0x00000000",
3980 "cumulative_shard_hashes": [
3994 "total_chunk_size": 2048
4006 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
4012 "data_digest": "0x04cfa72f",
4013 "omap_digest": "0xffffffff",
4032 "prior_version": "0'0",
4033 "last_reqid": "client.4192.0:1",
4036 "mtime": "2018-04-05 14:30:10.688009",
4037 "local_mtime": "2018-04-05 14:30:10.691774",
4046 "data_digest": "0x2ddbf8f5",
4047 "omap_digest": "0xffffffff",
4048 "expected_object_size": 0,
4049 "expected_write_size": 0,
4050 "alloc_hint_flags": 0,
4060 "size_mismatch_info",
4061 "obj_size_info_mismatch"
4067 "data_digest": "0x04cfa72f",
4068 "omap_digest": "0xffffffff",
4076 "selected_object_info": {
4087 "prior_version": "0'0",
4088 "last_reqid": "client.4192.0:1",
4091 "mtime": "2018-04-05 14:30:10.688009",
4092 "local_mtime": "2018-04-05 14:30:10.691774",
4101 "data_digest": "0x2ddbf8f5",
4102 "omap_digest": "0xffffffff",
4103 "expected_object_size": 0,
4104 "expected_write_size": 0,
4105 "alloc_hint_flags": 0,
4111 "union_shard_errors": [
4113 "size_mismatch_info",
4114 "obj_size_info_mismatch"
4139 "data_digest": "0x04cfa72f",
4140 "omap_digest": "0xffffffff",
4148 "data_digest": "0x04cfa72f",
4149 "omap_digest": "0xffffffff",
4157 "selected_object_info": {
4168 "prior_version": "0'0",
4169 "last_reqid": "client.4224.0:1",
4172 "mtime": "2018-04-05 14:30:14.152945",
4173 "local_mtime": "2018-04-05 14:30:14.154014",
4182 "data_digest": "0x2ddbf8f5",
4183 "omap_digest": "0xffffffff",
4184 "expected_object_size": 0,
4185 "expected_write_size": 0,
4186 "alloc_hint_flags": 0,
4192 "union_shard_errors": [
4207 "data_digest": "0x04cfa72f",
4208 "omap_digest": "0xffffffff",
4224 "data_digest": "0x04cfa72f",
4225 "omap_digest": "0xffffffff",
4233 "selected_object_info": {
4244 "prior_version": "0'0",
4245 "last_reqid": "client.4258.0:1",
4248 "mtime": "2018-04-05 14:30:18.875544",
4249 "local_mtime": "2018-04-05 14:30:18.880153",
4258 "data_digest": "0x2ddbf8f5",
4259 "omap_digest": "0xffffffff",
4260 "expected_object_size": 0,
4261 "expected_write_size": 0,
4262 "alloc_hint_flags": 0,
4268 "union_shard_errors": [
4287 "name": "key1-EOBJ4"
4291 "value": "val2-EOBJ4",
4292 "name": "key2-EOBJ4"
4295 "data_digest": "0x04cfa72f",
4296 "omap_digest": "0xffffffff",
4309 "omap_digest": "0xffffffff",
4310 "data_digest": "0x04cfa72f",
4314 "value": "val1-EOBJ4",
4315 "name": "key1-EOBJ4"
4319 "value": "val2-EOBJ4",
4320 "name": "key2-EOBJ4"
4330 "omap_digest": "0xffffffff",
4331 "data_digest": "0x04cfa72f",
4335 "value": "val1-EOBJ4",
4336 "name": "key1-EOBJ4"
4340 "value": "val3-EOBJ4",
4341 "name": "key3-EOBJ4"
4346 "selected_object_info": {
4357 "prior_version": "45'5",
4358 "last_reqid": "client.4296.0:1",
4361 "mtime": "2018-04-05 14:30:22.271983",
4362 "local_mtime": "2018-04-05 14:30:22.272840",
4371 "data_digest": "0x2ddbf8f5",
4372 "omap_digest": "0xffffffff",
4373 "expected_object_size": 0,
4374 "expected_write_size": 0,
4375 "alloc_hint_flags": 0,
4381 "union_shard_errors": [],
4383 "attr_value_mismatch",
4384 "attr_name_mismatch"
4397 "data_digest": "0x04cfa72f",
4398 "omap_digest": "0xffffffff",
4417 "prior_version": "0'0",
4418 "last_reqid": "client.4384.0:1",
4421 "mtime": "2018-04-05 14:30:35.162395",
4422 "local_mtime": "2018-04-05 14:30:35.166390",
4431 "data_digest": "0x2ddbf8f5",
4432 "omap_digest": "0xffffffff",
4433 "expected_object_size": 0,
4434 "expected_write_size": 0,
4435 "alloc_hint_flags": 0,
4444 "size_mismatch_info",
4446 "obj_size_info_mismatch"
4452 "data_digest": "0x04cfa72f",
4453 "omap_digest": "0xffffffff",
4461 "selected_object_info": {
4472 "prior_version": "0'0",
4473 "last_reqid": "client.4384.0:1",
4476 "mtime": "2018-04-05 14:30:35.162395",
4477 "local_mtime": "2018-04-05 14:30:35.166390",
4486 "data_digest": "0x2ddbf8f5",
4487 "omap_digest": "0xffffffff",
4488 "expected_object_size": 0,
4489 "expected_write_size": 0,
4490 "alloc_hint_flags": 0,
4496 "union_shard_errors": [
4497 "size_mismatch_info",
4499 "obj_size_info_mismatch"
4521 "union_shard_errors": [
4526 "selected_object_info": {
4537 "prior_version": "0'0",
4538 "last_reqid": "client.4420.0:1",
4541 "mtime": "2018-04-05 14:30:40.914673",
4542 "local_mtime": "2018-04-05 14:30:40.917705",
4551 "data_digest": "0x2ddbf8f5",
4552 "omap_digest": "0xffffffff",
4553 "expected_object_size": 0,
4554 "expected_write_size": 0,
4555 "alloc_hint_flags": 0,
4581 "hashinfo": "bad-val"
4589 "omap_digest": "0xffffffff",
4590 "data_digest": "0x04cfa72f",
4592 "cumulative_shard_hashes": [
4606 "total_chunk_size": 2048
4620 "hinfo_inconsistency"
4622 "union_shard_errors": [
4625 "selected_object_info": {
4636 "prior_version": "75'9",
4637 "last_reqid": "client.4486.0:1",
4640 "mtime": "2018-04-05 14:30:50.995009",
4641 "local_mtime": "2018-04-05 14:30:50.996112",
4650 "data_digest": "0x136e4e27",
4651 "omap_digest": "0xffffffff",
4652 "expected_object_size": 0,
4653 "expected_write_size": 0,
4654 "alloc_hint_flags": 0,
4670 "cumulative_shard_hashes": [
4684 "total_chunk_size": 2048
4693 "omap_digest": "0xffffffff",
4694 "data_digest": "0x5b7455a8",
4696 "cumulative_shard_hashes": [
4710 "total_chunk_size": 2048
4719 "omap_digest": "0xffffffff",
4720 "data_digest": "0x5b7455a8",
4722 "cumulative_shard_hashes": [
4736 "total_chunk_size": 2048
4748 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
4749 diff ${DIFFCOLOPTS} $dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
4750 if test $getjson = "yes"
4752 if [ "$allow_overwrites" = "true" ]
4758 jq
'.' $dir/json
> save
${num}.json
4761 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
4763 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
4766 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
4767 teardown
$dir ||
return 1
4770 function TEST_corrupt_scrub_erasure_appends
() {
4771 corrupt_scrub_erasure
$1 false
4774 function TEST_corrupt_scrub_erasure_overwrites
() {
4775 if [ "$use_ec_overwrite" = "true" ]; then
4776 corrupt_scrub_erasure
$1 true
4781 # Test to make sure that a periodic scrub won't cause deep-scrub info to be lost
4783 function TEST_periodic_scrub_replicated
() {
4785 local poolname
=psr_pool
4788 setup
$dir ||
return 1
4789 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
4790 run_mgr
$dir x ||
return 1
4791 local ceph_osd_args
="--osd-scrub-interval-randomize-ratio=0 --osd-deep-scrub-randomize-ratio=0 "
4792 ceph_osd_args
+="--osd_scrub_backoff_ratio=0"
4793 run_osd
$dir 0 $ceph_osd_args ||
return 1
4794 run_osd
$dir 1 $ceph_osd_args ||
return 1
4795 create_rbd_pool ||
return 1
4796 wait_for_clean ||
return 1
4798 create_pool
$poolname 1 1 ||
return 1
4799 wait_for_clean ||
return 1
4802 add_something
$dir $poolname $objname scrub ||
return 1
4803 local primary
=$
(get_primary
$poolname $objname)
4804 local pg
=$
(get_pg
$poolname $objname)
4806 # Add deep-scrub only error
4807 local payload
=UVWXYZ
4808 echo $payload > $dir/CORRUPT
4809 # Uses $ceph_osd_args for osd restart
4810 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
4812 # No scrub information available, so expect failure
4814 ! rados list-inconsistent-obj
$pg | jq
'.' ||
return 1
4817 pg_deep_scrub
$pg ||
return 1
4819 # Make sure bad object found
4820 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
4823 local last_scrub
=$
(get_last_scrub_stamp
$pg)
4824 # Fake a schedule scrub
4825 CEPH_ARGS
='' ceph
--admin-daemon $
(get_asok_path osd.
${primary}) \
4826 trigger_scrub
$pg ||
return 1
4827 # Wait for schedule regular scrub
4828 wait_for_scrub
$pg "$last_scrub"
4830 # It needed to be upgraded
4831 grep -q "Deep scrub errors, upgrading scrub to deep-scrub" $dir/osd.
${primary}.log ||
return 1
4833 # Bad object still known
4834 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
4836 # Can't upgrade with this set
4837 ceph osd
set nodeep-scrub
4838 # Let map change propagate to OSDs
4842 # Fake a schedule scrub
4843 CEPH_ARGS
='' ceph
--admin-daemon $
(get_asok_path osd.
${primary}) \
4844 trigger_scrub
$pg ||
return 1
4845 # Wait for schedule regular scrub
4846 # to notice scrub and skip it
4848 for i
in $
(seq 14 -1 0)
4851 ! grep -q "Regular scrub skipped due to deep-scrub errors and nodeep-scrub set" $dir/osd.
${primary}.log ||
{ found
=true
; break; }
4852 echo Time left
: $i seconds
4854 test $found = "true" ||
return 1
4856 # Bad object still known
4857 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
4860 # Request a regular scrub and it will be done
4862 grep -q "Regular scrub request, deep-scrub details will be lost" $dir/osd.
${primary}.log ||
return 1
4864 # deep-scrub error is no longer present
4865 rados list-inconsistent-obj
$pg | jq
'.' |
grep -qv $objname ||
return 1
4869 # Corrupt snapset in replicated pool
4871 function TEST_corrupt_snapset_scrub_rep
() {
4873 local poolname
=csr_pool
4876 setup
$dir ||
return 1
4877 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
4878 run_mgr
$dir x ||
return 1
4879 run_osd
$dir 0 ||
return 1
4880 run_osd
$dir 1 ||
return 1
4881 create_rbd_pool ||
return 1
4882 wait_for_clean ||
return 1
4884 create_pool foo
1 ||
return 1
4885 create_pool
$poolname 1 1 ||
return 1
4886 wait_for_clean ||
return 1
4888 for i
in $
(seq 1 $total_objs) ; do
4890 add_something
$dir $poolname $objname ||
return 1
4892 rados
--pool $poolname setomapheader
$objname hdr-
$objname ||
return 1
4893 rados
--pool $poolname setomapval
$objname key-
$objname val-
$objname ||
return 1
4896 local pg
=$
(get_pg
$poolname ROBJ0
)
4898 for i
in $
(seq 1 $total_objs) ; do
4901 # Alternate corruption between osd.0 and osd.1
4902 local osd
=$
(expr $i % 2)
4904 rados
-p $poolname mksnap snap1
4905 echo -n head_of_snapshot_data
> $dir/change
4909 rados
--pool $poolname put
$objname $dir/change
4910 objectstore_tool
$dir $osd --head $objname clear-snapset corrupt ||
return 1
4914 rados
--pool $poolname put
$objname $dir/change
4915 objectstore_tool
$dir $osd --head $objname clear-snapset corrupt ||
return 1
4924 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
4926 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
4928 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
4930 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
4932 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
4945 "snapset_inconsistency"
4947 "union_shard_errors": [],
4948 "selected_object_info": {
4959 "prior_version": "21'3",
4960 "last_reqid": "client.4195.0:1",
4963 "mtime": "2018-04-05 14:35:43.286117",
4964 "local_mtime": "2018-04-05 14:35:43.288990",
4973 "data_digest": "0x53acb008",
4974 "omap_digest": "0xffffffff",
4975 "expected_object_size": 0,
4976 "expected_write_size": 0,
4977 "alloc_hint_flags": 0,
5034 "snapset_inconsistency"
5036 "union_shard_errors": [],
5037 "selected_object_info": {
5048 "prior_version": "23'6",
5049 "last_reqid": "client.4223.0:1",
5052 "mtime": "2018-04-05 14:35:48.326856",
5053 "local_mtime": "2018-04-05 14:35:48.328097",
5062 "data_digest": "0x53acb008",
5063 "omap_digest": "0xffffffff",
5064 "expected_object_size": 0,
5065 "expected_write_size": 0,
5066 "alloc_hint_flags": 0,
5118 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
5119 diff ${DIFFCOLOPTS} $dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
5120 if test $getjson = "yes"
5122 jq
'.' $dir/json
> save6.json
5125 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
5127 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
5130 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
5131 teardown
$dir ||
return 1
5134 main osd-scrub-repair
"$@"
5137 # compile-command: "cd ../.. ; make -j4 && \
5138 # test/osd/osd-scrub-repair.sh # TEST_corrupt_and_repair_replicated"