From: David Zafman Date: Thu, 25 Jan 2018 22:10:24 +0000 (-0800) Subject: osd: Fix for handling more than 1 missing target X-Git-Tag: v13.1.0~565^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d7fd9174b9f01d4145c4d97338f67e9bccfe13b0;p=ceph.git osd: Fix for handling more than 1 missing target Fix test case to test more than 1 target Signed-off-by: David Zafman --- diff --git a/qa/standalone/osd/osd-recovery-stats.sh b/qa/standalone/osd/osd-recovery-stats.sh index 8b50274e3558..54b99a7b7d9b 100755 --- a/qa/standalone/osd/osd-recovery-stats.sh +++ b/qa/standalone/osd/osd-recovery-stats.sh @@ -281,19 +281,21 @@ function TEST_recovery_sizedown() { } # [1] -> [1,2] -# degraded 200 -> 100 +# degraded 300 -> 200 # active+recovering+undersized+degraded # PG_STAT OBJECTS MISSING_ON_PRIMARY DEGRADED MISPLACED UNFOUND BYTES LOG DISK_LOG STATE STATE_STAMP VERSION REPORTED UP UP_PRIMARY ACTING ACTING_PRIMARY LAST_SCRUB SCRUB_STAMP LAST_DEEP_SCRUB DEEP_SCRUB_STAMP -# 1.0 100 0 200 0 0 0 100 100 active+recovering+undersized+degraded 2017-11-17 17:16:15.302943 13'500 16:643 [1,2] 1 [1,2] 1 0'0 2017-11-17 17:15:34.985563 0'0 2017-11-17 17:15:34.985563 +# 1.0 100 0 300 0 0 0 100 100 active+recovering+undersized+degraded 2017-11-17 17:16:15.302943 13'500 16:643 [1,2] 1 [1,2] 1 0'0 2017-11-17 17:15:34.985563 0'0 2017-11-17 17:15:34.985563 function TEST_recovery_undersized() { local dir=$1 + local osds=3 run_mon $dir a || return 1 run_mgr $dir x || return 1 - run_osd $dir 0 || return 1 - run_osd $dir 1 || return 1 - run_osd $dir 2 || return 1 + for i in $(seq 0 $(expr $osds - 1)) + do + run_osd $dir $i || return 1 + done create_pool $poolname 1 1 ceph osd pool set $poolname size 1 @@ -310,7 +312,7 @@ function TEST_recovery_undersized() { ceph osd set norecover # Mark any osd not the primary (only 1 replica so also has no replica) - for i in 0 1 2 + for i in $(seq 0 $(expr $osds - 1)) do if [ $i = $primary ]; then @@ -319,12 +321,12 @@ function TEST_recovery_undersized() { ceph osd out osd.$i break done - ceph osd pool set test size 3 + ceph osd pool set test size 4 ceph osd unset norecover ceph tell osd.$(get_primary $poolname obj1) debug kick_recovery_wq 0 # Give extra sleep time because code below doesn't have the sophistication of wait_for_clean() sleep 10 - flush_pg_stats + flush_pg_stats || return 1 # Wait for recovery to finish # Can't use wait_for_clean() because state goes from active+recovering+undersized+degraded @@ -347,13 +349,9 @@ function TEST_recovery_undersized() { primary=$(get_primary $poolname obj1) local log=$dir/osd.${primary}.log - UPACT=$(grep "pg[[]${PG}.*recovering.*_update_calc_stats " $log | tail -1 | sed "s/.*[)] \([[][^ p]*\).*$/\1/") - - local degraded=$(expr $objects \* 2) - FIRST=$(grep "pg[[]${PG}.*recovering.*_update_calc_stats degraded " $log | grep -F " $UPACT " | head -1 | sed "s/.* \([0-9]*\)$/\1/") - below_margin $FIRST $degraded || return 1 - LAST=$(grep "pg[[]${PG}.*recovering.*_update_calc_stats degraded " $log | tail -1 | sed "s/.* \([0-9]*\)$/\1/") - above_margin $LAST $objects || return 1 + local first_degraded=$(expr $objects \* 3) + local last_degraded=$(expr $objects \* 2) + check $PG $log $first_degraded $last_degraded 0 0 || return 1 delete_pool $poolname kill_daemons $dir || return 1 diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 63dc9a44d173..0e80ad9dae10 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2763,8 +2763,8 @@ void PG::_update_calc_stats() // Add to missing_target_objects up to target elements (num_objects missing) assert(target >= missing_target_objects.size()); unsigned needed = target - missing_target_objects.size(); - for (; needed; --needed) - missing_target_objects.insert(make_pair(num_objects, pg_shard_t(pg_shard_t::NO_OSD))); + if (needed) + missing_target_objects.insert(make_pair(num_objects * needed, pg_shard_t(pg_shard_t::NO_OSD))); } else { for (unsigned i = 0 ; i < num_shards; ++i) { shard_id_t shard(i);