]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fix requeue of replay requests during activating 6401/head
authorSage Weil <sage@redhat.com>
Tue, 22 Sep 2015 17:57:37 +0000 (13:57 -0400)
committerNathan Cutler <ncutler@suse.com>
Tue, 27 Oct 2015 20:08:07 +0000 (21:08 +0100)
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 <sage@redhat.com>
(cherry picked from commit d18cf51d9419819cdda3782b188b010969288911)

src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h

index 0c01ba6168df6e0688ba78defc91bc6082919a2e..4cc9e11ffbf435eda899569757651000c1c4568e 100644 (file)
@@ -7848,11 +7848,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 {
index 7b91bf8c97d934d60004f30174b034c462ddd03d..b730aaf2f163d9a4e9f2660c81e0713f4ad006bb 100644 (file)
@@ -1818,6 +1818,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<OpRequestRef> replay;
   dout(10) << "replay_queued_ops" << dendl;
@@ -1838,9 +1839,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();
 }
index 41de9d6d14a6a021d65ca100467590136d3cea53..5e7914400e60269958f0cd586fb4fe90f3f01bdc 100644 (file)
@@ -2078,6 +2078,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); }