From: Jason Dillaman Date: Wed, 20 Dec 2017 21:55:06 +0000 (-0500) Subject: librbd: filter out potential race with image rename X-Git-Tag: wip-pdonnell-testing-20180317.202121~756^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=001d2fc35c170f17e706aeae541fb86dac960319;p=ceph-ci.git librbd: filter out potential race with image rename Fixes: http://tracker.ceph.com/issues/18435 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/operation/RenameRequest.cc b/src/librbd/operation/RenameRequest.cc index 1ed49a0e971..c6e6c6422d3 100644 --- a/src/librbd/operation/RenameRequest.cc +++ b/src/librbd/operation/RenameRequest.cc @@ -74,8 +74,10 @@ bool RenameRequest::should_complete(int r) { return true; } - if (m_state == STATE_REMOVE_SOURCE_HEADER) { + if (m_state == STATE_UPDATE_DIRECTORY) { + // update in-memory name before removing source header apply(); + } else if (m_state == STATE_REMOVE_SOURCE_HEADER) { return true; } @@ -102,7 +104,13 @@ int RenameRequest::filter_state_return_code(int r) { I &image_ctx = this->m_image_ctx; CephContext *cct = image_ctx.cct; - if (m_state == STATE_REMOVE_SOURCE_HEADER && r < 0) { + if (m_state == STATE_READ_SOURCE_HEADER && r == -ENOENT) { + RWLock::RLocker snap_locker(image_ctx.snap_lock); + if (image_ctx.name == m_dest_name) { + // signal that replay raced with itself + return -EEXIST; + } + } else if (m_state == STATE_REMOVE_SOURCE_HEADER && r < 0) { if (r != -ENOENT) { lderr(cct) << "warning: couldn't remove old source object (" << m_source_oid << ")" << dendl;