From: Sage Weil Date: Tue, 22 Sep 2015 17:57:37 +0000 (-0400) Subject: osd: fix requeue of replay requests during activating X-Git-Tag: v9.1.0~51^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d18cf51d9419819cdda3782b188b010969288911;p=ceph.git osd: fix requeue of replay requests during activating If the replay period expires while we are still in the activating state, we can simply insert our list of requests at the front of the waiting_for_active list. Fixes: #13116 Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 7e0cec564dbc..67d2936c452a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7801,11 +7801,11 @@ void OSD::check_replay_queue() PG *pg = _lookup_lock_pg_with_map_lock_held(pgid); pg_map_lock.unlock(); dout(10) << "check_replay_queue " << *pg << dendl; - if (pg->is_active() && - pg->is_replay() && + if ((pg->is_active() || pg->is_activating()) && + pg->is_replay() && pg->is_primary() && pg->replay_until == p->second) { - pg->replay_queued_ops(); + pg->replay_queued_ops(); } pg->unlock(); } else { diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 3bdb13cbbd48..d585dea58cdf 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1890,6 +1890,7 @@ void PG::queue_op(OpRequestRef& op) void PG::replay_queued_ops() { assert(is_replay()); + assert(is_active() || is_activating()); eversion_t c = info.last_update; list replay; dout(10) << "replay_queued_ops" << dendl; @@ -1910,9 +1911,13 @@ void PG::replay_queued_ops() replay.push_back(p->second); } replay_queue.clear(); - requeue_ops(replay); - requeue_ops(waiting_for_active); - assert(waiting_for_peered.empty()); + if (is_active()) { + requeue_ops(replay); + requeue_ops(waiting_for_active); + assert(waiting_for_peered.empty()); + } else { + waiting_for_active.splice(waiting_for_active.begin(), replay); + } publish_stats_to_osd(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 7859f1a5a3c0..f94cae83098c 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2118,6 +2118,7 @@ public: int get_state() const { return state; } bool is_active() const { return state_test(PG_STATE_ACTIVE); } + bool is_activating() const { return state_test(PG_STATE_ACTIVATING); } bool is_peering() const { return state_test(PG_STATE_PEERING); } bool is_down() const { return state_test(PG_STATE_DOWN); } bool is_replay() const { return state_test(PG_STATE_REPLAY); }