]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: support concurrent refresh requests
authorJason Dillaman <dillaman@redhat.com>
Tue, 13 Feb 2018 15:18:25 +0000 (10:18 -0500)
committerNathan Cutler <ncutler@suse.com>
Tue, 3 Apr 2018 09:16:25 +0000 (11:16 +0200)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit c5a5b20e08413630376e09fc62f33547e7b99fcc)

src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h

index 967529ddb68edeea91d73033082d26ae9e9a6241..3675e31c545ec5ff7c029a2a8210131b59938e02 100644 (file)
@@ -740,16 +740,25 @@ void JournalMetadata::handle_immutable_metadata(int r, Context *on_init) {
 
 void JournalMetadata::refresh(Context *on_complete) {
   ldout(m_cct, 10) << "refreshing mutable metadata" << dendl;
-  C_Refresh *refresh = new C_Refresh(this, on_complete);
+
+  {
+    Mutex::Locker locker(m_lock);
+    if (on_complete != nullptr) {
+      m_refresh_ctxs.push_back(on_complete);
+    }
+    ++m_refreshes_in_progress;
+  }
+
+  auto refresh = new C_Refresh(this);
   get_mutable_metadata(&refresh->minimum_set, &refresh->active_set,
                       &refresh->registered_clients, refresh);
 }
 
 void JournalMetadata::handle_refresh_complete(C_Refresh *refresh, int r) {
   ldout(m_cct, 10) << "refreshed mutable metadata: r=" << r << dendl;
-  if (r == 0) {
-    Mutex::Locker locker(m_lock);
 
+  m_lock.Lock();
+  if (r == 0) {
     Client client(m_client_id, bufferlist());
     RegisteredClients::iterator it = refresh->registered_clients.find(client);
     if (it != refresh->registered_clients.end()) {
@@ -778,8 +787,16 @@ void JournalMetadata::handle_refresh_complete(C_Refresh *refresh, int r) {
     }
   }
 
-  if (refresh->on_finish != NULL) {
-    refresh->on_finish->complete(r);
+  Contexts refresh_ctxs;
+  assert(m_refreshes_in_progress > 0);
+  --m_refreshes_in_progress;
+  if (m_refreshes_in_progress == 0) {
+    std::swap(refresh_ctxs, m_refresh_ctxs);
+  }
+  m_lock.Unlock();
+
+  for (auto ctx : refresh_ctxs) {
+    ctx->complete(r);
   }
 }
 
index 24c3a69361fa02df86c67d3909f5a2dccdc99a7c..011ab87108a7762bd40a35dd447f6e7d3b79e916 100644 (file)
@@ -158,6 +158,7 @@ public:
 private:
   typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
   typedef std::list<JournalMetadataListener*> Listeners;
+  typedef std::list<Context*> Contexts;
 
   struct CommitEntry {
     uint64_t object_num;
@@ -283,11 +284,9 @@ private:
     uint64_t minimum_set;
     uint64_t active_set;
     RegisteredClients registered_clients;
-    Context *on_finish;
 
-    C_Refresh(JournalMetadata *_journal_metadata, Context *_on_finish)
-      : journal_metadata(_journal_metadata), minimum_set(0), active_set(0),
-        on_finish(_on_finish) {
+    C_Refresh(JournalMetadata *_journal_metadata)
+      : journal_metadata(_journal_metadata), minimum_set(0), active_set(0) {
       Mutex::Locker locker(journal_metadata->m_lock);
       journal_metadata->m_async_op_tracker.start_op();
     }
@@ -334,6 +333,9 @@ private:
   size_t m_update_notifications;
   Cond m_update_cond;
 
+  size_t m_refreshes_in_progress = 0;
+  Contexts m_refresh_ctxs;
+
   uint64_t m_commit_position_tid = 0;
   ObjectSetPosition m_commit_position;
   Context *m_commit_position_ctx;