From: Jason Dillaman Date: Wed, 10 Mar 2021 19:44:36 +0000 (-0500) Subject: librbd/api: helper method for natively listing the trash X-Git-Tag: v14.2.22~22^2~6^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e6b4780e5dd959e347c3aa6f5282b0ff45023bdd;p=ceph.git librbd/api: helper method for natively listing the trash 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 (cherry picked from commit 21adc927fe50ae37069d77482edd4c4e098433c9) --- diff --git a/src/librbd/api/Trash.cc b/src/librbd/api/Trash.cc index 0664461e8639..a7aac5f2e22b 100644 --- a/src/librbd/api/Trash.cc +++ b/src/librbd/api/Trash.cc @@ -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* 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 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 @@ -277,41 +319,23 @@ template int Trash::list(IoCtx &io_ctx, vector &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 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 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(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(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; }