From: David Zafman Date: Wed, 30 Sep 2015 02:57:43 +0000 (-0700) Subject: test: Test scrubbing of snapshot problems X-Git-Tag: v10.0.0~30^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e5ad33ec07ee9fffe862d84955a566261d101713;p=ceph.git test: Test scrubbing of snapshot problems Signed-off-by: David Zafman --- diff --git a/src/test/osd/osd-scrub-snaps.sh b/src/test/osd/osd-scrub-snaps.sh new file mode 100755 index 000000000000..51f08c8d7c6b --- /dev/null +++ b/src/test/osd/osd-scrub-snaps.sh @@ -0,0 +1,149 @@ +#! /bin/bash + +TESTDATA="testdata.$$" + +function wait_for_health() { + echo -n "Wait for health_ok..." + tries=0 + while ./ceph health 2> /dev/null | grep -v 'HEALTH_OK' > /dev/null + do + tries=`expr $tries + 1` + if [ $tries = "30" ]; + then + echo "Time exceeded to go to health" + exit 1 + fi + sleep 5 + done + echo "DONE" +} + +# A single osd +rm -rf out dev +MDS=0 MON=1 OSD=1 ./vstart.sh -l -d -n -o "osd_pool_default_size=1" +wait_for_health + +# Create a pool with a single pg +./ceph osd pool create test 1 1 + +dd if=/dev/urandom of=$TESTDATA bs=1032 count=1 +for i in `seq 1 5` +do + ./rados -p test put obj${i} $TESTDATA +done + +SNAP=1 +./rados -p test mksnap snap${SNAP} +dd if=/dev/urandom of=$TESTDATA bs=256 count=${SNAP} +./rados -p test put obj1 $TESTDATA +./rados -p test put obj5 $TESTDATA +./rados -p test put obj3 $TESTDATA + +SNAP=2 +./rados -p test mksnap snap${SNAP} +dd if=/dev/urandom of=$TESTDATA bs=256 count=${SNAP} +./rados -p test put obj5 $TESTDATA + +SNAP=3 +./rados -p test mksnap snap${SNAP} +dd if=/dev/urandom of=$TESTDATA bs=256 count=${SNAP} +./rados -p test put obj3 $TESTDATA + +SNAP=4 +./rados -p test mksnap snap${SNAP} +dd if=/dev/urandom of=$TESTDATA bs=256 count=${SNAP} +./rados -p test put obj5 $TESTDATA +./rados -p test put obj2 $TESTDATA + +SNAP=5 +./rados -p test mksnap snap${SNAP} +SNAP=6 +./rados -p test mksnap snap${SNAP} +dd if=/dev/urandom of=$TESTDATA bs=256 count=${SNAP} +./rados -p test put obj5 $TESTDATA + +SNAP=7 +./rados -p test mksnap snap${SNAP} + +./rados -p test rm obj4 +./rados -p test rm obj2 + +killall ceph-osd +sleep 5 + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj1 | grep \"snapid\":-2)" +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" remove + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj5 | grep \"snapid\":2)" +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" remove + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj5 | grep \"snapid\":1)" +OBJ5SAVE="$JSON" +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" remove + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj5 | grep \"snapid\":4)" +dd if=/dev/urandom of=$TESTDATA bs=256 count=18 +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" set-bytes $TESTDATA + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj3 | grep \"snapid\":-2)" +dd if=/dev/urandom of=$TESTDATA bs=256 count=15 +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" set-bytes $TESTDATA + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj4 | grep \"snapid\":7)" +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" remove + +JSON="$(./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal --op list obj2 | grep \"snapid\":-1)" +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" rm-attr snapset + +# Create a clone which isn't in snapset and doesn't have object info +JSON="$(echo "$OBJ5SAVE" | sed s/snapid\":1/snapid\":7/)" +dd if=/dev/urandom of=$TESTDATA bs=256 count=7 +./ceph-objectstore-tool --data-path dev/osd0 --journal-path dev/osd0.journal "$JSON" set-bytes $TESTDATA + +rm -f $TESTDATA + +#MDS=0 MON=1 OSD=1 ./vstart.sh -l -d -o "osd_pool_default_size=1" +./ceph-osd -i 0 -c ceph.conf +wait_for_health + +sleep 5 +./ceph pg scrub 1.0 +timeout 30 ./ceph -w + +./stop.sh + +ERRORS=0 + +declare -a err_strings +err_strings[0]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/6cf8deff/obj1/1 is an unexpected clone" +err_strings[1]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/7 no '_' attr" +err_strings[2]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/7 is an unexpected clone" +err_strings[3]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/head expected clone 1/666934a3/obj5/2" +err_strings[4]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/head expected clone 1/666934a3/obj5/1" +err_strings[5]="log_channel[(]cluster[)] log [[]INF[]] : scrub 1.0 1/666934a3/obj5/head missing clones" +err_strings[6]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/3f1ee208/obj2/snapdir no 'snapset' attr" +err_strings[7]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/3f1ee208/obj2/7 is an unexpected clone" +err_strings[8]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/3f1ee208/obj2/4 is an unexpected clone" +err_strings[9]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/a8759770/obj4/snapdir expected clone 1/a8759770/obj4/7" +err_strings[10]="log_channel[(]cluster[)] log [[]INF[]] : scrub 1.0 1/a8759770/obj4/snapdir missing clones" +err_strings[11]="log_channel[(]cluster[)] log [[]ERR[]] : 1.0 scrub 12 errors" +err_strings[12]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/666934a3/obj5/4 on disk size [(]4608[)] does not match object info size [(]512[)] adjusted for ondisk to [(]512[)]" +err_strings[13]="log_channel[(]cluster[)] log [[]ERR[]] : scrub 1.0 1/61f68bb1/obj3/head on disk size [(]3840[)] does not match object info size [(]768[)] adjusted for ondisk to [(]768[)]" + +for i in `seq 0 ${#err_strings[@]}` +do + if ! grep "${err_strings[$i]}" out/osd.0.log > /dev/null; + then + echo "Missing log message '${err_strings[$i]}'" + ERRORS=$(expr $ERRORS + 1) + fi +done + +if [ $ERRORS != "0" ]; +then + echo "TEST FAILED WITH $ERRORS ERRORS" + exit 1 +fi + +echo "TEST PASSED" +exit 0