Skip to content

Commit e975658

Browse files
committed
rgw: skip empty check on non-owned buckets by zonegroup
Compare RGW's zonegroup with bucket's zonegroup and only do the empty check when the bucket is owned by the RGW running the delete. Fixes: https://tracker.ceph.com/issues/68190 Signed-off-by: Seena Fallah <[email protected]>
1 parent 093e0de commit e975658

File tree

5 files changed

+64
-37
lines changed

5 files changed

+64
-37
lines changed

src/rgw/driver/motr/rgw_sal_motr.cc

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -557,12 +557,15 @@ int MotrBucket::remove(const DoutPrefixProvider *dpp, bool delete_children, opti
557557
params.list_versions = true;
558558
params.allow_unordered = true;
559559

560+
const bool own_bucket = store->get_zone()->get_zonegroup().get_id() == info.zonegroup;
561+
560562
ListResults results;
563+
results.is_truncated = own_bucket; // if we don't have the index, we're done
561564

562565
// 1. Check if Bucket has objects.
563566
// If bucket contains objects and delete_children is true, delete all objects.
564567
// Else throw error that bucket is not empty.
565-
do {
568+
while (results.is_truncated) {
566569
results.objs.clear();
567570

568571
// Check if bucket has objects.
@@ -591,12 +594,14 @@ int MotrBucket::remove(const DoutPrefixProvider *dpp, bool delete_children, opti
591594
return ret;
592595
}
593596
}
594-
} while(results.is_truncated);
597+
}
595598

