Skip to content

Commit 6130d05

Browse files
authored
Merge pull request ceph#62813 from smanjara/wip-fix-delete-object-tagging
rgw/multisite: sync object tagging deletion
2 parents a05c9d7 + 8f2dd0d commit 6130d05

File tree

3 files changed

+123
-0
lines changed

3 files changed

+123
-0
lines changed

src/rgw/driver/rados/rgw_sal_rados.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3519,6 +3519,11 @@ RadosObject::RadosReadOp::RadosReadOp(RadosObject *_source, RGWObjectCtx *_octx)
35193519
int RadosObject::RadosReadOp::prepare(optional_yield y, const DoutPrefixProvider* dpp)
35203520
{
35213521
uint64_t obj_size;
3522+
ceph::real_time mtime;
3523+
3524+
if (!params.lastmod) {
3525+
params.lastmod = &mtime;
3526+
}
35223527

35233528
parent_op.conds.mod_ptr = params.mod_ptr;
35243529
parent_op.conds.unmod_ptr = params.unmod_ptr;
@@ -3539,6 +3544,7 @@ int RadosObject::RadosReadOp::prepare(optional_yield y, const DoutPrefixProvider
35393544

35403545
source->set_instance(parent_op.state.obj.key.instance);
35413546
source->set_obj_size(obj_size);
3547+
source->set_mtime(*params.lastmod);
35423548
params.parts_count = parent_op.params.parts_count;
35433549

35443550
return ret;

src/rgw/rgw_op.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,11 @@ static int get_obj_policy_from_attr(const DoutPrefixProvider *dpp,
342342

343343
std::unique_ptr<rgw::sal::Object::ReadOp> rop = obj->get_read_op();
344344

345+
ret = rop->prepare(y, dpp);
346+
if (ret < 0) {
347+
return ret;
348+
}
349+
345350
ret = rop->get_attr(dpp, RGW_ATTR_ACL, bl, y);
346351
if (ret >= 0) {
347352
ret = decode_policy(dpp, cct, bl, policy);

src/test/rgw/rgw_multi/tests.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5898,3 +5898,115 @@ def test_copy_obj_perm_check_between_zonegroups(zonegroup):
58985898
CopySource={'Bucket': source_bucket.name, 'Key': objname},
58995899
Key=objname)
59005900
assert e.response['Error']['Code'] == 'AccessDenied'
5901+
5902+
5903+
@attr('object_tagging')
5904+
def test_create_delete_obj_tagging():
5905+
zonegroup = realm.master_zonegroup()
5906+
zonegroup_conns = ZonegroupConns(zonegroup)
5907+
primary = zonegroup_conns.rw_zones[0]
5908+
secondary = zonegroup_conns.rw_zones[1]
5909+
5910+
bucket = primary.create_bucket(gen_bucket_name())
5911+
log.debug('created bucket=%s', bucket.name)
5912+
5913+
objname = 'dummy'
5914+
5915+
# upload a dummy object and wait for sync.
5916+
k = new_key(primary, bucket, objname)
5917+
k.set_contents_from_string('foo')
5918+
zonegroup_meta_checkpoint(zonegroup)
5919+
5920+
zonegroup_data_checkpoint(zonegroup_conns)
5921+
log.debug('created object=%s', objname)
5922+
5923+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5924+
5925+
# put object tagging on primary zone
5926+
primary.s3_client.put_object_tagging(Bucket=bucket.name,
5927+
Key= objname,
5928+
Tagging={
5929+
'TagSet': [
5930+
{
5931+
'Key': 'key1',
5932+
'Value': 'value1'
5933+
},
5934+
]})
5935+
5936+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5937+
5938+
response = secondary.s3_client.get_object_tagging(Bucket=bucket.name,
5939+
Key = objname)
5940+
assert(response['TagSet'][0]['Key'] == 'key1')
5941+
assert(response['TagSet'][0]['Value'] == 'value1')
5942+
5943+
primary.s3_client.delete_object_tagging(Bucket=bucket.name,
5944+
Key= objname)
5945+
5946+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5947+
5948+
response = secondary.s3_client.get_object_tagging(Bucket=bucket.name,
5949+
Key = objname)
5950+
5951+
assert(response['TagSet'] == [])
5952+
5953+
@attr('object_tagging')
5954+
def test_create_delete_versioned_obj_tagging():
5955+
5956+
zonegroup = realm.master_zonegroup()
5957+
zonegroup_conns = ZonegroupConns(zonegroup)
5958+
5959+
primary = zonegroup_conns.rw_zones[0]
5960+
secondary = zonegroup_conns.rw_zones[1]
5961+
5962+
bucket = primary.create_bucket(gen_bucket_name())
5963+
log.debug('created bucket=%s', bucket.name)
5964+
zonegroup_meta_checkpoint(zonegroup)
5965+
5966+
# upload an initial object
5967+
objname = 'dummy'
5968+
key = new_key(primary, bucket, objname)
5969+
key.set_contents_from_string('bar')
5970+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5971+
5972+
# enable versioning
5973+
bucket.configure_versioning(True)
5974+
zonegroup_meta_checkpoint(zonegroup)
5975+
5976+
# upload object
5977+
k = new_key(primary, bucket, objname)
5978+
k.set_contents_from_string('foo')
5979+
log.debug('created new version id=%s', k.version_id)
5980+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5981+
5982+
# put object tagging on primary zone
5983+
primary.s3_client.put_object_tagging(Bucket=bucket.name,
5984+
Key= objname,
5985+
VersionId = k.version_id,
5986+
Tagging={
5987+
'TagSet': [
5988+
{
5989+
'Key': 'key1',
5990+
'Value': 'value1'
5991+
},
5992+
]})
5993+
5994+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
5995+
5996+
response = secondary.s3_client.get_object_tagging(Bucket=bucket.name,
5997+
Key = objname,
5998+
VersionId = k.version_id)
5999+
assert(response['TagSet'][0]['Key'] == 'key1')
6000+
assert(response['TagSet'][0]['Value'] == 'value1')
6001+
6002+
primary.s3_client.delete_object_tagging(Bucket=bucket.name,
6003+
Key= objname,
6004+
VersionId = k.version_id)
6005+
6006+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
6007+
6008+
response = secondary.s3_client.get_object_tagging(Bucket=bucket.name,
6009+
Key = objname,
6010+
VersionId = k.version_id)
6011+
6012+
assert(response['TagSet'] == [])

0 commit comments

Comments
 (0)