@@ -2697,6 +2697,7 @@ class RGWBucketInstanceMetadataHandler : public RGWMetadataHandler {
26972697 RGWSI_Zone* svc_zone{nullptr };
26982698 RGWSI_Bucket* svc_bucket{nullptr };
26992699 RGWSI_BucketIndex* svc_bi{nullptr };
2700+ RGWDataChangesLog *svc_datalog{nullptr };
27002701
27012702 int put_prepare (const DoutPrefixProvider* dpp, optional_yield y,
27022703 const std::string& entry, RGWBucketCompleteInfo& bci,
@@ -2711,9 +2712,10 @@ class RGWBucketInstanceMetadataHandler : public RGWMetadataHandler {
27112712 RGWBucketInstanceMetadataHandler (rgw::sal::Driver* driver,
27122713 RGWSI_Zone* svc_zone,
27132714 RGWSI_Bucket* svc_bucket,
2714- RGWSI_BucketIndex* svc_bi)
2715+ RGWSI_BucketIndex* svc_bi,
2716+ RGWDataChangesLog *svc_datalog)
27152717 : driver(driver), svc_zone(svc_zone),
2716- svc_bucket (svc_bucket), svc_bi(svc_bi) {}
2718+ svc_bucket (svc_bucket), svc_bi(svc_bi), svc_datalog(svc_datalog) {}
27172719
27182720 string get_type () override { return " bucket.instance" ; }
27192721
@@ -2874,6 +2876,25 @@ int RGWBucketInstanceMetadataHandler::put_prepare(
28742876 /* existing bucket, keep its placement */
28752877 bci.info .bucket .explicit_placement = old_bci->info .bucket .explicit_placement ;
28762878 bci.info .placement_rule = old_bci->info .placement_rule ;
2879+
2880+ // if the bucket is being deleted, create and store a special log type for
2881+ // bucket instance cleanup in multisite setup
2882+ const auto & log = bci.info .layout .logs .back ();
2883+ if (bci.info .bucket_deleted () && log.layout .type != rgw::BucketLogType::Deleted) {
2884+ const auto index_log = bci.info .layout .logs .back ();
2885+ const int shards_num = rgw::num_shards (index_log.layout .in_index );
2886+ bci.info .layout .logs .push_back ({log.gen +1 , {rgw::BucketLogType::Deleted}});
2887+ ldpp_dout (dpp, 10 ) << " store log layout type: " << bci.info .layout .logs .back ().layout .type << dendl;
2888+ for (int i = 0 ; i < shards_num; ++i) {
2889+ ldpp_dout (dpp, 10 ) << " adding to data_log shard_id: " << i << " of gen:" << index_log.gen << dendl;
2890+ int ret = svc_datalog->add_entry (dpp, bci.info , index_log, i, y);
2891+ if (ret < 0 ) {
2892+ ldpp_dout (dpp, 1 ) << " WARNING: failed writing data log for bucket="
2893+ << bci.info .bucket << " , shard_id=" << i << " of generation="
2894+ << index_log.gen << dendl;
2895+ } // datalog error is not fatal
2896+ }
2897+ }
28772898 }
28782899
28792900 // always keep bucket versioning enabled on archive zone
@@ -2884,7 +2905,7 @@ int RGWBucketInstanceMetadataHandler::put_prepare(
28842905 /* record the read version (if any), store the new version */
28852906 bci.info .objv_tracker .read_version = objv_tracker.read_version ;
28862907 bci.info .objv_tracker .write_version = objv_tracker.write_version ;
2887-
2908+
28882909 return 0 ;
28892910}
28902911
@@ -2963,10 +2984,8 @@ int RGWBucketInstanceMetadataHandler::remove(std::string& entry, RGWObjVersionTr
29632984 return ret;
29642985 }
29652986
2966- ret = svc_bucket->remove_bucket_instance_info (
2967- entry, bci.info , &bci.info .objv_tracker , y, dpp);
2968- if (ret < 0 )
2969- return ret;
2987+ // skip bucket instance removal. each zone will handle it independently during trimming
2988+
29702989 std::ignore = update_bucket_topic_mappings (dpp, &bci, /* current_bci=*/ nullptr ,
29712990 driver);
29722991 return 0 ;
@@ -3032,14 +3051,16 @@ RGWBucketCtl::RGWBucketCtl(RGWSI_Zone *zone_svc,
30323051 RGWSI_Bucket *bucket_svc,
30333052 RGWSI_Bucket_Sync *bucket_sync_svc,
30343053 RGWSI_BucketIndex *bi_svc,
3035- RGWSI_User* user_svc)
3054+ RGWSI_User* user_svc,
3055+ RGWDataChangesLog *datalog_svc)
30363056 : cct(zone_svc->ctx ())
30373057{
30383058 svc.zone = zone_svc;
30393059 svc.bucket = bucket_svc;
30403060 svc.bucket_sync = bucket_sync_svc;
30413061 svc.bi = bi_svc;
30423062 svc.user = user_svc;
3063+ svc.datalog_rados = datalog_svc;
30433064}
30443065
30453066void RGWBucketCtl::init (RGWUserCtl *user_ctl,
@@ -3528,11 +3549,13 @@ auto create_bucket_metadata_handler(librados::Rados& rados,
35283549auto create_bucket_instance_metadata_handler (rgw::sal::Driver* driver,
35293550 RGWSI_Zone* svc_zone,
35303551 RGWSI_Bucket* svc_bucket,
3531- RGWSI_BucketIndex* svc_bi)
3552+ RGWSI_BucketIndex* svc_bi,
3553+ RGWDataChangesLog *svc_datalog)
35323554 -> std::unique_ptr<RGWMetadataHandler>
35333555{
35343556 return std::make_unique<RGWBucketInstanceMetadataHandler>(driver, svc_zone,
3535- svc_bucket, svc_bi);
3557+ svc_bucket, svc_bi,
3558+ svc_datalog);
35363559}
35373560
35383561auto create_archive_bucket_metadata_handler (librados::Rados& rados,
@@ -3547,11 +3570,13 @@ auto create_archive_bucket_metadata_handler(librados::Rados& rados,
35473570auto create_archive_bucket_instance_metadata_handler (rgw::sal::Driver* driver,
35483571 RGWSI_Zone* svc_zone,
35493572 RGWSI_Bucket* svc_bucket,
3550- RGWSI_BucketIndex* svc_bi)
3573+ RGWSI_BucketIndex* svc_bi,
3574+ RGWDataChangesLog *svc_datalog)
35513575 -> std::unique_ptr<RGWMetadataHandler>
35523576{
35533577 return std::make_unique<RGWArchiveBucketInstanceMetadataHandler>(driver, svc_zone,
3554- svc_bucket, svc_bi);
3578+ svc_bucket, svc_bi,
3579+ svc_datalog);
35553580}
35563581
35573582void RGWBucketEntryPoint::generate_test_instances (list<RGWBucketEntryPoint*>& o)
0 commit comments