From f62eeb102383d17acd160714aee789f008f8d847 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 13 Feb 2018 10:18:25 -0500 Subject: [PATCH] journal: support concurrent refresh requests Signed-off-by: Jason Dillaman (cherry picked from commit c5a5b20e08413630376e09fc62f33547e7b99fcc) --- src/journal/JournalMetadata.cc | 27 ++++++++++++++++++++++----- src/journal/JournalMetadata.h | 10 ++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index 967529ddb68ed..3675e31c545ec 100644 --- a/src/journal/JournalMetadata.cc +++ b/src/journal/JournalMetadata.cc @@ -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); } } diff --git a/src/journal/JournalMetadata.h b/src/journal/JournalMetadata.h index 24c3a69361fa0..011ab87108a77 100644 --- a/src/journal/JournalMetadata.h +++ b/src/journal/JournalMetadata.h @@ -158,6 +158,7 @@ public: private: typedef std::map AllocatedEntryTids; typedef std::list Listeners; + typedef std::list 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; -- 2.39.5