From 90960b12a027a480e53020aa34b19c152d3c6765 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 8 Sep 2017 15:41:36 -0400 Subject: [PATCH] cls/rbd: avoid recursively listing the watchers on rbd_mirroring object Signed-off-by: Jason Dillaman (cherry picked from commit 79be496ac098859304efcabc7b5eb8afca6eca91) Conflicts: src/cls/rbd/cls_rbd.cc: trivial resolution --- src/cls/rbd/cls_rbd.cc | 80 +++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 6adc31fa25cdc..f55917e0cb07b 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -3006,6 +3006,22 @@ int uuid_get(cls_method_context_t hctx, std::string *mirror_uuid) { return 0; } +int list_watchers(cls_method_context_t hctx, + std::set *entities) { + obj_list_watch_response_t watchers; + int r = cls_cxx_list_watchers(hctx, &watchers); + if (r < 0 && r != -ENOENT) { + CLS_ERR("error listing watchers: '%s'", cpp_strerror(r).c_str()); + return r; + } + + entities->clear(); + for (auto &w : watchers.entries) { + entities->emplace(w.name, w.addr); + } + return 0; +} + int read_peers(cls_method_context_t hctx, std::vector *peers) { std::string last_read = PEER_KEY_PREFIX; @@ -3249,7 +3265,8 @@ int image_status_remove(cls_method_context_t hctx, } int image_status_get(cls_method_context_t hctx, const string &global_image_id, - cls::rbd::MirrorImageStatus *status) { + const std::set &watchers, + cls::rbd::MirrorImageStatus *status) { bufferlist bl; int r = cls_cxx_map_get_val(hctx, status_global_key(global_image_id), &bl); @@ -3271,23 +3288,9 @@ int image_status_get(cls_method_context_t hctx, const string &global_image_id, return -EIO; } - obj_list_watch_response_t watchers; - r = cls_cxx_list_watchers(hctx, &watchers); - if (r < 0 && r != -ENOENT) { - CLS_ERR("error listing watchers: '%s'", cpp_strerror(r).c_str()); - return r; - } *status = static_cast(ondisk_status); - status->up = false; - for (auto &w : watchers.entries) { - if (w.name == ondisk_status.origin.name && - w.addr == ondisk_status.origin.addr) { - status->up = true; - break; - } - } - + status->up = (watchers.find(ondisk_status.origin) != watchers.end()); return 0; } @@ -3295,9 +3298,15 @@ int image_status_list(cls_method_context_t hctx, const std::string &start_after, uint64_t max_return, map *mirror_images, map *mirror_statuses) { + std::set watchers; + int r = list_watchers(hctx, &watchers); + if (r < 0) { + return r; + } + std::string last_read = image_key(start_after); int max_read = RBD_MAX_KEYS_READ; - int r = max_read; + r = max_read; while (r == max_read && mirror_images->size() < max_return) { std::map vals; @@ -3326,7 +3335,8 @@ int image_status_list(cls_method_context_t hctx, (*mirror_images)[image_id] = mirror_image; cls::rbd::MirrorImageStatus status; - int r1 = image_status_get(hctx, mirror_image.global_image_id, &status); + int r1 = image_status_get(hctx, mirror_image.global_image_id, watchers, + &status); if (r1 < 0) { continue; } @@ -3343,20 +3353,12 @@ int image_status_list(cls_method_context_t hctx, int image_status_get_summary(cls_method_context_t hctx, std::map *states) { - obj_list_watch_response_t watchers_; - int r = cls_cxx_list_watchers(hctx, &watchers_); + std::set watchers; + int r = list_watchers(hctx, &watchers); if (r < 0) { - if (r != -ENOENT) { - CLS_ERR("error listing watchers: '%s'", cpp_strerror(r).c_str()); - } return r; } - set watchers; - for (auto &w : watchers_.entries) { - watchers.insert(entity_inst_t(w.name, w.addr)); - } - states->clear(); string last_read = IMAGE_KEY_PREFIX; @@ -3389,7 +3391,7 @@ int image_status_get_summary(cls_method_context_t hctx, } cls::rbd::MirrorImageStatus status; - image_status_get(hctx, mirror_image.global_image_id, &status); + image_status_get(hctx, mirror_image.global_image_id, watchers, &status); cls::rbd::MirrorImageStatusState state = status.up ? status.state : cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN; @@ -3405,20 +3407,12 @@ int image_status_get_summary(cls_method_context_t hctx, } int image_status_remove_down(cls_method_context_t hctx) { - obj_list_watch_response_t watchers_; - int r = cls_cxx_list_watchers(hctx, &watchers_); + std::set watchers; + int r = list_watchers(hctx, &watchers); if (r < 0) { - if (r != -ENOENT) { - CLS_ERR("error listing watchers: '%s'", cpp_strerror(r).c_str()); - } return r; } - set watchers; - for (auto &w : watchers_.entries) { - watchers.insert(entity_inst_t(w.name, w.addr)); - } - string last_read = STATUS_GLOBAL_KEY_PREFIX; int max_read = RBD_MAX_KEYS_READ; r = max_read; @@ -4052,8 +4046,14 @@ int mirror_image_status_get(cls_method_context_t hctx, bufferlist *in, return -EINVAL; } + std::set watchers; + int r = mirror::list_watchers(hctx, &watchers); + if (r < 0) { + return r; + } + cls::rbd::MirrorImageStatus status; - int r = mirror::image_status_get(hctx, global_image_id, &status); + r = mirror::image_status_get(hctx, global_image_id, watchers, &status); if (r < 0) { return r; } -- 2.39.5