From: Samuel Just Date: Tue, 26 Aug 2014 19:02:52 +0000 (-0700) Subject: PG: recover from each osd at most once X-Git-Tag: v0.85~4^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e6da7323655f3bfa4f669fb8361fcaa96f633456;p=ceph.git PG: recover from each osd at most once Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 8a8fd4757a9c..9b76833376ec 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -6021,9 +6021,7 @@ PG::RecoveryState::WaitRemoteRecoveryReserved::react(const RemoteRecoveryReserve PG *pg = context< RecoveryMachine >().pg; if (remote_recovery_reservation_it != context< Active >().remote_shards_to_reserve_recovery.end()) { - // skip myself - if (*remote_recovery_reservation_it == pg->pg_whoami) - ++remote_recovery_reservation_it; + assert(*remote_recovery_reservation_it != pg->pg_whoami); } if (remote_recovery_reservation_it != context< Active >().remote_shards_to_reserve_recovery.end()) { @@ -6185,16 +6183,34 @@ void PG::RecoveryState::Clean::exit() pg->osd->recoverystate_perf->tinc(rs_clean_latency, dur); } +template +set unique_osd_shard_set(const pg_shard_t & skip, const T &in) +{ + set osds_found; + set out; + for (typename T::const_iterator i = in.begin(); + i != in.end(); + ++i) { + if (*i != skip && !osds_found.count(i->osd)) { + osds_found.insert(i->osd); + out.insert(*i); + } + } + return out; +} + /*---------Active---------*/ PG::RecoveryState::Active::Active(my_context ctx) : my_base(ctx), NamedState(context< RecoveryMachine >().pg->cct, "Started/Primary/Active"), remote_shards_to_reserve_recovery( - context< RecoveryMachine >().pg->actingbackfill.begin(), - context< RecoveryMachine >().pg->actingbackfill.end()), + unique_osd_shard_set( + context< RecoveryMachine >().pg->pg_whoami, + context< RecoveryMachine >().pg->actingbackfill)), remote_shards_to_reserve_backfill( - context< RecoveryMachine >().pg->backfill_targets.begin(), - context< RecoveryMachine >().pg->backfill_targets.end()), + unique_osd_shard_set( + context< RecoveryMachine >().pg->pg_whoami, + context< RecoveryMachine >().pg->backfill_targets)), all_replicas_activated(false) { context< RecoveryMachine >().log_enter(state_name);