From: Jason Dillaman Date: Fri, 13 Nov 2015 07:00:21 +0000 (-0500) Subject: journal: avoid holding lock while marking ops are complete X-Git-Tag: v10.0.1~52^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a3aa565bfbfe30e32ddb57a11b6b2e67e0826d7a;p=ceph.git journal: avoid holding lock while marking ops are complete There is a possibility of a race if the JournalTrimmer destructor is waiting for an async op to complete but the op is flagged as complete while the mutex is being held. Signed-off-by: Jason Dillaman --- diff --git a/src/journal/JournalTrimmer.cc b/src/journal/JournalTrimmer.cc index 2af67a829839..33e3be2c5b0d 100644 --- a/src/journal/JournalTrimmer.cc +++ b/src/journal/JournalTrimmer.cc @@ -147,7 +147,6 @@ void JournalTrimmer::handle_commit_position_safe( trim_objects(object_set_position.object_number / splay_width); } } - m_async_op_tracker.finish_op(); } void JournalTrimmer::handle_set_removed(int r, uint64_t object_set) { @@ -175,7 +174,6 @@ void JournalTrimmer::handle_set_removed(int r, uint64_t object_set) { ldout(m_cct, 20) << "completing remove set context" << dendl; m_remove_set_ctx->complete(r); } - m_async_op_tracker.finish_op(); } JournalTrimmer::C_RemoveSet::C_RemoveSet(JournalTrimmer *_journal_trimmer, diff --git a/src/journal/JournalTrimmer.h b/src/journal/JournalTrimmer.h index 937340733d70..9f557a7671bc 100644 --- a/src/journal/JournalTrimmer.h +++ b/src/journal/JournalTrimmer.h @@ -37,6 +37,7 @@ private: virtual void finish(int r) { journal_trimmer->handle_commit_position_safe(r, object_set_position); + journal_trimmer->m_async_op_tracker.finish_op(); } }; struct C_RemoveSet : public Context { @@ -51,6 +52,7 @@ private: virtual void complete(int r); virtual void finish(int r) { journal_trimmer->handle_set_removed(r, object_set); + journal_trimmer->m_async_op_tracker.finish_op(); } };