From 76234d0023a94e8b965695253072d95f36baa628 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 14 Feb 2019 12:57:37 +0200 Subject: [PATCH] journal: fix potential race when closing object recorder Calls `send_appends_aio` only if m_pending_buffers is not empty. It was supposed it was ok to call it even for empty buffers, because `send_appends_aio` just returned in this case. But the problem is caused by m_aio_scheduled flag, which is set before releasing the lock and cleared in `send_appends_aio`, after reacquiring the lock. If during this time window `close` is called it will return false due to m_aio_scheduled flag set, and the caller will expect "closed" notification, which is never fired in this case. Fixes: https://tracker.ceph.com/issues/38315 Signed-off-by: Mykola Golub --- src/journal/ObjectRecorder.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/journal/ObjectRecorder.cc b/src/journal/ObjectRecorder.cc index f39ca981cc0c7..c78b7130886ab 100644 --- a/src/journal/ObjectRecorder.cc +++ b/src/journal/ObjectRecorder.cc @@ -303,10 +303,12 @@ void ObjectRecorder::handle_append_flushed(uint64_t tid, int r) { // all remaining unsent appends should be redirected to new object m_append_buffers.splice(m_append_buffers.begin(), m_pending_buffers); notify_handler_unlock(); - } else { + } else if (!m_pending_buffers.empty()) { m_aio_scheduled = true; m_lock->Unlock(); send_appends_aio(); + } else { + m_lock->Unlock(); } } else { m_lock->Unlock(); -- 2.39.5