]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: fire replay complete event after reading last object 6762/head
authorJason Dillaman <dillaman@redhat.com>
Wed, 2 Dec 2015 02:36:47 +0000 (21:36 -0500)
committerJason Dillaman <dillaman@redhat.com>
Wed, 2 Dec 2015 02:49:32 +0000 (21:49 -0500)
Fixes: #13924
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/journal/JournalPlayer.cc
src/journal/JournalPlayer.h

index 1fd674ad93ee14243cb2b8644c5a9e317d232aed..b78f29c10451ba8d4c565b75b34d27d8cef4a907 100644 (file)
@@ -146,6 +146,7 @@ bool JournalPlayer::try_pop_front(Entry *entry, uint64_t *commit_tid) {
         m_watch_interval);
       m_watch_scheduled = true;
     } else if (!m_watch_enabled && !object_player->is_fetch_in_progress()) {
+      ldout(m_cct, 10) << __func__ << ": replay complete" << dendl;
       m_journal_metadata->get_finisher().queue(new C_HandleComplete(
         m_replay_handler), 0);
     }
@@ -199,7 +200,7 @@ void JournalPlayer::process_state(uint64_t object_number, int r) {
       break;
     case STATE_PLAYBACK:
       ldout(m_cct, 10) << "PLAYBACK" << dendl;
-      r = process_playback();
+      r = process_playback(object_number);
       break;
     case STATE_ERROR:
       ldout(m_cct, 10) << "ERROR" << dendl;
@@ -221,7 +222,7 @@ void JournalPlayer::process_state(uint64_t object_number, int r) {
 }
 
 int JournalPlayer::process_prefetch(uint64_t object_number) {
-  ldout(m_cct, 10) << __func__ << dendl;
+  ldout(m_cct, 10) << __func__ << ": object_num=" << object_number << dendl;
   assert(m_lock.is_locked());
 
   uint8_t splay_width = m_journal_metadata->get_splay_width();
@@ -311,17 +312,26 @@ int JournalPlayer::process_prefetch(uint64_t object_number) {
   return 0;
 }
 
-int JournalPlayer::process_playback() {
-  ldout(m_cct, 10) << __func__ << dendl;
+int JournalPlayer::process_playback(uint64_t object_number) {
+  ldout(m_cct, 10) << __func__ << ": object_num=" << object_number << dendl;
   assert(m_lock.is_locked());
 
   m_watch_scheduled = false;
 
   ObjectPlayerPtr object_player = get_object_player();
-  if (!object_player->empty()) {
-    ldout(m_cct, 10) << __func__ << ": entries available" << dendl;
-    m_journal_metadata->get_finisher().queue(new C_HandleEntriesAvailable(
-      m_replay_handler), 0);
+  if (object_player->get_object_number() == object_number) {
+    uint8_t splay_width = m_journal_metadata->get_splay_width();
+    uint64_t active_set = m_journal_metadata->get_active_set();
+    uint64_t object_set = object_player->get_object_number() / splay_width;
+    if (!object_player->empty()) {
+      ldout(m_cct, 10) << __func__ << ": entries available" << dendl;
+      m_journal_metadata->get_finisher().queue(new C_HandleEntriesAvailable(
+        m_replay_handler), 0);
+    } else if (object_set == active_set) {
+      ldout(m_cct, 10) << __func__ << ": replay complete" << dendl;
+      m_journal_metadata->get_finisher().queue(new C_HandleComplete(
+        m_replay_handler), 0);
+    }
   }
   return 0;
 }
index 93347ea3f22edcdea14fd040ae4f1341ec67a9b7..49680adac75b3bc7420b99a41df02fbb0fb267e6 100644 (file)
@@ -108,7 +108,7 @@ private:
 
   void process_state(uint64_t object_number, int r);
   int process_prefetch(uint64_t object_number);
-  int process_playback();
+  int process_playback(uint64_t object_number);
 
   void fetch(uint64_t object_num);
   void handle_fetched(uint64_t object_num, int r);