From a8c69a867ad36f1ca62ad7d55dbe988036a3545c Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 20 Dec 2017 16:55:06 -0500 Subject: [PATCH] librbd: filter out potential race with image rename Fixes: http://tracker.ceph.com/issues/18435 Signed-off-by: Jason Dillaman (cherry picked from commit 001d2fc35c170f17e706aeae541fb86dac960319) --- src/librbd/operation/RenameRequest.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/librbd/operation/RenameRequest.cc b/src/librbd/operation/RenameRequest.cc index cfd54d1d86040..75630915598fc 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; -- 2.39.5