From cf44913720c13bdf317ff44498543c06eabe7ec7 Mon Sep 17 00:00:00 2001 From: Yuval Lifshitz Date: Thu, 30 Oct 2025 09:45:48 +0000 Subject: [PATCH] rgw/logging: make sure source bucket is in the target's list if a target log bucket is deleted, and then recreated with the same name, the attribute holding the sources will not exist. this is fixing it, but updating the list anytime we try to flush or add a record. if the source is already in the list, there will be no update to the attribute. Fixes: https://tracker.ceph.com/issues/73675 Signed-off-by: Yuval Lifshitz --- src/rgw/radosgw-admin/radosgw-admin.cc | 6 ++++++ src/rgw/rgw_bucket_logging.cc | 6 ++++++ src/rgw/rgw_rest_bucket_logging.cc | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/src/rgw/radosgw-admin/radosgw-admin.cc b/src/rgw/radosgw-admin/radosgw-admin.cc index a48adb01124..26495d22f5b 100644 --- a/src/rgw/radosgw-admin/radosgw-admin.cc +++ b/src/rgw/radosgw-admin/radosgw-admin.cc @@ -7867,6 +7867,12 @@ int main(int argc, const char **argv) return 0; } + // make sure that the logging source attribute is up-to-date + if (ret = rgw::bucketlogging::update_bucket_logging_sources(dpp(), target_bucket, bucket->get_key(), true, null_yield); ret < 0) { + cerr << "WARNING: failed to update logging sources attribute '" << RGW_ATTR_BUCKET_LOGGING_SOURCES + << "' in logging target '" << target_bucket->get_key() << "'. error: " << cpp_strerror(ret) << std::endl; + } + std::string obj_name; RGWObjVersionTracker objv_tracker; ret = target_bucket->get_logging_object_name(obj_name, configuration.target_prefix, null_yield, dpp(), &objv_tracker); diff --git a/src/rgw/rgw_bucket_logging.cc b/src/rgw/rgw_bucket_logging.cc index 39bb78b498c..79ef96968e3 100644 --- a/src/rgw/rgw_bucket_logging.cc +++ b/src/rgw/rgw_bucket_logging.cc @@ -501,6 +501,12 @@ int log_record(rgw::sal::Driver* driver, return ret; } + // make sure that the logging source attribute is up-to-date + if (ret = update_bucket_logging_sources(dpp, target_bucket, s->bucket->get_key(), true, y); ret < 0) { + ldpp_dout(dpp, 5) << "WARNING: failed to update logging sources attribute '" << RGW_ATTR_BUCKET_LOGGING_SOURCES + << "' in logging bucket '" << target_bucket_id << "'. error: " << ret << dendl; + } + const auto region = driver->get_zone()->get_zonegroup().get_api_name(); std::string obj_name; RGWObjVersionTracker objv_tracker; diff --git a/src/rgw/rgw_rest_bucket_logging.cc b/src/rgw/rgw_rest_bucket_logging.cc index 6f8f4b73b92..ba0374a94fe 100644 --- a/src/rgw/rgw_rest_bucket_logging.cc +++ b/src/rgw/rgw_rest_bucket_logging.cc @@ -417,6 +417,11 @@ class RGWPostBucketLoggingOp : public RGWDefaultResponseOp { void execute(optional_yield y) override { const auto& target_bucket_id = target_bucket->get_key(); + // make sure that the logging source attribute is up-to-date + if (const auto ret = rgw::bucketlogging::update_bucket_logging_sources(this, target_bucket, source_bucket->get_key(), true, y); ret < 0) { + ldpp_dout(this, 5) << "WARNING: failed to update logging sources attribute '" << RGW_ATTR_BUCKET_LOGGING_SOURCES + << "' in logging target '" << target_bucket_id << "'. error: " << ret << dendl; + } std::string obj_name; RGWObjVersionTracker objv_tracker; op_ret = target_bucket->get_logging_object_name(obj_name, configuration.target_prefix, y, this, &objv_tracker); -- 2.47.3