From 03dd56c3ad162a7160c5faaf4f6736344d3a50ba Mon Sep 17 00:00:00 2001 From: Shilpa Jagannath Date: Tue, 19 Mar 2024 10:59:35 -0400 Subject: [PATCH] rgw/multisite: allow modified object acls to be replicated Signed-off-by: Shilpa Jagannath (cherry picked from commit f5f6194c07b40c50913e956e06aaa3709d4d53aa) --- src/rgw/driver/rados/rgw_sal_rados.cc | 5 ++++- src/test/rgw/rgw_multi/tests.py | 31 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 2750209dcf5..6ffb9cc2108 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -1772,12 +1772,15 @@ int RadosObject::read_attrs(const DoutPrefixProvider* dpp, RGWRados::Object::Rea int RadosObject::set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) { Attrs empty; + // make a tiny adjustment to the existing mtime so that fetch_remote_obj() + // won't return ERR_NOT_MODIFIED when syncing the modified object + const auto mtime = state.mtime + std::chrono::nanoseconds(1); return store->getRados()->set_attrs(dpp, rados_ctx, bucket->get_info(), get_obj(), setattrs ? *setattrs : empty, delattrs ? delattrs : nullptr, - y); + y, mtime); } int RadosObject::get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) diff --git a/src/test/rgw/rgw_multi/tests.py b/src/test/rgw/rgw_multi/tests.py index bad27e2d8e2..fa2229a9f65 100644 --- a/src/test/rgw/rgw_multi/tests.py +++ b/src/test/rgw/rgw_multi/tests.py @@ -1770,6 +1770,37 @@ def test_role_delete_sync(): assert(not zone.has_role(role_name)) log.info(f'success, zone: {zone.name} does not have role: {role_name}') +def test_object_acl(): + zonegroup = realm.master_zonegroup() + zonegroup_conns = ZonegroupConns(zonegroup) + primary = zonegroup_conns.rw_zones[0] + secondary = zonegroup_conns.rw_zones[1] + + bucket = primary.create_bucket(gen_bucket_name()) + log.debug('created bucket=%s', bucket.name) + + # upload a dummy object and wait for sync. + k = new_key(primary, bucket, 'dummy') + k.set_contents_from_string('foo') + zonegroup_meta_checkpoint(zonegroup) + zonegroup_data_checkpoint(zonegroup_conns) + + #check object on secondary before setacl + bucket2 = get_bucket(secondary, bucket.name) + before_set_acl = bucket2.get_acl(k) + assert(len(before_set_acl.acl.grants) == 1) + + #set object acl on primary and wait for sync. + bucket.set_canned_acl('public-read', key_name=k) + log.debug('set acl=%s', bucket.name) + zonegroup_data_checkpoint(zonegroup_conns) + zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name) + + #check object secondary after setacl + bucket2 = get_bucket(secondary, bucket.name) + after_set_acl = bucket2.get_acl(k) + assert(len(after_set_acl.acl.grants) == 2) # read grant added on AllUsers + @attr('fails_with_rgw') @attr('data_sync_init') def test_bucket_full_sync_after_data_sync_init(): -- 2.47.3