r = 0;
}
+ else if (m->cmd[2] == "degraded_pgs_exist") {
+ bool degraded_pgs_exist = false;
+ hash_map<pg_t,pg_stat_t>::const_iterator end = pg_map.pg_stat.end();
+ for (hash_map<pg_t,pg_stat_t>::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;
+ }
}
}
#!/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
# 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"
}
$@
# Includes
source "`dirname $0`/test_common.sh"
-# Constants
+# Functions
my_write_objects() {
write_objects $1 $2 10 1000000
}
./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