596599
// 2. Abort Mp uploads on the bucket.
597-
ret = abort_multiparts(dpp, store->ctx());
598-
if (ret < 0) {
599-
return ret;
600+
if (own_bucket) {
601+
ret = abort_multiparts(dpp, store->ctx());
602+
if (ret < 0) {
603+
return ret;
604+
}
600605
}
601606

602607
// 3. Remove mp index??
@@ -608,9 +613,11 @@ int MotrBucket::remove(const DoutPrefixProvider *dpp, bool delete_children, opti
608613
}
609614

610615
// 4. Sync user stats.
611-
ret = this->sync_owner_stats(dpp, y);
612-
if (ret < 0) {
613-
ldout(store->ctx(), 1) << "WARNING: failed sync user stats before bucket delete. ret=" << ret << dendl;
616+
if (own_bucket) {
617+
ret = this->sync_owner_stats(dpp, y);
618+
if (ret < 0) {
619+
ldout(store->ctx(), 1) << "WARNING: failed sync user stats before bucket delete. ret=" << ret << dendl;
620+
}
614621
}
615622

616623
// 5. Remove the bucket from user info index. (unlink user)

src/rgw/driver/rados/rgw_rados.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5391,6 +5391,12 @@ int RGWRados::restore_obj_from_cloud(RGWLCCloudTierCtx& tier_ctx,
53915391

53925392
int RGWRados::check_bucket_empty(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, optional_yield y)
53935393
{
5394+
const auto& zonegroup = svc.site->get_zonegroup();
5395+
if (bucket_info.zonegroup != zonegroup.id) {
5396+
// don't check on this zone, the bucket's data belongs to another zonegroup
5397+
return 0;
5398+
}
5399+
53945400
constexpr uint NUM_ENTRIES = 1000u;
53955401

53965402
rgw_obj_index_key marker;

src/rgw/driver/rados/rgw_sal_rados.cc

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,12 @@ int RadosBucket::remove(const DoutPrefixProvider* dpp,
341341
params.list_versions = true;
342342
params.allow_unordered = true;
343343

344+
const bool own_bucket = store->get_zone()->get_zonegroup().get_id() == info.zonegroup;
345+
344346
ListResults results;
347+
results.is_truncated = own_bucket; // if we don't have the index, we're done
345348

346-
do {
349+
while (results.is_truncated) {
347350
results.objs.clear();
348351

349352
ret = list(dpp, params, 1000, results, y);
@@ -365,11 +368,13 @@ int RadosBucket::remove(const DoutPrefixProvider* dpp,
365368
return ret;
366369
}
367370
}
368-
} while(results.is_truncated);
371+
}
369372

370-
ret = abort_multiparts(dpp, store->ctx(), y);
371-
if (ret < 0) {
372-
return ret;
373+
if (own_bucket) {
374+
ret = abort_multiparts(dpp, store->ctx(), y);
375+
if (ret < 0) {
376+
return ret;
377+
}
373378
}
374379

375380
// remove lifecycle config, if any (XXX note could be made generic)
@@ -404,9 +409,11 @@ int RadosBucket::remove(const DoutPrefixProvider* dpp,
404409
}
405410

406411
librados::Rados& rados = *store->getRados()->get_rados_handle();
407-
ret = store->ctl()->bucket->sync_owner_stats(dpp, rados, info.owner, info, y, nullptr);
408-
if (ret < 0) {
409-
ldout(store->ctx(), 1) << "WARNING: failed sync user stats before bucket delete. ret=" << ret << dendl;
412+
if (own_bucket) {
413+
ret = store->ctl()->bucket->sync_owner_stats(dpp, rados, info.owner, info, y, nullptr);
414+
if (ret < 0) {
415+
ldout(store->ctx(), 1) << "WARNING: failed sync user stats before bucket delete. ret=" << ret << dendl;
416+
}
410417
}
411418

412419
RGWObjVersionTracker ot;

src/rgw/rgw_op.cc

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3843,14 +3843,19 @@ void RGWDeleteBucket::execute(optional_yield y)
38433843
}
38443844
}
38453845

3846-
op_ret = s->bucket->sync_owner_stats(this, y, nullptr);
3847-
if ( op_ret < 0) {
3848-
ldpp_dout(this, 1) << "WARNING: failed to sync user stats before bucket delete: op_ret= " << op_ret << dendl;
3849-
}
3846+
const bool own_bucket = s->penv.site->get_zonegroup().get_id() == s->bucket->get_info().zonegroup;
38503847

3851-
op_ret = s->bucket->check_empty(this, y);
3852-
if (op_ret < 0) {
3853-
return;
3848+
if (own_bucket) {
3849+
// only if we own the bucket
3850+
op_ret = s->bucket->sync_owner_stats(this, y, nullptr);
3851+
if (op_ret < 0) {
3852+
ldpp_dout(this, 1) << "WARNING: failed to sync user stats before bucket delete: op_ret= " << op_ret << dendl;
3853+
}
3854+
3855+
op_ret = s->bucket->check_empty(this, y);
3856+
if (op_ret < 0) {
3857+
return;
3858+
}
38543859
}
38553860

38563861
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
@@ -3864,9 +3869,11 @@ void RGWDeleteBucket::execute(optional_yield y)
38643869
return;
38653870
}
38663871

3867-
op_ret = rgw_remove_sse_s3_bucket_key(s, y);
3868-
if (op_ret != 0) {
3869-
// do nothing; it will already have been logged
3872+
if (own_bucket) {
3873+
op_ret = rgw_remove_sse_s3_bucket_key(s, y);
3874+
if (op_ret != 0) {
3875+
// do nothing; it will already have been logged
3876+
}
38703877
}
38713878

38723879
op_ret = s->bucket->remove(this, false, y);

src/test/rgw/rgw_multi/tests.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -609,21 +609,21 @@ def test_bucket_recreate():
609609
assert check_all_buckets_exist(zone, buckets)
610610

611611
def test_bucket_remove():
612-
zonegroup = realm.master_zonegroup()
613-
zonegroup_conns = ZonegroupConns(zonegroup)
614-
buckets, zone_bucket = create_bucket_per_zone(zonegroup_conns)
615-
zonegroup_meta_checkpoint(zonegroup)
612+
for zonegroup in realm.current_period.zonegroups:
613+
zonegroup_conns = ZonegroupConns(zonegroup)
614+
buckets, zone_buckets = create_bucket_per_zone(zonegroup_conns)
615+
zonegroup_meta_checkpoint(zonegroup)
616616

617-
for zone in zonegroup_conns.zones:
618-
assert check_all_buckets_exist(zone, buckets)
617+
for zone in zonegroup_conns.zones:
618+
assert check_all_buckets_exist(zone, buckets)
619619

620-
for zone, bucket_name in zone_bucket:
621-
zone.conn.delete_bucket(bucket_name)
620+
for zone, bucket_name in zone_buckets:
621+
zone.conn.delete_bucket(bucket_name)
622622

623-
zonegroup_meta_checkpoint(zonegroup)
623+
zonegroup_meta_checkpoint(zonegroup)
624624

625-
for zone in zonegroup_conns.zones:
626-
assert check_all_buckets_dont_exist(zone, buckets)
625+
for zone in zonegroup_conns.zones:
626+
assert check_all_buckets_dont_exist(zone, buckets)
627627

628628
def get_bucket(zone, bucket_name):
629629
return zone.conn.get_bucket(bucket_name)

0 commit comments

Comments
 (0)