]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: avoid EUCLEAN error after "rbd rm" is interrupted 50130/head
authorweixinwei <weixw3@lenovo.com>
Tue, 15 Nov 2022 07:31:06 +0000 (15:31 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 15 Feb 2023 15:44:08 +0000 (16:44 +0100)
If "rbd rm" command is interrupted (e.g. killed), the image in the
trash stays in cls::rbd::TRASH_IMAGE_STATE_MOVING state. Later, when
"rbd rm" command is rerun, EUCLEAN error is returned.

Fixes: https://tracker.ceph.com/issues/58060
Signed-off-by: weixinwei <weixw3@lenovo.com>
(cherry picked from commit 145ecb15c2b6b240a4abb5a0d81d081efeb98614)

src/librbd/api/Image.cc

index 772dd7f058eaff756cdfd6169989812d369e2711..88521759e8567ce6d97af7eb3ca4c6cc1e2c8611 100644 (file)
@@ -787,12 +787,24 @@ int Image<I>::remove(IoCtx& io_ctx, const std::string &image_name,
     r = Trash<I>::list(io_ctx, trash_entries, false);
     if (r < 0) {
       return r;
-    } else if (r >= 0) {
-      for (auto& entry : trash_entries) {
-        if (entry.name == image_name &&
-            entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) {
-          return Trash<I>::remove(io_ctx, entry.id, true, prog_ctx);
+    }
+    for (auto& entry : trash_entries) {
+      if (entry.name == image_name &&
+          entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) {
+        cls::rbd::TrashImageSpec spec;
+        r = cls_client::trash_get(&io_ctx, entry.id, &spec);
+        if (r < 0) {
+          lderr(cct) << "error getting image id " << entry.id
+                     << " info from trash: " << cpp_strerror(r) << dendl;
+          return r;
+        }
+        if (spec.state == cls::rbd::TRASH_IMAGE_STATE_MOVING) {
+          r = Trash<I>::move(io_ctx, entry.source, entry.name, entry.id, 0);
+          if (r < 0) {
+            return r;
+          }
         }
+        return Trash<I>::remove(io_ctx, entry.id, true, prog_ctx);
       }
     }