From: Jason Dillaman Date: Fri, 31 Jan 2020 02:54:06 +0000 (-0500) Subject: librbd: do not auto-delete mirror snapshots X-Git-Tag: v15.1.1~472^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=93f549c3c607bce28af43dd515a76debdddc77e2;p=ceph.git librbd: do not auto-delete mirror snapshots Instead, the disable mirror state machine will delete the snapshots. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/image/PreRemoveRequest.cc b/src/librbd/image/PreRemoveRequest.cc index 5b1b7dd18dcc..1a9d489d804e 100644 --- a/src/librbd/image/PreRemoveRequest.cc +++ b/src/librbd/image/PreRemoveRequest.cc @@ -26,6 +26,16 @@ bool auto_delete_snapshot(const SnapInfo& snap_info) { snap_info.snap_namespace); switch (snap_namespace_type) { case cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH: + return true; + default: + return false; + } +} + +bool ignore_snapshot(const SnapInfo& snap_info) { + auto snap_namespace_type = cls::rbd::get_snap_namespace_type( + snap_info.snap_namespace); + switch (snap_namespace_type) { case cls::rbd::SNAPSHOT_NAMESPACE_TYPE_MIRROR_PRIMARY: case cls::rbd::SNAPSHOT_NAMESPACE_TYPE_MIRROR_NON_PRIMARY: return true; @@ -160,7 +170,7 @@ void PreRemoveRequest::check_image_snaps() { for (auto& snap_info : m_image_ctx->snap_info) { if (auto_delete_snapshot(snap_info.second)) { m_snap_infos.insert(snap_info); - } else { + } else if (!ignore_snapshot(snap_info.second)) { m_image_ctx->image_lock.unlock_shared(); ldout(cct, 5) << "image has snapshots - not removing" << dendl; diff --git a/src/librbd/image/RemoveRequest.cc b/src/librbd/image/RemoveRequest.cc index 5a4f56adf518..a708e9d62c4c 100644 --- a/src/librbd/image/RemoveRequest.cc +++ b/src/librbd/image/RemoveRequest.cc @@ -218,6 +218,14 @@ void RemoveRequest::handle_disable_mirror(int r) { << cpp_strerror(r) << dendl; } + // one last chance to ensure all snapshots have been deleted + m_image_ctx->image_lock.lock_shared(); + if (!m_image_ctx->snap_info.empty()) { + ldout(m_cct, 5) << "image has snapshots - not removing" << dendl; + m_ret_val = -ENOTEMPTY; + } + m_image_ctx->image_lock.unlock_shared(); + send_close_image(r); }