Skip to content

Commit e13a23c

Browse files
authored
Merge pull request ceph#64376 from smanjara/wip-fix-full-sync-urlencoding
rgw/multisite: url-encode list_bucket query param 'key-marker'
2 parents 31cda92 + 0708a89 commit e13a23c

File tree

2 files changed

+41
-114
lines changed

2 files changed

+41
-114
lines changed

src/rgw/rgw_rest_client.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,9 @@ void RGWRESTGenerateHTTPHeaders::init(const string& _method, const string& host,
587587

588588
/* merge params with extra args so that we can sign correctly */
589589
for (auto iter = params.begin(); iter != params.end(); ++iter) {
590-
new_info->args.append(iter->first, iter->second);
590+
constexpr bool encode_slash = false; // not for query params
591+
new_info->args.append(url_encode(iter->first, encode_slash),
592+
url_encode(iter->second, encode_slash));
591593
}
592594

593595
url = _url + resource + params_str;

src/test/rgw/rgw_multi/tests.py

Lines changed: 38 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,6 +2161,43 @@ def test_zap_init_bucket_sync_run():
21612161
secondary.zone.start()
21622162

21632163
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
2164+
2165+
def test_list_bucket_key_marker_encoding():
2166+
zonegroup = realm.master_zonegroup()
2167+
zonegroup_conns = ZonegroupConns(zonegroup)
2168+
primary = zonegroup_conns.rw_zones[0]
2169+
secondary = zonegroup_conns.rw_zones[1]
2170+
2171+
bucket = primary.create_bucket(gen_bucket_name())
2172+
log.debug('created bucket=%s', bucket.name)
2173+
zonegroup_meta_checkpoint(zonegroup)
2174+
2175+
# test for object names with '%' character.
2176+
for obj in range(1, 1100):
2177+
k = new_key(primary, bucket.name, f'obj%{obj * 11}')
2178+
k.set_contents_from_string('foo')
2179+
2180+
# wait for the secondary to catch up
2181+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
2182+
2183+
cmd = ['bucket', 'sync', 'init'] + secondary.zone.zone_args()
2184+
cmd += ['--bucket', bucket.name]
2185+
cmd += ['--source-zone', primary.name]
2186+
secondary.zone.cluster.admin(cmd)
2187+
2188+
cmd = ['bucket', 'sync', 'run'] + secondary.zone.zone_args()
2189+
cmd += ['--bucket', bucket.name, '--source-zone', primary.name]
2190+
secondary.zone.cluster.admin(cmd)
2191+
2192+
# write an object during incremental sync.
2193+
objname = 'test_incremental'
2194+
k = new_key(primary, bucket, objname)
2195+
k.set_contents_from_string('foo')
2196+
zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
2197+
2198+
# the object uploaded after bucket sync init should be replicated
2199+
check_object_exists(bucket, objname)
2200+
21642201

21652202
def test_role_sync():
21662203
zonegroup = realm.master_zonegroup()
@@ -5897,116 +5934,4 @@ def test_copy_obj_perm_check_between_zonegroups(zonegroup):
58975934
Bucket=dest_bucket.name,
58985935
CopySource={'Bucket': source_bucket.name, 'Key': objname},
58995936
Key=objname)
5900-
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'] == [])
5937+
assert e.response['Error']['Code'] == 'AccessDenied'

0 commit comments

Comments
 (0)