From 80f3ea10f58daf3698a28ddc48645cd4e8fd023d Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Mon, 22 Nov 2010 11:32:38 -0800 Subject: [PATCH] Add ./ceph dump pg debug degraded_pgs_exist ./ceph dump pg debug degraded_pgs_exist returns TRUE if some pgs are degraded; false otherwise. tests: move start_recovery into test_common.sh. Create recovery1 test. Signed-off-by: Colin McCabe --- src/mon/PGMonitor.cc | 18 +++++++++++++ src/test/test_common.sh | 10 +++++++ src/test/test_lost.sh | 57 ++++++++++++++++++++-------------------- src/test/test_unfound.sh | 11 +------- 4 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 52c8d92f32fd9..0e6fc312eb837 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -754,6 +754,24 @@ bool PGMonitor::preprocess_command(MMonCommand *m) r = 0; } + else if (m->cmd[2] == "degraded_pgs_exist") { + bool degraded_pgs_exist = false; + hash_map::const_iterator end = pg_map.pg_stat.end(); + for (hash_map::const_iterator s = pg_map.pg_stat.begin(); + s != end; ++s) + { + if (s->second.num_objects_degraded > 0) { + degraded_pgs_exist = true; + break; + } + } + if (degraded_pgs_exist) + ss << "TRUE"; + else + ss << "FALSE"; + + r = 0; + } } } diff --git a/src/test/test_common.sh b/src/test/test_common.sh index 75a0770b88091..143140999d83a 100755 --- a/src/test/test_common.sh +++ b/src/test/test_common.sh @@ -118,6 +118,7 @@ poll_cmd() { dump_osd_store() { set +x + echo "dumping osd store..." find ./dev/osd* -type f | grep obj | grep head$ | while read file; do echo $file head -c 10 $file @@ -125,4 +126,13 @@ dump_osd_store() { done } +start_recovery() { + CEPH_NUM_OSD=$1 + osd=0 + while [ $osd -lt $CEPH_NUM_OSD ]; do + ./ceph osd tell $osd injectargs 'osd recovery delay start = 0' + osd=$((osd+1)) + done +} + init diff --git a/src/test/test_lost.sh b/src/test/test_lost.sh index baba361435bff..6279dcc797735 100755 --- a/src/test/test_lost.sh +++ b/src/test/test_lost.sh @@ -1,48 +1,36 @@ #!/bin/bash -x # -# Simple test of recovery logic +# Test the lost object logic # # Includes -dir=`dirname $0` -source $dir/test_common.sh -setup_tempdir -cd $dir/.. - -# Constants -MAX_OBJS=50 -OBJ_SIZE=1000000 - -write_objects() { - start_ver=$1 - stop_ver=$2 - for v in `seq $start_ver $stop_ver`; do - chr=`perl -e "print chr(48+$v)"` - head -c $OBJ_SIZE /dev/zero | tr '\0' "$chr" > $TEMPDIR/ver$v - for i in `seq -w 1 $MAX_OBJS`; do - ./rados -p data put obj$i $TEMPDIR/ver$v || die "radostool failed" - done - done +source "`dirname $0`/test_common.sh" + +# Functions +my_write_objects() { + write_objects $1 $2 10 1000000 } setup() { + export CEPH_NUM_OSD=$1 + # Start ceph ./stop.sh # set recovery start to a really long time to ensure that we don't start recovery - CEPH_NUM_OSD=2 ./vstart.sh -d -n -o 'osd recovery delay start = 10000' || die "vstart failed" + ./vstart.sh -d -n -o 'osd recovery delay start = 10000' || die "vstart failed" } -do_test() { +recovery1_impl() { # Write lots and lots of objects - write_objects 1 2 + my_write_objects 1 1 # Take down osd1 stop_osd 1 # Continue writing a lot of objects - write_objects 3 4 + my_write_objects 2 2 # Bring up osd1 restart_osd 1 @@ -55,13 +43,26 @@ do_test() { # Objects should be lost. stop_osd 0 - # Now we should be in LOST_REVERT + poll_cmd "./ceph pg debug degraded_pgs_exist" TRUE 3 120 + [ $? -eq 1 ] || die "Failed to see degraded PGs." + poll_cmd "./ceph pg debug unfound_objects_exist" TRUE 3 120 + [ $? -eq 1 ] || die "Failed to see unfound objects." + echo "Got unfound objects." + + # Turn on recovery and wait for it to complete. + poll_cmd "./ceph pg debug unfound_objects_exist" FALSE 3 120 + [ $? -eq 1 ] || die "Failed to recover unfound objects." + poll_cmd "./ceph pg debug degraded_pgs_exist" FALSE 3 120 + [ $? -eq 1 ] || die "Recovery never finished." } -run() { - setup +recovery1() { + setup 2 + recovery1_impl +} - do_test +run() { + recovery1 || die "test failed" } $@ diff --git a/src/test/test_unfound.sh b/src/test/test_unfound.sh index 6d772d3ac219d..ff359cba62642 100755 --- a/src/test/test_unfound.sh +++ b/src/test/test_unfound.sh @@ -7,7 +7,7 @@ # Includes source "`dirname $0`/test_common.sh" -# Constants +# Functions my_write_objects() { write_objects $1 $2 10 1000000 } @@ -22,15 +22,6 @@ setup() { ./vstart.sh -d -n -o 'osd recovery delay start = 10000' || die "vstart failed" } -start_recovery() { - CEPH_NUM_OSD=$1 - osd=0 - while [ $osd -lt $CEPH_NUM_OSD ]; do - ./ceph osd tell $osd injectargs 'osd recovery delay start = 0' - osd=$((osd+1)) - done -} - osd_resurrection_1_impl() { # Write lots and lots of objects my_write_objects 1 2 -- 2.39.5