]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: do not auto-delete mirror snapshots
authorJason Dillaman <dillaman@redhat.com>
Fri, 31 Jan 2020 02:54:06 +0000 (21:54 -0500)
committerJason Dillaman <dillaman@redhat.com>
Fri, 31 Jan 2020 03:26:04 +0000 (22:26 -0500)
Instead, the disable mirror state machine will delete the snapshots.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/image/PreRemoveRequest.cc
src/librbd/image/RemoveRequest.cc

index 5b1b7dd18dcca72e300245335739b7848172ead3..1a9d489d804edeee2bc434d3b31b5c77a6041a21 100644 (file)
@@ -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<I>::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;
index 5a4f56adf518598e786c3bbabdd189a399893887..a708e9d62c4cdb7f88b8c085a21706518d1a6e58 100644 (file)
@@ -218,6 +218,14 @@ void RemoveRequest<I>::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);
 }