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 <ylifshit@ibm.com>
(cherry picked from commit
cf44913720c13bdf317ff44498543c06eabe7ec7)
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);
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;
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);