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 "
59 CEPH_ARGS
+="--osd-skip-data-digest=false "
61 local funcs
=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
62 for func
in $funcs ; do
63 $func $dir ||
return 1
67 function add_something
() {
70 local obj
=${3:-SOMETHING}
71 local scrub
=${4:-noscrub}
73 if [ "$scrub" = "noscrub" ];
75 ceph osd
set noscrub ||
return 1
76 ceph osd
set nodeep-scrub ||
return 1
78 ceph osd
unset noscrub ||
return 1
79 ceph osd
unset nodeep-scrub ||
return 1
83 echo $payload > $dir/ORIGINAL
84 rados
--pool $poolname put
$obj $dir/ORIGINAL ||
return 1
88 # Corrupt one copy of a replicated pool
90 function TEST_corrupt_and_repair_replicated
() {
94 setup
$dir ||
return 1
95 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
96 run_mgr
$dir x ||
return 1
97 run_osd
$dir 0 ||
return 1
98 run_osd
$dir 1 ||
return 1
99 create_rbd_pool ||
return 1
100 wait_for_clean ||
return 1
102 add_something
$dir $poolname ||
return 1
103 corrupt_and_repair_one
$dir $poolname $
(get_not_primary
$poolname SOMETHING
) ||
return 1
104 # Reproduces http://tracker.ceph.com/issues/8914
105 corrupt_and_repair_one
$dir $poolname $
(get_primary
$poolname SOMETHING
) ||
return 1
107 teardown
$dir ||
return 1
110 function corrupt_and_repair_two
() {
117 # 1) remove the corresponding file from the OSDs
120 run_in_background pids objectstore_tool
$dir $first SOMETHING remove
121 run_in_background pids objectstore_tool
$dir $second SOMETHING remove
124 if [ $return_code -ne 0 ]; then return $return_code; fi
129 local pg
=$
(get_pg
$poolname SOMETHING
)
132 # 3) The files must be back
135 run_in_background pids objectstore_tool
$dir $first SOMETHING list-attrs
136 run_in_background pids objectstore_tool
$dir $second SOMETHING list-attrs
139 if [ $return_code -ne 0 ]; then return $return_code; fi
141 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
142 diff $dir/ORIGINAL
$dir/COPY ||
return 1
147 # 2) remove the corresponding file from a designated OSD
149 # 4) check that the file has been restored in the designated OSD
151 function corrupt_and_repair_one
() {
157 # 1) remove the corresponding file from the OSD
159 objectstore_tool
$dir $osd SOMETHING remove ||
return 1
163 local pg
=$
(get_pg
$poolname SOMETHING
)
166 # 3) The file must be back
168 objectstore_tool
$dir $osd SOMETHING list-attrs ||
return 1
169 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
170 diff $dir/ORIGINAL
$dir/COPY ||
return 1
173 function corrupt_and_repair_erasure_coded
() {
177 add_something
$dir $poolname ||
return 1
179 local primary
=$
(get_primary
$poolname SOMETHING
)
180 local -a osds
=($
(get_osds
$poolname SOMETHING |
sed -e "s/$primary//"))
181 local not_primary_first
=${osds[0]}
182 local not_primary_second
=${osds[1]}
184 # Reproduces http://tracker.ceph.com/issues/10017
185 corrupt_and_repair_one
$dir $poolname $primary ||
return 1
186 # Reproduces http://tracker.ceph.com/issues/10409
187 corrupt_and_repair_one
$dir $poolname $not_primary_first ||
return 1
188 corrupt_and_repair_two
$dir $poolname $not_primary_first $not_primary_second ||
return 1
189 corrupt_and_repair_two
$dir $poolname $primary $not_primary_first ||
return 1
193 function create_ec_pool
() {
195 local allow_overwrites
=$2
197 ceph osd erasure-code-profile
set myprofile crush-failure-domain
=osd
$3 $4 $5 $6 $7 ||
return 1
199 create_pool
"$poolname" 1 1 erasure myprofile ||
return 1
201 if [ "$allow_overwrites" = "true" ]; then
202 ceph osd pool
set "$poolname" allow_ec_overwrites true ||
return 1
205 wait_for_clean ||
return 1
209 function auto_repair_erasure_coded
() {
211 local allow_overwrites
=$2
212 local poolname
=ecpool
214 # Launch a cluster with 5 seconds scrub interval
215 setup
$dir ||
return 1
216 run_mon
$dir a ||
return 1
217 run_mgr
$dir x ||
return 1
218 local ceph_osd_args
="--osd-scrub-auto-repair=true \
219 --osd-deep-scrub-interval=5 \
220 --osd-scrub-max-interval=5 \
221 --osd-scrub-min-interval=5 \
222 --osd-scrub-interval-randomize-ratio=0"
223 for id
in $
(seq 0 2) ; do
224 if [ "$allow_overwrites" = "true" ]; then
225 run_osd_bluestore
$dir $id $ceph_osd_args ||
return 1
227 run_osd
$dir $id $ceph_osd_args ||
return 1
230 create_rbd_pool ||
return 1
231 wait_for_clean ||
return 1
234 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 ||
return 1
238 echo $payload > $dir/ORIGINAL
239 rados
--pool $poolname put SOMETHING
$dir/ORIGINAL ||
return 1
241 # Remove the object from one shard physically
242 # Restarted osd get $ceph_osd_args passed
243 objectstore_tool
$dir $
(get_not_primary
$poolname SOMETHING
) SOMETHING remove ||
return 1
244 # Wait for auto repair
245 local pgid
=$
(get_pg
$poolname SOMETHING
)
246 wait_for_scrub
$pgid "$(get_last_scrub_stamp $pgid)"
247 wait_for_clean ||
return 1
248 # Verify - the file should be back
249 # Restarted osd get $ceph_osd_args passed
250 objectstore_tool
$dir $
(get_not_primary
$poolname SOMETHING
) SOMETHING list-attrs ||
return 1
251 rados
--pool $poolname get SOMETHING
$dir/COPY ||
return 1
252 diff $dir/ORIGINAL
$dir/COPY ||
return 1
255 teardown
$dir ||
return 1
258 function TEST_auto_repair_erasure_coded_appends
() {
259 auto_repair_erasure_coded
$1 false
262 function TEST_auto_repair_erasure_coded_overwrites
() {
263 if [ "$use_ec_overwrite" = "true" ]; then
264 auto_repair_erasure_coded
$1 true
268 function corrupt_and_repair_jerasure
() {
270 local allow_overwrites
=$2
271 local poolname
=ecpool
273 setup
$dir ||
return 1
274 run_mon
$dir a ||
return 1
275 run_mgr
$dir x ||
return 1
276 for id
in $
(seq 0 3) ; do
277 if [ "$allow_overwrites" = "true" ]; then
278 run_osd_bluestore
$dir $id ||
return 1
280 run_osd
$dir $id ||
return 1
283 create_rbd_pool ||
return 1
284 wait_for_clean ||
return 1
286 create_ec_pool
$poolname $allow_overwrites k
=2 m
=2 ||
return 1
287 corrupt_and_repair_erasure_coded
$dir $poolname ||
return 1
289 teardown
$dir ||
return 1
292 function TEST_corrupt_and_repair_jerasure_appends
() {
293 corrupt_and_repair_jerasure
$1
296 function TEST_corrupt_and_repair_jerasure_overwrites
() {
297 if [ "$use_ec_overwrite" = "true" ]; then
298 corrupt_and_repair_jerasure
$1 true
302 function corrupt_and_repair_lrc
() {
304 local allow_overwrites
=$2
305 local poolname
=ecpool
307 setup
$dir ||
return 1
308 run_mon
$dir a ||
return 1
309 run_mgr
$dir x ||
return 1
310 for id
in $
(seq 0 9) ; do
311 if [ "$allow_overwrites" = "true" ]; then
312 run_osd_bluestore
$dir $id ||
return 1
314 run_osd
$dir $id ||
return 1
317 create_rbd_pool ||
return 1
318 wait_for_clean ||
return 1
320 create_ec_pool
$poolname $allow_overwrites k
=4 m
=2 l
=3 plugin
=lrc ||
return 1
321 corrupt_and_repair_erasure_coded
$dir $poolname ||
return 1
323 teardown
$dir ||
return 1
326 function TEST_corrupt_and_repair_lrc_appends
() {
327 corrupt_and_repair_jerasure
$1
330 function TEST_corrupt_and_repair_lrc_overwrites
() {
331 if [ "$use_ec_overwrite" = "true" ]; then
332 corrupt_and_repair_jerasure
$1 true
336 function unfound_erasure_coded
() {
338 local allow_overwrites
=$2
339 local poolname
=ecpool
342 setup
$dir ||
return 1
343 run_mon
$dir a ||
return 1
344 run_mgr
$dir x ||
return 1
345 for id
in $
(seq 0 3) ; do
346 if [ "$allow_overwrites" = "true" ]; then
347 run_osd_bluestore
$dir $id ||
return 1
349 run_osd
$dir $id ||
return 1
352 create_rbd_pool ||
return 1
353 wait_for_clean ||
return 1
355 create_ec_pool
$poolname $allow_overwrites k
=2 m
=2 ||
return 1
357 add_something
$dir $poolname ||
return 1
359 local primary
=$
(get_primary
$poolname SOMETHING
)
360 local -a osds
=($
(get_osds
$poolname SOMETHING |
sed -e "s/$primary//"))
361 local not_primary_first
=${osds[0]}
362 local not_primary_second
=${osds[1]}
363 local not_primary_third
=${osds[2]}
366 # 1) remove the corresponding file from the OSDs
369 run_in_background pids objectstore_tool
$dir $not_primary_first SOMETHING remove
370 run_in_background pids objectstore_tool
$dir $not_primary_second SOMETHING remove
371 run_in_background pids objectstore_tool
$dir $not_primary_third SOMETHING remove
374 if [ $return_code -ne 0 ]; then return $return_code; fi
379 local pg
=$
(get_pg
$poolname SOMETHING
)
384 # it may take a bit to appear due to mon/mgr asynchrony
385 for f
in `seq 1 60`; do
386 ceph
-s |
grep "1/1 objects unfound" && break
389 ceph
-s|
grep "4 osds: 4 up, 4 in" ||
return 1
390 ceph
-s|
grep "1/1 objects unfound" ||
return 1
392 teardown
$dir ||
return 1
395 function TEST_unfound_erasure_coded_appends
() {
396 unfound_erasure_coded
$1
399 function TEST_unfound_erasure_coded_overwrites
() {
400 if [ "$use_ec_overwrite" = "true" ]; then
401 unfound_erasure_coded
$1 true
406 # list_missing for EC pool
408 function list_missing_erasure_coded
() {
410 local allow_overwrites
=$2
411 local poolname
=ecpool
413 setup
$dir ||
return 1
414 run_mon
$dir a ||
return 1
415 run_mgr
$dir x ||
return 1
416 for id
in $
(seq 0 2) ; do
417 if [ "$allow_overwrites" = "true" ]; then
418 run_osd_bluestore
$dir $id ||
return 1
420 run_osd
$dir $id ||
return 1
423 create_rbd_pool ||
return 1
424 wait_for_clean ||
return 1
426 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 ||
return 1
428 # Put an object and remove the two shards (including primary)
429 add_something
$dir $poolname MOBJ0 ||
return 1
430 local -a osds0
=($
(get_osds
$poolname MOBJ0
))
432 # Put another object and remove two shards (excluding primary)
433 add_something
$dir $poolname MOBJ1 ||
return 1
434 local -a osds1
=($
(get_osds
$poolname MOBJ1
))
436 # Stop all osd daemons
437 for id
in $
(seq 0 2) ; do
438 kill_daemons
$dir TERM osd.
$id >&2 < /dev
/null ||
return 1
442 ceph-objectstore-tool
--data-path $dir/$id \
443 MOBJ0 remove ||
return 1
445 ceph-objectstore-tool
--data-path $dir/$id \
446 MOBJ0 remove ||
return 1
449 ceph-objectstore-tool
--data-path $dir/$id \
450 MOBJ1 remove ||
return 1
452 ceph-objectstore-tool
--data-path $dir/$id \
453 MOBJ1 remove ||
return 1
455 for id
in $
(seq 0 2) ; do
456 activate_osd
$dir $id >&2 ||
return 1
458 create_rbd_pool ||
return 1
459 wait_for_clean ||
return 1
461 # Get get - both objects should in the same PG
462 local pg
=$
(get_pg
$poolname MOBJ0
)
464 # Repair the PG, which triggers the recovering,
465 # and should mark the object as unfound
468 for i
in $
(seq 0 120) ; do
469 [ $i -lt 60 ] ||
return 1
470 matches
=$
(ceph pg
$pg list_missing |
egrep "MOBJ0|MOBJ1" |
wc -l)
471 [ $matches -eq 2 ] && break
474 teardown
$dir ||
return 1
477 function TEST_list_missing_erasure_coded_appends
() {
478 list_missing_erasure_coded
$1 false
481 function TEST_list_missing_erasure_coded_overwrites
() {
482 if [ "$use_ec_overwrite" = "true" ]; then
483 list_missing_erasure_coded
$1 true
488 # Corrupt one copy of a replicated pool
490 function TEST_corrupt_scrub_replicated
() {
492 local poolname
=csr_pool
495 setup
$dir ||
return 1
496 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
497 run_mgr
$dir x ||
return 1
498 run_osd
$dir 0 ||
return 1
499 run_osd
$dir 1 ||
return 1
500 create_rbd_pool ||
return 1
501 wait_for_clean ||
return 1
503 create_pool foo
1 ||
return 1
504 create_pool
$poolname 1 1 ||
return 1
505 wait_for_clean ||
return 1
507 for i
in $
(seq 1 $total_objs) ; do
509 add_something
$dir $poolname $objname ||
return 1
511 rados
--pool $poolname setomapheader
$objname hdr-
$objname ||
return 1
512 rados
--pool $poolname setomapval
$objname key-
$objname val-
$objname ||
return 1
515 local pg
=$
(get_pg
$poolname ROBJ0
)
517 # Compute an old omap digest and save oi
518 CEPH_ARGS
='' ceph daemon $
(get_asok_path osd
.0) \
519 config
set osd_deep_scrub_update_digest_min_age
0
520 CEPH_ARGS
='' ceph daemon $
(get_asok_path osd
.1) \
521 config
set osd_deep_scrub_update_digest_min_age
0
524 for i
in $
(seq 1 $total_objs) ; do
527 # Alternate corruption between osd.0 and osd.1
528 local osd
=$
(expr $i % 2)
532 # Size (deep scrub data_digest too)
533 local payload
=UVWXYZZZ
534 echo $payload > $dir/CORRUPT
535 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
539 # digest (deep scrub only)
541 echo $payload > $dir/CORRUPT
542 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
547 objectstore_tool
$dir $osd $objname remove ||
return 1
551 # Modify omap value (deep scrub only)
552 objectstore_tool
$dir $osd $objname set-omap key-
$objname $dir/CORRUPT ||
return 1
556 # Delete omap key (deep scrub only)
557 objectstore_tool
$dir $osd $objname rm-omap key-
$objname ||
return 1
561 # Add extra omap key (deep scrub only)
562 echo extra
> $dir/extra-val
563 objectstore_tool
$dir $osd $objname set-omap key2-
$objname $dir/extra-val ||
return 1
568 # Modify omap header (deep scrub only)
569 echo -n newheader
> $dir/hdr
570 objectstore_tool
$dir $osd $objname set-omaphdr
$dir/hdr ||
return 1
575 rados
--pool $poolname setxattr
$objname key1-
$objname val1-
$objname ||
return 1
576 rados
--pool $poolname setxattr
$objname key2-
$objname val2-
$objname ||
return 1
579 echo -n bad-val
> $dir/bad-val
580 objectstore_tool
$dir $osd $objname set-attr _key1-
$objname $dir/bad-val ||
return 1
581 objectstore_tool
$dir $osd $objname rm-attr _key2-
$objname ||
return 1
582 echo -n val3-
$objname > $dir/newval
583 objectstore_tool
$dir $osd $objname set-attr _key3-
$objname $dir/newval ||
return 1
584 rm $dir/bad-val
$dir/newval
588 objectstore_tool
$dir $osd $objname get-attr _
> $dir/robj9-oi
589 echo -n D
> $dir/change
590 rados
--pool $poolname put
$objname $dir/change
591 objectstore_tool
$dir $osd $objname set-attr _
$dir/robj9-oi
592 rm $dir/oi
$dir/change
595 # ROBJ10 must be handled after digests are re-computed by a deep scrub below
596 # ROBJ11 must be handled with config change before deep scrub
597 # ROBJ12 must be handled with config change before scrubs
598 # ROBJ13 must be handled before scrubs
601 echo -n bad-val
> $dir/bad-val
602 objectstore_tool
$dir 0 $objname set-attr _
$dir/bad-val ||
return 1
603 objectstore_tool
$dir 1 $objname rm-attr _ ||
return 1
608 objectstore_tool
$dir $osd $objname rm-attr _ ||
return 1
612 objectstore_tool
$dir 0 $objname rm-attr snapset ||
return 1
613 echo -n bad-val
> $dir/bad-val
614 objectstore_tool
$dir 1 $objname set-attr snapset
$dir/bad-val ||
return 1
618 # Deep-scrub only (all replicas are diffent than the object info
620 echo $payload > $dir/new.ROBJ17
621 objectstore_tool
$dir 0 $objname set-bytes
$dir/new.ROBJ17 ||
return 1
622 objectstore_tool
$dir 1 $objname set-bytes
$dir/new.ROBJ17 ||
return 1
626 # Deep-scrub only (all replicas are diffent than the object info
628 echo $payload > $dir/new.ROBJ18
629 objectstore_tool
$dir 0 $objname set-bytes
$dir/new.ROBJ18 ||
return 1
630 objectstore_tool
$dir 1 $objname set-bytes
$dir/new.ROBJ18 ||
return 1
631 # Make one replica have a different object info, so a full repair must happen too
632 objectstore_tool
$dir $osd $objname corrupt-info ||
return 1
637 local pg
=$
(get_pg
$poolname ROBJ0
)
639 inject_eio rep data
$poolname ROBJ11
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
640 inject_eio rep mdata
$poolname ROBJ12
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
641 inject_eio rep mdata
$poolname ROBJ13
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
642 inject_eio rep data
$poolname ROBJ13
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
646 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
648 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
650 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
652 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
653 # Get epoch for repair-get requests
654 epoch
=$
(jq .epoch
$dir/json
)
656 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
679 "prior_version": "21'3",
680 "last_reqid": "osd.1.0:57",
694 "data_digest": "0x2ddbf8f5",
695 "omap_digest": "0xf5fba2c6",
696 "expected_object_size": 0,
697 "expected_write_size": 0,
698 "alloc_hint_flags": 0,
706 "size_mismatch_info",
707 "obj_size_info_mismatch"
713 "selected_object_info": {
724 "prior_version": "21'3",
725 "last_reqid": "osd.1.0:57",
728 "mtime": "2018-04-05 14:33:19.804040",
729 "local_mtime": "2018-04-05 14:33:19.804839",
739 "data_digest": "0x2ddbf8f5",
740 "omap_digest": "0xf5fba2c6",
741 "expected_object_size": 0,
742 "expected_write_size": 0,
743 "alloc_hint_flags": 0,
749 "union_shard_errors": [
750 "size_mismatch_info",
751 "obj_size_info_mismatch"
780 "selected_object_info": {
791 "prior_version": "43'36",
792 "last_reqid": "osd.1.0:55",
806 "data_digest": "0x2ddbf8f5",
807 "omap_digest": "0x067f306a",
808 "expected_object_size": 0,
809 "expected_write_size": 0,
810 "alloc_hint_flags": 0,
816 "union_shard_errors": [
844 "selected_object_info": {
855 "prior_version": "45'39",
856 "last_reqid": "osd.1.0:58",
870 "data_digest": "0x2ddbf8f5",
871 "omap_digest": "0x6441854d",
872 "expected_object_size": 0,
873 "expected_write_size": 0,
874 "alloc_hint_flags": 0,
880 "union_shard_errors": [
895 "object_info": "bad-val",
912 "union_shard_errors": [
939 "prior_version": "49'45",
940 "last_reqid": "osd.1.0:48",
943 "mtime": "2018-04-05 14:33:29.498969",
944 "local_mtime": "2018-04-05 14:33:29.499890",
954 "data_digest": "0x2ddbf8f5",
955 "omap_digest": "0x2d2a4d6e",
956 "expected_object_size": 0,
957 "expected_write_size": 0,
958 "alloc_hint_flags": 0,
978 "selected_object_info": {
989 "prior_version": "49'45",
990 "last_reqid": "osd.1.0:48",
1004 "data_digest": "0x2ddbf8f5",
1005 "omap_digest": "0x2d2a4d6e",
1006 "expected_object_size": 0,
1007 "expected_write_size": 0,
1008 "alloc_hint_flags": 0,
1014 "union_shard_errors": [
1050 "snapset": "bad-val",
1054 "union_shard_errors": [
1061 "object_info_inconsistency"
1069 "selected_object_info": {
1070 "alloc_hint_flags": 255,
1071 "data_digest": "0x2ddbf8f5",
1072 "expected_object_size": 0,
1073 "expected_write_size": 0,
1093 "omap_digest": "0xddc3680f",
1104 "alloc_hint_flags": 0,
1105 "data_digest": "0x2ddbf8f5",
1106 "expected_object_size": 0,
1107 "expected_write_size": 0,
1127 "omap_digest": "0xddc3680f",
1141 "alloc_hint_flags": 255,
1142 "data_digest": "0x2ddbf8f5",
1143 "expected_object_size": 0,
1144 "expected_write_size": 0,
1164 "omap_digest": "0xddc3680f",
1176 "union_shard_errors": []
1194 "selected_object_info": {
1205 "prior_version": "25'9",
1206 "last_reqid": "osd.1.0:60",
1220 "data_digest": "0x2ddbf8f5",
1221 "omap_digest": "0x00b35dfd",
1222 "expected_object_size": 0,
1223 "expected_write_size": 0,
1224 "alloc_hint_flags": 0,
1230 "union_shard_errors": [
1249 "name": "key1-ROBJ8"
1253 "value": "val2-ROBJ8",
1254 "name": "key2-ROBJ8"
1266 "value": "val1-ROBJ8",
1267 "name": "key1-ROBJ8"
1271 "value": "val3-ROBJ8",
1272 "name": "key3-ROBJ8"
1281 "selected_object_info": {
1292 "prior_version": "79'65",
1293 "last_reqid": "client.4554.0:1",
1307 "data_digest": "0x2ddbf8f5",
1308 "omap_digest": "0xd6be81dc",
1309 "expected_object_size": 0,
1310 "expected_write_size": 0,
1311 "alloc_hint_flags": 0,
1317 "union_shard_errors": [],
1319 "attr_value_mismatch",
1320 "attr_name_mismatch"
1344 "prior_version": "51'64",
1345 "last_reqid": "client.4649.0:1",
1359 "data_digest": "0x2b63260d",
1360 "omap_digest": "0x2eecc539",
1361 "expected_object_size": 0,
1362 "expected_write_size": 0,
1363 "alloc_hint_flags": 0,
1386 "prior_version": "37'27",
1387 "last_reqid": "osd.1.0:63",
1390 "mtime": "2018-04-05 14:33:25.352485",
1391 "local_mtime": "2018-04-05 14:33:25.353746",
1401 "data_digest": "0x2ddbf8f5",
1402 "omap_digest": "0x2eecc539",
1403 "expected_object_size": 0,
1404 "expected_write_size": 0,
1405 "alloc_hint_flags": 0,
1413 "obj_size_info_mismatch"
1419 "selected_object_info": {
1430 "prior_version": "51'64",
1431 "last_reqid": "client.4649.0:1",
1445 "data_digest": "0x2b63260d",
1446 "omap_digest": "0x2eecc539",
1447 "expected_object_size": 0,
1448 "expected_write_size": 0,
1449 "alloc_hint_flags": 0,
1455 "union_shard_errors": [
1456 "obj_size_info_mismatch"
1459 "object_info_inconsistency"
1474 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
1475 multidiff
$dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
1476 if test $getjson = "yes"
1478 jq
'.' $dir/json
> save1.json
1481 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
1483 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
1487 # Change data and size again because digest was recomputed
1488 echo -n ZZZ
> $dir/change
1489 rados
--pool $poolname put
$objname $dir/change
1490 # Set one to an even older value
1491 objectstore_tool
$dir 0 $objname set-attr _
$dir/robj9-oi
1492 rm $dir/oi
$dir/change
1495 objectstore_tool
$dir 1 $objname get-attr _
> $dir/oi
1496 rados
--pool $poolname setomapval
$objname key2-
$objname val2-
$objname
1497 objectstore_tool
$dir 0 $objname set-attr _
$dir/oi
1498 objectstore_tool
$dir 1 $objname set-attr _
$dir/oi
1501 inject_eio rep data
$poolname ROBJ11
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
1502 inject_eio rep mdata
$poolname ROBJ12
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
1503 inject_eio rep mdata
$poolname ROBJ13
$dir 1 ||
return 1 # shard 1 of [1, 0], osd.0
1504 inject_eio rep data
$poolname ROBJ13
$dir 0 ||
return 1 # shard 0 of [1, 0], osd.1
1507 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
1509 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
1511 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
1513 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
1514 # Get epoch for repair-get requests
1515 epoch
=$
(jq .epoch
$dir/json
)
1517 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
1523 "data_digest": "0x2ddbf8f5",
1524 "omap_digest": "0xf5fba2c6",
1542 "prior_version": "21'3",
1543 "last_reqid": "osd.1.0:57",
1546 "mtime": "2018-04-05 14:33:19.804040",
1547 "local_mtime": "2018-04-05 14:33:19.804839",
1557 "data_digest": "0x2ddbf8f5",
1558 "omap_digest": "0xf5fba2c6",
1559 "expected_object_size": 0,
1560 "expected_write_size": 0,
1561 "alloc_hint_flags": 0,
1567 "data_digest": "0x2d4a11c2",
1568 "omap_digest": "0xf5fba2c6",
1571 "data_digest_mismatch_info",
1572 "size_mismatch_info",
1573 "obj_size_info_mismatch"
1579 "selected_object_info": {
1590 "prior_version": "21'3",
1591 "last_reqid": "osd.1.0:57",
1594 "mtime": "2018-04-05 14:33:19.804040",
1595 "local_mtime": "2018-04-05 14:33:19.804839",
1605 "data_digest": "0x2ddbf8f5",
1606 "omap_digest": "0xf5fba2c6",
1607 "expected_object_size": 0,
1608 "expected_write_size": 0,
1609 "alloc_hint_flags": 0,
1615 "union_shard_errors": [
1616 "data_digest_mismatch_info",
1617 "size_mismatch_info",
1618 "obj_size_info_mismatch"
1621 "data_digest_mismatch",
1635 "data_digest": "0x2ddbf8f5",
1636 "omap_digest": "0xa8dd5adc",
1639 "omap_digest_mismatch_info"
1645 "data_digest": "0x2ddbf8f5",
1646 "omap_digest": "0xa8dd5adc",
1649 "omap_digest_mismatch_info"
1655 "selected_object_info": {
1656 "alloc_hint_flags": 0,
1657 "data_digest": "0x2ddbf8f5",
1658 "expected_object_size": 0,
1659 "expected_write_size": 0,
1666 "last_reqid": "osd.0.0:50",
1667 "local_mtime": "2018-04-05 14:33:26.762368",
1672 "mtime": "2018-04-05 14:33:26.762368",
1682 "omap_digest": "0xc2025a24",
1683 "prior_version": "41'33",
1691 "union_shard_errors": [
1692 "omap_digest_mismatch_info"
1706 "data_digest": "0x2ddbf8f5",
1707 "omap_digest": "0xa03cef03",
1722 "selected_object_info": {
1733 "prior_version": "41'33",
1734 "last_reqid": "osd.1.0:51",
1737 "mtime": "2018-04-05 14:33:26.761286",
1738 "local_mtime": "2018-04-05 14:33:26.762368",
1748 "data_digest": "0x2ddbf8f5",
1749 "omap_digest": "0xa03cef03",
1750 "expected_object_size": 0,
1751 "expected_write_size": 0,
1752 "alloc_hint_flags": 0,
1758 "union_shard_errors": [
1780 "data_digest": "0x2ddbf8f5",
1781 "omap_digest": "0x067f306a",
1788 "selected_object_info": {
1799 "prior_version": "43'36",
1800 "last_reqid": "osd.1.0:55",
1803 "mtime": "2018-04-05 14:33:27.460958",
1804 "local_mtime": "2018-04-05 14:33:27.462109",
1814 "data_digest": "0x2ddbf8f5",
1815 "omap_digest": "0x067f306a",
1816 "expected_object_size": 0,
1817 "expected_write_size": 0,
1818 "alloc_hint_flags": 0,
1824 "union_shard_errors": [
1854 "union_shard_errors": [
1870 "object_info": "bad-val",
1871 "data_digest": "0x2ddbf8f5",
1872 "omap_digest": "0x4f14f849",
1881 "data_digest": "0x2ddbf8f5",
1882 "omap_digest": "0x4f14f849",
1891 "union_shard_errors": [
1918 "prior_version": "49'45",
1919 "last_reqid": "osd.1.0:48",
1922 "mtime": "2018-04-05 14:33:29.498969",
1923 "local_mtime": "2018-04-05 14:33:29.499890",
1933 "data_digest": "0x2ddbf8f5",
1934 "omap_digest": "0x2d2a4d6e",
1935 "expected_object_size": 0,
1936 "expected_write_size": 0,
1937 "alloc_hint_flags": 0,
1943 "data_digest": "0x2ddbf8f5",
1944 "omap_digest": "0x2d2a4d6e",
1951 "data_digest": "0x2ddbf8f5",
1952 "omap_digest": "0x2d2a4d6e",
1961 "selected_object_info": {
1972 "prior_version": "49'45",
1973 "last_reqid": "osd.1.0:48",
1976 "mtime": "2018-04-05 14:33:29.498969",
1977 "local_mtime": "2018-04-05 14:33:29.499890",
1987 "data_digest": "0x2ddbf8f5",
1988 "omap_digest": "0x2d2a4d6e",
1989 "expected_object_size": 0,
1990 "expected_write_size": 0,
1991 "alloc_hint_flags": 0,
1997 "union_shard_errors": [
2020 "data_digest": "0x2ddbf8f5",
2024 "omap_digest": "0x8b699207",
2030 "snapset": "bad-val",
2031 "data_digest": "0x2ddbf8f5",
2035 "omap_digest": "0x8b699207",
2041 "union_shard_errors": [
2054 "selected_object_info": {
2055 "alloc_hint_flags": 0,
2056 "data_digest": "0x2ddbf8f5",
2057 "expected_object_size": 0,
2058 "expected_write_size": 0,
2078 "omap_digest": "0xe9572720",
2087 "data_digest": "0x5af0c3ef",
2089 "data_digest_mismatch_info"
2091 "omap_digest": "0xe9572720",
2097 "data_digest": "0x5af0c3ef",
2099 "data_digest_mismatch_info"
2101 "omap_digest": "0xe9572720",
2107 "union_shard_errors": [
2108 "data_digest_mismatch_info"
2113 "object_info_inconsistency"
2121 "selected_object_info": {
2122 "alloc_hint_flags": 255,
2123 "data_digest": "0x2ddbf8f5",
2124 "expected_object_size": 0,
2125 "expected_write_size": 0,
2145 "omap_digest": "0xddc3680f",
2154 "data_digest": "0xbd89c912",
2156 "data_digest_mismatch_info"
2159 "alloc_hint_flags": 0,
2160 "data_digest": "0x2ddbf8f5",
2161 "expected_object_size": 0,
2162 "expected_write_size": 0,
2182 "omap_digest": "0xddc3680f",
2189 "omap_digest": "0xddc3680f",
2195 "data_digest": "0xbd89c912",
2197 "data_digest_mismatch_info"
2200 "alloc_hint_flags": 255,
2201 "data_digest": "0x2ddbf8f5",
2202 "expected_object_size": 0,
2203 "expected_write_size": 0,
2223 "omap_digest": "0xddc3680f",
2230 "omap_digest": "0xddc3680f",
2236 "union_shard_errors": [
2237 "data_digest_mismatch_info"
2243 "data_digest": "0x578a4830",
2244 "omap_digest": "0xf8e11918",
2247 "data_digest_mismatch_info"
2253 "data_digest": "0x2ddbf8f5",
2254 "omap_digest": "0xf8e11918",
2261 "selected_object_info": {
2272 "prior_version": "23'6",
2273 "last_reqid": "osd.1.0:59",
2276 "mtime": "2018-04-05 14:33:20.498756",
2277 "local_mtime": "2018-04-05 14:33:20.499704",
2287 "data_digest": "0x2ddbf8f5",
2288 "omap_digest": "0xf8e11918",
2289 "expected_object_size": 0,
2290 "expected_write_size": 0,
2291 "alloc_hint_flags": 0,
2297 "union_shard_errors": [
2298 "data_digest_mismatch_info"
2301 "data_digest_mismatch"
2314 "data_digest": "0x2ddbf8f5",
2315 "omap_digest": "0x00b35dfd",
2329 "selected_object_info": {
2340 "prior_version": "25'9",
2341 "last_reqid": "osd.1.0:60",
2344 "mtime": "2018-04-05 14:33:21.189382",
2345 "local_mtime": "2018-04-05 14:33:21.190446",
2355 "data_digest": "0x2ddbf8f5",
2356 "omap_digest": "0x00b35dfd",
2357 "expected_object_size": 0,
2358 "expected_write_size": 0,
2359 "alloc_hint_flags": 0,
2365 "union_shard_errors": [
2380 "data_digest": "0x2ddbf8f5",
2381 "omap_digest": "0xd7178dfe",
2384 "omap_digest_mismatch_info"
2390 "data_digest": "0x2ddbf8f5",
2391 "omap_digest": "0xe2d46ea4",
2398 "selected_object_info": {
2409 "prior_version": "27'12",
2410 "last_reqid": "osd.1.0:61",
2413 "mtime": "2018-04-05 14:33:21.862313",
2414 "local_mtime": "2018-04-05 14:33:21.863261",
2424 "data_digest": "0x2ddbf8f5",
2425 "omap_digest": "0xe2d46ea4",
2426 "expected_object_size": 0,
2427 "expected_write_size": 0,
2428 "alloc_hint_flags": 0,
2434 "union_shard_errors": [
2435 "omap_digest_mismatch_info"
2438 "omap_digest_mismatch"
2451 "data_digest": "0x2ddbf8f5",
2452 "omap_digest": "0x1a862a41",
2459 "data_digest": "0x2ddbf8f5",
2460 "omap_digest": "0x06cac8f6",
2463 "omap_digest_mismatch_info"
2469 "selected_object_info": {
2480 "prior_version": "29'15",
2481 "last_reqid": "osd.1.0:62",
2484 "mtime": "2018-04-05 14:33:22.589300",
2485 "local_mtime": "2018-04-05 14:33:22.590376",
2495 "data_digest": "0x2ddbf8f5",
2496 "omap_digest": "0x1a862a41",
2497 "expected_object_size": 0,
2498 "expected_write_size": 0,
2499 "alloc_hint_flags": 0,
2505 "union_shard_errors": [
2506 "omap_digest_mismatch_info"
2509 "omap_digest_mismatch"
2522 "data_digest": "0x2ddbf8f5",
2523 "omap_digest": "0x689ee887",
2526 "omap_digest_mismatch_info"
2532 "data_digest": "0x2ddbf8f5",
2533 "omap_digest": "0x179c919f",
2540 "selected_object_info": {
2551 "prior_version": "31'18",
2552 "last_reqid": "osd.1.0:53",
2555 "mtime": "2018-04-05 14:33:23.289188",
2556 "local_mtime": "2018-04-05 14:33:23.290130",
2566 "data_digest": "0x2ddbf8f5",
2567 "omap_digest": "0x179c919f",
2568 "expected_object_size": 0,
2569 "expected_write_size": 0,
2570 "alloc_hint_flags": 0,
2576 "union_shard_errors": [
2577 "omap_digest_mismatch_info"
2580 "omap_digest_mismatch"
2593 "data_digest": "0x2ddbf8f5",
2594 "omap_digest": "0xefced57a",
2601 "data_digest": "0x2ddbf8f5",
2602 "omap_digest": "0x6a73cc07",
2605 "omap_digest_mismatch_info"
2611 "selected_object_info": {
2622 "prior_version": "33'21",
2623 "last_reqid": "osd.1.0:52",
2626 "mtime": "2018-04-05 14:33:23.979658",
2627 "local_mtime": "2018-04-05 14:33:23.980731",
2637 "data_digest": "0x2ddbf8f5",
2638 "omap_digest": "0xefced57a",
2639 "expected_object_size": 0,
2640 "expected_write_size": 0,
2641 "alloc_hint_flags": 0,
2647 "union_shard_errors": [
2648 "omap_digest_mismatch_info"
2651 "omap_digest_mismatch"
2668 "name": "key1-ROBJ8"
2672 "value": "val2-ROBJ8",
2673 "name": "key2-ROBJ8"
2676 "data_digest": "0x2ddbf8f5",
2677 "omap_digest": "0xd6be81dc",
2687 "value": "val1-ROBJ8",
2688 "name": "key1-ROBJ8"
2692 "value": "val3-ROBJ8",
2693 "name": "key3-ROBJ8"
2696 "data_digest": "0x2ddbf8f5",
2697 "omap_digest": "0xd6be81dc",
2704 "selected_object_info": {
2715 "prior_version": "79'65",
2716 "last_reqid": "client.4554.0:1",
2719 "mtime": "2018-04-05 14:34:05.598688",
2720 "local_mtime": "2018-04-05 14:34:05.599698",
2730 "data_digest": "0x2ddbf8f5",
2731 "omap_digest": "0xd6be81dc",
2732 "expected_object_size": 0,
2733 "expected_write_size": 0,
2734 "alloc_hint_flags": 0,
2740 "union_shard_errors": [],
2742 "attr_value_mismatch",
2743 "attr_name_mismatch"
2767 "prior_version": "37'27",
2768 "last_reqid": "osd.1.0:63",
2771 "mtime": "2018-04-05 14:33:25.352485",
2772 "local_mtime": "2018-04-05 14:33:25.353746",
2782 "data_digest": "0x2ddbf8f5",
2783 "omap_digest": "0x2eecc539",
2784 "expected_object_size": 0,
2785 "expected_write_size": 0,
2786 "alloc_hint_flags": 0,
2792 "data_digest": "0x1f26fb26",
2793 "omap_digest": "0x2eecc539",
2796 "obj_size_info_mismatch"
2812 "version": "119'68",
2813 "prior_version": "51'64",
2814 "last_reqid": "client.4834.0:1",
2817 "mtime": "2018-04-05 14:35:01.500659",
2818 "local_mtime": "2018-04-05 14:35:01.502117",
2828 "data_digest": "0x1f26fb26",
2829 "omap_digest": "0x2eecc539",
2830 "expected_object_size": 0,
2831 "expected_write_size": 0,
2832 "alloc_hint_flags": 0,
2838 "data_digest": "0x1f26fb26",
2839 "omap_digest": "0x2eecc539",
2846 "selected_object_info": {
2856 "version": "119'68",
2857 "prior_version": "51'64",
2858 "last_reqid": "client.4834.0:1",
2861 "mtime": "2018-04-05 14:35:01.500659",
2862 "local_mtime": "2018-04-05 14:35:01.502117",
2872 "data_digest": "0x1f26fb26",
2873 "omap_digest": "0x2eecc539",
2874 "expected_object_size": 0,
2875 "expected_write_size": 0,
2876 "alloc_hint_flags": 0,
2882 "union_shard_errors": [
2883 "obj_size_info_mismatch"
2886 "object_info_inconsistency"
2901 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
2902 multidiff
$dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
2903 if test $getjson = "yes"
2905 jq
'.' $dir/json
> save2.json
2908 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
2910 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
2916 # This hangs if the repair doesn't work
2917 timeout
30 rados
-p $poolname get ROBJ17
$dir/robj17.out ||
return 1
2918 timeout
30 rados
-p $poolname get ROBJ18
$dir/robj18.out ||
return 1
2919 # Even though we couldn't repair all of the introduced errors, we can fix ROBJ17
2920 diff -q $dir/new.ROBJ17
$dir/robj17.out ||
return 1
2921 rm -f $dir/new.ROBJ17
$dir/robj17.out ||
return 1
2922 diff -q $dir/new.ROBJ18
$dir/robj18.out ||
return 1
2923 rm -f $dir/new.ROBJ18
$dir/robj18.out ||
return 1
2925 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
2926 teardown
$dir ||
return 1
2931 # Test scrub errors for an erasure coded pool
2933 function corrupt_scrub_erasure
() {
2935 local allow_overwrites
=$2
2936 local poolname
=ecpool
2939 setup
$dir ||
return 1
2940 run_mon
$dir a ||
return 1
2941 run_mgr
$dir x ||
return 1
2942 for id
in $
(seq 0 2) ; do
2943 if [ "$allow_overwrites" = "true" ]; then
2944 run_osd_bluestore
$dir $id ||
return 1
2946 run_osd
$dir $id ||
return 1
2949 create_rbd_pool ||
return 1
2952 create_ec_pool
$poolname $allow_overwrites k
=2 m
=1 stripe_unit
=2K
--force ||
return 1
2953 wait_for_clean ||
return 1
2955 for i
in $
(seq 1 $total_objs) ; do
2957 add_something
$dir $poolname $objname ||
return 1
2959 local osd
=$
(expr $i % 2)
2963 # Size (deep scrub data_digest too)
2964 local payload
=UVWXYZZZ
2965 echo $payload > $dir/CORRUPT
2966 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
2971 dd if=/dev
/urandom of
=$dir/CORRUPT bs
=2048 count
=1
2972 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
2977 objectstore_tool
$dir $osd $objname remove ||
return 1
2981 rados
--pool $poolname setxattr
$objname key1-
$objname val1-
$objname ||
return 1
2982 rados
--pool $poolname setxattr
$objname key2-
$objname val2-
$objname ||
return 1
2985 echo -n bad-val
> $dir/bad-val
2986 objectstore_tool
$dir $osd $objname set-attr _key1-
$objname $dir/bad-val ||
return 1
2987 objectstore_tool
$dir $osd $objname rm-attr _key2-
$objname ||
return 1
2988 echo -n val3-
$objname > $dir/newval
2989 objectstore_tool
$dir $osd $objname set-attr _key3-
$objname $dir/newval ||
return 1
2990 rm $dir/bad-val
$dir/newval
2995 dd if=/dev
/urandom of
=$dir/CORRUPT bs
=2048 count
=2
2996 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
3000 objectstore_tool
$dir 0 $objname rm-attr hinfo_key ||
return 1
3001 echo -n bad-val
> $dir/bad-val
3002 objectstore_tool
$dir 1 $objname set-attr hinfo_key
$dir/bad-val ||
return 1
3006 local payload
=MAKETHISDIFFERENTFROMOTHEROBJECTS
3007 echo $payload > $dir/DIFFERENT
3008 rados
--pool $poolname put
$objname $dir/DIFFERENT ||
return 1
3010 # Get hinfo_key from EOBJ1
3011 objectstore_tool
$dir 0 EOBJ1 get-attr hinfo_key
> $dir/hinfo
3012 objectstore_tool
$dir 0 $objname set-attr hinfo_key
$dir/hinfo ||
return 1
3019 local pg
=$
(get_pg
$poolname EOBJ0
)
3023 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
3025 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
3027 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
3029 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
3030 # Get epoch for repair-get requests
3031 epoch
=$
(jq .epoch
$dir/json
)
3033 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
3057 "prior_version": "0'0",
3058 "last_reqid": "client.4184.0:1",
3070 "data_digest": "0x2ddbf8f5",
3071 "omap_digest": "0xffffffff",
3072 "expected_object_size": 0,
3073 "expected_write_size": 0,
3074 "alloc_hint_flags": 0,
3083 "size_mismatch_info",
3084 "obj_size_info_mismatch"
3097 "selected_object_info": {
3108 "prior_version": "0'0",
3109 "last_reqid": "client.4184.0:1",
3121 "data_digest": "0x2ddbf8f5",
3122 "omap_digest": "0xffffffff",
3123 "expected_object_size": 0,
3124 "expected_write_size": 0,
3125 "alloc_hint_flags": 0,
3131 "union_shard_errors": [
3132 "size_mismatch_info",
3133 "obj_size_info_mismatch"
3171 "selected_object_info": {
3182 "prior_version": "0'0",
3183 "last_reqid": "client.4252.0:1",
3195 "data_digest": "0x2ddbf8f5",
3196 "omap_digest": "0xffffffff",
3197 "expected_object_size": 0,
3198 "expected_write_size": 0,
3199 "alloc_hint_flags": 0,
3205 "union_shard_errors": [
3224 "name": "key1-EOBJ4"
3228 "value": "val2-EOBJ4",
3229 "name": "key2-EOBJ4"
3247 "value": "val1-EOBJ4",
3248 "name": "key1-EOBJ4"
3252 "value": "val2-EOBJ4",
3253 "name": "key2-EOBJ4"
3266 "value": "val1-EOBJ4",
3267 "name": "key1-EOBJ4"
3271 "value": "val3-EOBJ4",
3272 "name": "key3-EOBJ4"
3277 "selected_object_info": {
3288 "prior_version": "45'5",
3289 "last_reqid": "client.4294.0:1",
3301 "data_digest": "0x2ddbf8f5",
3302 "omap_digest": "0xffffffff",
3303 "expected_object_size": 0,
3304 "expected_write_size": 0,
3305 "alloc_hint_flags": 0,
3311 "union_shard_errors": [],
3313 "attr_value_mismatch",
3314 "attr_name_mismatch"
3345 "prior_version": "0'0",
3346 "last_reqid": "client.4382.0:1",
3358 "data_digest": "0x2ddbf8f5",
3359 "omap_digest": "0xffffffff",
3360 "expected_object_size": 0,
3361 "expected_write_size": 0,
3362 "alloc_hint_flags": 0,
3371 "size_mismatch_info",
3372 "obj_size_info_mismatch"
3385 "selected_object_info": {
3396 "prior_version": "0'0",
3397 "last_reqid": "client.4382.0:1",
3409 "data_digest": "0x2ddbf8f5",
3410 "omap_digest": "0xffffffff",
3411 "expected_object_size": 0,
3412 "expected_write_size": 0,
3413 "alloc_hint_flags": 0,
3419 "union_shard_errors": [
3420 "size_mismatch_info",
3421 "obj_size_info_mismatch"
3443 "selected_object_info": {
3454 "prior_version": "0'0",
3455 "last_reqid": "client.4418.0:1",
3467 "data_digest": "0x2ddbf8f5",
3468 "omap_digest": "0xffffffff",
3469 "expected_object_size": 0,
3470 "expected_write_size": 0,
3471 "alloc_hint_flags": 0,
3494 "hashinfo": "bad-val",
3504 "cumulative_shard_hashes": [
3518 "total_chunk_size": 2048
3522 "union_shard_errors": [
3529 "hinfo_inconsistency"
3538 "selected_object_info": {
3549 "prior_version": "75'9",
3550 "last_reqid": "client.4482.0:1",
3562 "data_digest": "0x136e4e27",
3563 "omap_digest": "0xffffffff",
3564 "expected_object_size": 0,
3565 "expected_write_size": 0,
3566 "alloc_hint_flags": 0,
3575 "cumulative_shard_hashes": [
3589 "total_chunk_size": 2048
3599 "cumulative_shard_hashes": [
3613 "total_chunk_size": 2048
3623 "cumulative_shard_hashes": [
3637 "total_chunk_size": 2048
3646 "union_shard_errors": []
3653 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
3654 multidiff
$dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
3655 if test $getjson = "yes"
3657 jq
'.' $dir/json
> save3.json
3660 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
3662 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
3667 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
3669 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
3671 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
3673 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
3674 # Get epoch for repair-get requests
3675 epoch
=$
(jq .epoch
$dir/json
)
3677 if [ "$allow_overwrites" = "true" ]
3679 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
3685 "data_digest": "0x00000000",
3686 "omap_digest": "0xffffffff",
3705 "prior_version": "0'0",
3706 "last_reqid": "client.4184.0:1",
3709 "mtime": "2018-04-05 14:31:33.837147",
3710 "local_mtime": "2018-04-05 14:31:33.840763",
3718 "data_digest": "0x2ddbf8f5",
3719 "omap_digest": "0xffffffff",
3720 "expected_object_size": 0,
3721 "expected_write_size": 0,
3722 "alloc_hint_flags": 0,
3732 "size_mismatch_info",
3733 "obj_size_info_mismatch"
3739 "data_digest": "0x00000000",
3740 "omap_digest": "0xffffffff",
3748 "selected_object_info": {
3759 "prior_version": "0'0",
3760 "last_reqid": "client.4184.0:1",
3763 "mtime": "2018-04-05 14:31:33.837147",
3764 "local_mtime": "2018-04-05 14:31:33.840763",
3772 "data_digest": "0x2ddbf8f5",
3773 "omap_digest": "0xffffffff",
3774 "expected_object_size": 0,
3775 "expected_write_size": 0,
3776 "alloc_hint_flags": 0,
3782 "union_shard_errors": [
3784 "size_mismatch_info",
3785 "obj_size_info_mismatch"
3801 "data_digest": "0x00000000",
3802 "omap_digest": "0xffffffff",
3818 "data_digest": "0x00000000",
3819 "omap_digest": "0xffffffff",
3827 "selected_object_info": {
3838 "prior_version": "0'0",
3839 "last_reqid": "client.4252.0:1",
3842 "mtime": "2018-04-05 14:31:46.841145",
3843 "local_mtime": "2018-04-05 14:31:46.844996",
3851 "data_digest": "0x2ddbf8f5",
3852 "omap_digest": "0xffffffff",
3853 "expected_object_size": 0,
3854 "expected_write_size": 0,
3855 "alloc_hint_flags": 0,
3861 "union_shard_errors": [
3880 "name": "key1-EOBJ4"
3884 "value": "val2-EOBJ4",
3885 "name": "key2-EOBJ4"
3888 "data_digest": "0x00000000",
3889 "omap_digest": "0xffffffff",
3900 "value": "val1-EOBJ4",
3901 "name": "key1-EOBJ4"
3905 "value": "val2-EOBJ4",
3906 "name": "key2-EOBJ4"
3909 "data_digest": "0x00000000",
3910 "omap_digest": "0xffffffff",
3921 "value": "val1-EOBJ4",
3922 "name": "key1-EOBJ4"
3926 "value": "val3-EOBJ4",
3927 "name": "key3-EOBJ4"
3930 "data_digest": "0x00000000",
3931 "omap_digest": "0xffffffff",
3939 "selected_object_info": {
3950 "prior_version": "45'5",
3951 "last_reqid": "client.4294.0:1",
3954 "mtime": "2018-04-05 14:31:54.663622",
3955 "local_mtime": "2018-04-05 14:31:54.664527",
3963 "data_digest": "0x2ddbf8f5",
3964 "omap_digest": "0xffffffff",
3965 "expected_object_size": 0,
3966 "expected_write_size": 0,
3967 "alloc_hint_flags": 0,
3973 "union_shard_errors": [],
3975 "attr_value_mismatch",
3976 "attr_name_mismatch"
3989 "data_digest": "0x00000000",
3990 "omap_digest": "0xffffffff",
3998 "data_digest": "0x00000000",
3999 "omap_digest": "0xffffffff",
4011 "prior_version": "0'0",
4012 "last_reqid": "client.4382.0:1",
4015 "mtime": "2018-04-05 14:32:12.929161",
4016 "local_mtime": "2018-04-05 14:32:12.934707",
4024 "data_digest": "0x2ddbf8f5",
4025 "omap_digest": "0xffffffff",
4026 "expected_object_size": 0,
4027 "expected_write_size": 0,
4028 "alloc_hint_flags": 0,
4036 "size_mismatch_info",
4037 "obj_size_info_mismatch"
4044 "data_digest": "0x00000000",
4045 "omap_digest": "0xffffffff",
4053 "selected_object_info": {
4064 "prior_version": "0'0",
4065 "last_reqid": "client.4382.0:1",
4068 "mtime": "2018-04-05 14:32:12.929161",
4069 "local_mtime": "2018-04-05 14:32:12.934707",
4077 "data_digest": "0x2ddbf8f5",
4078 "omap_digest": "0xffffffff",
4079 "expected_object_size": 0,
4080 "expected_write_size": 0,
4081 "alloc_hint_flags": 0,
4087 "union_shard_errors": [
4088 "size_mismatch_info",
4089 "obj_size_info_mismatch"
4111 "union_shard_errors": [
4116 "selected_object_info": {
4127 "prior_version": "0'0",
4128 "last_reqid": "client.4418.0:1",
4131 "mtime": "2018-04-05 14:32:20.634116",
4132 "local_mtime": "2018-04-05 14:32:20.637999",
4140 "data_digest": "0x2ddbf8f5",
4141 "omap_digest": "0xffffffff",
4142 "expected_object_size": 0,
4143 "expected_write_size": 0,
4144 "alloc_hint_flags": 0,
4170 "hashinfo": "bad-val"
4178 "omap_digest": "0xffffffff",
4179 "data_digest": "0x00000000",
4181 "cumulative_shard_hashes": [
4195 "total_chunk_size": 2048
4209 "hinfo_inconsistency"
4211 "union_shard_errors": [],
4212 "selected_object_info": {
4223 "prior_version": "75'9",
4224 "last_reqid": "client.4482.0:1",
4227 "mtime": "2018-04-05 14:32:33.058782",
4228 "local_mtime": "2018-04-05 14:32:33.059679",
4236 "data_digest": "0x136e4e27",
4237 "omap_digest": "0xffffffff",
4238 "expected_object_size": 0,
4239 "expected_write_size": 0,
4240 "alloc_hint_flags": 0,
4253 "omap_digest": "0xffffffff",
4254 "data_digest": "0x00000000",
4256 "cumulative_shard_hashes": [
4270 "total_chunk_size": 2048
4279 "omap_digest": "0xffffffff",
4280 "data_digest": "0x00000000",
4282 "cumulative_shard_hashes": [
4296 "total_chunk_size": 2048
4305 "omap_digest": "0xffffffff",
4306 "data_digest": "0x00000000",
4308 "cumulative_shard_hashes": [
4322 "total_chunk_size": 2048
4334 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
4340 "data_digest": "0x04cfa72f",
4341 "omap_digest": "0xffffffff",
4360 "prior_version": "0'0",
4361 "last_reqid": "client.4192.0:1",
4364 "mtime": "2018-04-05 14:30:10.688009",
4365 "local_mtime": "2018-04-05 14:30:10.691774",
4373 "data_digest": "0x2ddbf8f5",
4374 "omap_digest": "0xffffffff",
4375 "expected_object_size": 0,
4376 "expected_write_size": 0,
4377 "alloc_hint_flags": 0,
4387 "size_mismatch_info",
4388 "obj_size_info_mismatch"
4394 "data_digest": "0x04cfa72f",
4395 "omap_digest": "0xffffffff",
4403 "selected_object_info": {
4414 "prior_version": "0'0",
4415 "last_reqid": "client.4192.0:1",
4418 "mtime": "2018-04-05 14:30:10.688009",
4419 "local_mtime": "2018-04-05 14:30:10.691774",
4427 "data_digest": "0x2ddbf8f5",
4428 "omap_digest": "0xffffffff",
4429 "expected_object_size": 0,
4430 "expected_write_size": 0,
4431 "alloc_hint_flags": 0,
4437 "union_shard_errors": [
4439 "size_mismatch_info",
4440 "obj_size_info_mismatch"
4465 "data_digest": "0x04cfa72f",
4466 "omap_digest": "0xffffffff",
4474 "data_digest": "0x04cfa72f",
4475 "omap_digest": "0xffffffff",
4483 "selected_object_info": {
4494 "prior_version": "0'0",
4495 "last_reqid": "client.4224.0:1",
4498 "mtime": "2018-04-05 14:30:14.152945",
4499 "local_mtime": "2018-04-05 14:30:14.154014",
4507 "data_digest": "0x2ddbf8f5",
4508 "omap_digest": "0xffffffff",
4509 "expected_object_size": 0,
4510 "expected_write_size": 0,
4511 "alloc_hint_flags": 0,
4517 "union_shard_errors": [
4532 "data_digest": "0x04cfa72f",
4533 "omap_digest": "0xffffffff",
4549 "data_digest": "0x04cfa72f",
4550 "omap_digest": "0xffffffff",
4558 "selected_object_info": {
4569 "prior_version": "0'0",
4570 "last_reqid": "client.4258.0:1",
4573 "mtime": "2018-04-05 14:30:18.875544",
4574 "local_mtime": "2018-04-05 14:30:18.880153",
4582 "data_digest": "0x2ddbf8f5",
4583 "omap_digest": "0xffffffff",
4584 "expected_object_size": 0,
4585 "expected_write_size": 0,
4586 "alloc_hint_flags": 0,
4592 "union_shard_errors": [
4611 "name": "key1-EOBJ4"
4615 "value": "val2-EOBJ4",
4616 "name": "key2-EOBJ4"
4619 "data_digest": "0x04cfa72f",
4620 "omap_digest": "0xffffffff",
4633 "omap_digest": "0xffffffff",
4634 "data_digest": "0x04cfa72f",
4638 "value": "val1-EOBJ4",
4639 "name": "key1-EOBJ4"
4643 "value": "val2-EOBJ4",
4644 "name": "key2-EOBJ4"
4654 "omap_digest": "0xffffffff",
4655 "data_digest": "0x04cfa72f",
4659 "value": "val1-EOBJ4",
4660 "name": "key1-EOBJ4"
4664 "value": "val3-EOBJ4",
4665 "name": "key3-EOBJ4"
4670 "selected_object_info": {
4681 "prior_version": "45'5",
4682 "last_reqid": "client.4296.0:1",
4685 "mtime": "2018-04-05 14:30:22.271983",
4686 "local_mtime": "2018-04-05 14:30:22.272840",
4694 "data_digest": "0x2ddbf8f5",
4695 "omap_digest": "0xffffffff",
4696 "expected_object_size": 0,
4697 "expected_write_size": 0,
4698 "alloc_hint_flags": 0,
4704 "union_shard_errors": [],
4706 "attr_value_mismatch",
4707 "attr_name_mismatch"
4720 "data_digest": "0x04cfa72f",
4721 "omap_digest": "0xffffffff",
4740 "prior_version": "0'0",
4741 "last_reqid": "client.4384.0:1",
4744 "mtime": "2018-04-05 14:30:35.162395",
4745 "local_mtime": "2018-04-05 14:30:35.166390",
4753 "data_digest": "0x2ddbf8f5",
4754 "omap_digest": "0xffffffff",
4755 "expected_object_size": 0,
4756 "expected_write_size": 0,
4757 "alloc_hint_flags": 0,
4766 "size_mismatch_info",
4768 "obj_size_info_mismatch"
4774 "data_digest": "0x04cfa72f",
4775 "omap_digest": "0xffffffff",
4783 "selected_object_info": {
4794 "prior_version": "0'0",
4795 "last_reqid": "client.4384.0:1",
4798 "mtime": "2018-04-05 14:30:35.162395",
4799 "local_mtime": "2018-04-05 14:30:35.166390",
4807 "data_digest": "0x2ddbf8f5",
4808 "omap_digest": "0xffffffff",
4809 "expected_object_size": 0,
4810 "expected_write_size": 0,
4811 "alloc_hint_flags": 0,
4817 "union_shard_errors": [
4818 "size_mismatch_info",
4820 "obj_size_info_mismatch"
4842 "union_shard_errors": [
4847 "selected_object_info": {
4858 "prior_version": "0'0",
4859 "last_reqid": "client.4420.0:1",
4862 "mtime": "2018-04-05 14:30:40.914673",
4863 "local_mtime": "2018-04-05 14:30:40.917705",
4871 "data_digest": "0x2ddbf8f5",
4872 "omap_digest": "0xffffffff",
4873 "expected_object_size": 0,
4874 "expected_write_size": 0,
4875 "alloc_hint_flags": 0,
4901 "hashinfo": "bad-val"
4909 "omap_digest": "0xffffffff",
4910 "data_digest": "0x04cfa72f",
4912 "cumulative_shard_hashes": [
4926 "total_chunk_size": 2048
4940 "hinfo_inconsistency"
4942 "union_shard_errors": [
4945 "selected_object_info": {
4956 "prior_version": "75'9",
4957 "last_reqid": "client.4486.0:1",
4960 "mtime": "2018-04-05 14:30:50.995009",
4961 "local_mtime": "2018-04-05 14:30:50.996112",
4969 "data_digest": "0x136e4e27",
4970 "omap_digest": "0xffffffff",
4971 "expected_object_size": 0,
4972 "expected_write_size": 0,
4973 "alloc_hint_flags": 0,
4989 "cumulative_shard_hashes": [
5003 "total_chunk_size": 2048
5012 "omap_digest": "0xffffffff",
5013 "data_digest": "0x5b7455a8",
5015 "cumulative_shard_hashes": [
5029 "total_chunk_size": 2048
5038 "omap_digest": "0xffffffff",
5039 "data_digest": "0x5b7455a8",
5041 "cumulative_shard_hashes": [
5055 "total_chunk_size": 2048
5067 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
5068 multidiff
$dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
5069 if test $getjson = "yes"
5071 if [ "$allow_overwrites" = "true" ]
5077 jq
'.' $dir/json
> save
${num}.json
5080 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
5082 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
5085 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
5086 teardown
$dir ||
return 1
5089 function TEST_corrupt_scrub_erasure_appends
() {
5090 corrupt_scrub_erasure
$1 false
5093 function TEST_corrupt_scrub_erasure_overwrites
() {
5094 if [ "$use_ec_overwrite" = "true" ]; then
5095 corrupt_scrub_erasure
$1 true
5100 # Test to make sure that a periodic scrub won't cause deep-scrub info to be lost
5102 function TEST_periodic_scrub_replicated
() {
5104 local poolname
=psr_pool
5107 setup
$dir ||
return 1
5108 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
5109 run_mgr
$dir x ||
return 1
5110 local ceph_osd_args
="--osd-scrub-interval-randomize-ratio=0 --osd-deep-scrub-randomize-ratio=0 "
5111 ceph_osd_args
+="--osd_scrub_backoff_ratio=0"
5112 run_osd
$dir 0 $ceph_osd_args ||
return 1
5113 run_osd
$dir 1 $ceph_osd_args ||
return 1
5114 create_rbd_pool ||
return 1
5115 wait_for_clean ||
return 1
5117 create_pool
$poolname 1 1 ||
return 1
5118 wait_for_clean ||
return 1
5121 add_something
$dir $poolname $objname scrub ||
return 1
5122 local primary
=$
(get_primary
$poolname $objname)
5123 local pg
=$
(get_pg
$poolname $objname)
5125 # Add deep-scrub only error
5126 local payload
=UVWXYZ
5127 echo $payload > $dir/CORRUPT
5128 # Uses $ceph_osd_args for osd restart
5129 objectstore_tool
$dir $osd $objname set-bytes
$dir/CORRUPT ||
return 1
5131 # No scrub information available, so expect failure
5133 ! rados list-inconsistent-obj
$pg | jq
'.' ||
return 1
5136 pg_deep_scrub
$pg ||
return 1
5138 # Make sure bad object found
5139 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
5142 local last_scrub
=$
(get_last_scrub_stamp
$pg)
5143 # Fake a schedule scrub
5144 CEPH_ARGS
='' ceph
--admin-daemon $
(get_asok_path osd.
${primary}) \
5145 trigger_scrub
$pg ||
return 1
5146 # Wait for schedule regular scrub
5147 wait_for_scrub
$pg "$last_scrub"
5149 # It needed to be upgraded
5150 grep -q "Deep scrub errors, upgrading scrub to deep-scrub" $dir/osd.
${primary}.log ||
return 1
5152 # Bad object still known
5153 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
5155 # Can't upgrade with this set
5156 ceph osd
set nodeep-scrub
5157 # Let map change propagate to OSDs
5161 # Fake a schedule scrub
5162 CEPH_ARGS
='' ceph
--admin-daemon $
(get_asok_path osd.
${primary}) \
5163 trigger_scrub
$pg ||
return 1
5164 # Wait for schedule regular scrub
5165 # to notice scrub and skip it
5167 for i
in $
(seq 14 -1 0)
5170 ! grep -q "Regular scrub skipped due to deep-scrub errors and nodeep-scrub set" $dir/osd.
${primary}.log ||
{ found
=true
; break; }
5171 echo Time left
: $i seconds
5173 test $found = "true" ||
return 1
5175 # Bad object still known
5176 rados list-inconsistent-obj
$pg | jq
'.' |
grep -q $objname ||
return 1
5179 # Request a regular scrub and it will be done
5181 grep -q "Regular scrub request, deep-scrub details will be lost" $dir/osd.
${primary}.log ||
return 1
5183 # deep-scrub error is no longer present
5184 rados list-inconsistent-obj
$pg | jq
'.' |
grep -qv $objname ||
return 1
5188 # Corrupt snapset in replicated pool
5190 function TEST_corrupt_snapset_scrub_rep
() {
5192 local poolname
=csr_pool
5195 setup
$dir ||
return 1
5196 run_mon
$dir a
--osd_pool_default_size=2 ||
return 1
5197 run_mgr
$dir x ||
return 1
5198 run_osd
$dir 0 ||
return 1
5199 run_osd
$dir 1 ||
return 1
5200 create_rbd_pool ||
return 1
5201 wait_for_clean ||
return 1
5203 create_pool foo
1 ||
return 1
5204 create_pool
$poolname 1 1 ||
return 1
5205 wait_for_clean ||
return 1
5207 for i
in $
(seq 1 $total_objs) ; do
5209 add_something
$dir $poolname $objname ||
return 1
5211 rados
--pool $poolname setomapheader
$objname hdr-
$objname ||
return 1
5212 rados
--pool $poolname setomapval
$objname key-
$objname val-
$objname ||
return 1
5215 local pg
=$
(get_pg
$poolname ROBJ0
)
5217 for i
in $
(seq 1 $total_objs) ; do
5220 # Alternate corruption between osd.0 and osd.1
5221 local osd
=$
(expr $i % 2)
5223 rados
-p $poolname mksnap snap1
5224 echo -n head_of_snapshot_data
> $dir/change
5228 rados
--pool $poolname put
$objname $dir/change
5229 objectstore_tool
$dir $osd --head $objname clear-snapset corrupt ||
return 1
5233 rados
--pool $poolname put
$objname $dir/change
5234 objectstore_tool
$dir $osd --head $objname clear-snapset corrupt ||
return 1
5243 rados list-inconsistent-pg
$poolname > $dir/json ||
return 1
5245 test $
(jq
'. | length' $dir/json
) = "1" ||
return 1
5247 test $
(jq
-r '.[0]' $dir/json
) = $pg ||
return 1
5249 rados list-inconsistent-obj
$pg > $dir/json ||
return 1
5251 jq
"$jqfilter" << EOF | jq '.inconsistents' | python -c "$sortkeys" > $dir/checkcsjson
5264 "snapset_inconsistency"
5266 "union_shard_errors": [],
5267 "selected_object_info": {
5278 "prior_version": "21'3",
5279 "last_reqid": "client.4195.0:1",
5282 "mtime": "2018-04-05 14:35:43.286117",
5283 "local_mtime": "2018-04-05 14:35:43.288990",
5292 "data_digest": "0x53acb008",
5293 "omap_digest": "0xffffffff",
5294 "expected_object_size": 0,
5295 "expected_write_size": 0,
5296 "alloc_hint_flags": 0,
5353 "snapset_inconsistency"
5355 "union_shard_errors": [],
5356 "selected_object_info": {
5367 "prior_version": "23'6",
5368 "last_reqid": "client.4223.0:1",
5371 "mtime": "2018-04-05 14:35:48.326856",
5372 "local_mtime": "2018-04-05 14:35:48.328097",
5381 "data_digest": "0x53acb008",
5382 "omap_digest": "0xffffffff",
5383 "expected_object_size": 0,
5384 "expected_write_size": 0,
5385 "alloc_hint_flags": 0,
5437 jq
"$jqfilter" $dir/json | jq
'.inconsistents' | python
-c "$sortkeys" > $dir/csjson
5438 multidiff
$dir/checkcsjson
$dir/csjson ||
test $getjson = "yes" ||
return 1
5439 if test $getjson = "yes"
5441 jq
'.' $dir/json
> save6.json
5444 if test "$LOCALRUN" = "yes" && which jsonschema
> /dev
/null
;
5446 jsonschema
-i $dir/json
$CEPH_ROOT/doc
/rados
/command
/list-inconsistent-obj.json ||
return 1
5449 rados rmpool
$poolname $poolname --yes-i-really-really-mean-it
5450 teardown
$dir ||
return 1
5453 main osd-scrub-repair
"$@"
5456 # compile-command: "cd build ; make -j4 && \
5457 # ../qa/run-standalone.sh osd-scrub-repair.sh"