]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/api: helper method for natively listing the trash
authorJason Dillaman <dillaman@redhat.com>
Wed, 10 Mar 2021 19:44:36 +0000 (14:44 -0500)
committerNathan Cutler <ncutler@suse.com>
Thu, 8 Apr 2021 13:03:21 +0000 (15:03 +0200)
The existing list method converts the native TrashImageSpec to the
API's rbd_trash_image_info_t which is missing the source field.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 21adc927fe50ae37069d77482edd4c4e098433c9)

src/librbd/api/Trash.cc

index 0664461e86398ccfc0e22fea8a515e8ec3a7aec6..a7aac5f2e22b635ba5f7033935a27c90fbe4c31c 100644 (file)
@@ -123,6 +123,48 @@ int enable_mirroring(IoCtx &io_ctx, const std::string &image_id) {
   return 0;
 }
 
+int list_trash_image_specs(
+    librados::IoCtx &io_ctx,
+    std::map<std::string, cls::rbd::TrashImageSpec>* trash_image_specs,
+    bool exclude_user_remove_source) {
+  CephContext *cct((CephContext *)io_ctx.cct());
+  ldout(cct, 20) << "list_trash_image_specs " << &io_ctx << dendl;
+
+  bool more_entries;
+  uint32_t max_read = 1024;
+  std::string last_read;
+  do {
+    std::map<string, cls::rbd::TrashImageSpec> trash_entries;
+    int r = cls_client::trash_list(&io_ctx, last_read, max_read,
+                                   &trash_entries);
+    if (r < 0 && r != -ENOENT) {
+      lderr(cct) << "error listing rbd trash entries: " << cpp_strerror(r)
+                 << dendl;
+      return r;
+    } else if (r == -ENOENT) {
+      break;
+    }
+
+    if (trash_entries.empty()) {
+      break;
+    }
+
+    for (const auto &entry : trash_entries) {
+      if (exclude_user_remove_source &&
+          entry.second.source == cls::rbd::TRASH_IMAGE_SOURCE_REMOVING) {
+        continue;
+      }
+
+      trash_image_specs->insert({entry.first, entry.second});
+    }
+
+    last_read = trash_entries.rbegin()->first;
+    more_entries = (trash_entries.size() >= max_read);
+  } while (more_entries);
+
+  return 0;
+}
+
 } // anonymous namespace
 
 template <typename I>
@@ -277,41 +319,23 @@ template <typename I>
 int Trash<I>::list(IoCtx &io_ctx, vector<trash_image_info_t> &entries,
                    bool exclude_user_remove_source) {
   CephContext *cct((CephContext *)io_ctx.cct());
-  ldout(cct, 20) << "trash_list " << &io_ctx << dendl;
-
-  bool more_entries;
-  uint32_t max_read = 1024;
-  std::string last_read = "";
-  do {
-    map<string, cls::rbd::TrashImageSpec> trash_entries;
-    int r = cls_client::trash_list(&io_ctx, last_read, max_read,
-                                   &trash_entries);
-    if (r < 0 && r != -ENOENT) {
-      lderr(cct) << "error listing rbd trash entries: " << cpp_strerror(r)
-                 << dendl;
-      return r;
-    } else if (r == -ENOENT) {
-      break;
-    }
+  ldout(cct, 20) << __func__ << " " << &io_ctx << dendl;
 
-    if (trash_entries.empty()) {
-      break;
-    }
+  std::map<std::string, cls::rbd::TrashImageSpec> trash_image_specs;
+  int r = list_trash_image_specs(io_ctx, &trash_image_specs,
+                                 exclude_user_remove_source);
+  if (r < 0) {
+    return r;
+  }
 
-    for (const auto &entry : trash_entries) {
-      rbd_trash_image_source_t source =
-          static_cast<rbd_trash_image_source_t>(entry.second.source);
-      if (exclude_user_remove_source &&
-          source == RBD_TRASH_IMAGE_SOURCE_REMOVING) {
-        continue;
-      }
-      entries.push_back({entry.first, entry.second.name, source,
-                         entry.second.deletion_time.sec(),
-                         entry.second.deferment_end_time.sec()});
-    }
-    last_read = trash_entries.rbegin()->first;
-    more_entries = (trash_entries.size() >= max_read);
-  } while (more_entries);
+  entries.reserve(trash_image_specs.size());
+  for (const auto &entry : trash_image_specs) {
+    rbd_trash_image_source_t source =
+        static_cast<rbd_trash_image_source_t>(entry.second.source);
+    entries.push_back({entry.first, entry.second.name, source,
+                       entry.second.deletion_time.sec(),
+                       entry.second.deferment_end_time.sec()});
+  }
 
   return 0;
 }