From 2b4a3bb3691a6656fb77a3a2d37328799abd62cb Mon Sep 17 00:00:00 2001 From: sajibreadd Date: Mon, 17 Jun 2024 13:43:09 +0600 Subject: [PATCH] Remove sequence for topic removal reordered. As a part of sequence persisten queue is remove first and then topic. If queue deletion fails it will return with an error and will not delete the topic. Fixes: https://tracker.ceph.com/issues/65861 Signed-off-by: Md Mahamudur Rahaman Sajib --- src/rgw/rgw_pubsub.cc | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/rgw/rgw_pubsub.cc b/src/rgw/rgw_pubsub.cc index 37538aa7a9b..120f21062b4 100644 --- a/src/rgw/rgw_pubsub.cc +++ b/src/rgw/rgw_pubsub.cc @@ -1098,21 +1098,23 @@ int RGWPubSub::remove_topic_v2(const DoutPrefixProvider* dpp, << dendl; return 0; } - ret = driver->remove_topic_v2(name, tenant, objv_tracker, y, dpp); - if (ret < 0) { - ldpp_dout(dpp, 1) << "ERROR: failed to remove topic info: ret=" << ret - << dendl; - return ret; - } const rgw_pubsub_dest& dest = topic.dest; if (!dest.push_endpoint.empty() && dest.persistent && !dest.persistent_queue.empty()) { ret = driver->remove_persistent_topic(dpp, y, dest.persistent_queue); if (ret < 0 && ret != -ENOENT) { - ldpp_dout(dpp, 1) << "WARNING: failed to remove queue for " + ldpp_dout(dpp, 1) << "ERROR: failed to remove queue for " "persistent topic: " << cpp_strerror(ret) << dendl; - } // not fatal + return ret; + } + } + + ret = driver->remove_topic_v2(name, tenant, objv_tracker, y, dpp); + if (ret < 0) { + ldpp_dout(dpp, 1) << "ERROR: failed to remove topic info: ret=" << ret + << dendl; + return ret; } return 0; } @@ -1144,7 +1146,15 @@ int RGWPubSub::remove_topic(const DoutPrefixProvider *dpp, const std::string& na if (t == topics.topics.end()) { return -ENOENT; } - const rgw_pubsub_dest dest = std::move(t->second.dest); + if (!t->second.dest.push_endpoint.empty() && t->second.dest.persistent && + !t->second.dest.persistent_queue.empty()) { + ret = driver->remove_persistent_topic(dpp, y, t->second.dest.persistent_queue); + if (ret < 0 && ret != -ENOENT) { + ldpp_dout(dpp, 1) << "ERROR: failed to remove queue for " + "persistent topic: " << cpp_strerror(ret) << dendl; + return ret; + } + } topics.topics.erase(t); ret = write_topics_v1(dpp, topics, &objv_tracker, y); @@ -1152,14 +1162,5 @@ int RGWPubSub::remove_topic(const DoutPrefixProvider *dpp, const std::string& na ldpp_dout(dpp, 1) << "ERROR: failed to remove topics info: ret=" << ret << dendl; return ret; } - - if (!dest.push_endpoint.empty() && dest.persistent && - !dest.persistent_queue.empty()) { - ret = driver->remove_persistent_topic(dpp, y, dest.persistent_queue); - if (ret < 0 && ret != -ENOENT) { - ldpp_dout(dpp, 1) << "WARNING: failed to remove queue for " - "persistent topic: " << cpp_strerror(ret) << dendl; - } // not fatal - } return 0; } -- 2.39.5