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()) {
}
}
- 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);
}
}
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;
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();
}
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;