From bdcaf1546f037a2a2622978dcee6454e1e07b050 Mon Sep 17 00:00:00 2001 From: Jane Zhu Date: Mon, 1 May 2023 19:09:18 -0400 Subject: [PATCH] rgw/notification: remove non x-amz-meta-* attributes from the metadata section of the regular notifications Signed-off-by: Juan Zhu (cherry picked from commit 4ca7643bf623b4dd18e112956af36fcb0c86d30a) --- src/rgw/driver/rados/rgw_notify.cc | 16 +++++++++++++--- src/test/rgw/bucket_notification/test_bn.py | 12 +++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/rgw/driver/rados/rgw_notify.cc b/src/rgw/driver/rados/rgw_notify.cc index 0821e69a939..799fdc129d6 100644 --- a/src/rgw/driver/rados/rgw_notify.cc +++ b/src/rgw/driver/rados/rgw_notify.cc @@ -634,6 +634,15 @@ rgw::sal::Object* get_object_with_atttributes( return src_obj; } +static inline void filter_amz_meta(meta_map_t& dest, const meta_map_t& src) { + std::copy_if(src.cbegin(), src.cend(), + std::inserter(dest, dest.end()), + [](const auto& m) { + return (boost::algorithm::starts_with(m.first, RGW_AMZ_META_PREFIX)); + }); +} + + static inline void metadata_from_attributes( reservation_t& res, rgw::sal::Object* obj) { auto& metadata = res.x_meta_map; @@ -739,7 +748,7 @@ static inline bool notification_match(reservation_t& res, if (!filter.s3_filter.metadata_filter.kv.empty()) { // metadata filter exists if (res.s) { - res.x_meta_map = res.s->info.x_meta_map; + filter_amz_meta(res.x_meta_map, res.s->info.x_meta_map); } metadata_from_attributes(res, obj); if (!match(filter.s3_filter.metadata_filter, res.x_meta_map)) { @@ -976,13 +985,14 @@ reservation_t::reservation_t(const DoutPrefixProvider* _dpp, object(_object), src_object(_src_object), bucket(_s->bucket.get()), object_name(_object_name), tagset(_s->tagset), - x_meta_map(_s->info.x_meta_map), metadata_fetched_from_attributes(false), user_id(_s->user->get_id().id), user_tenant(_s->user->get_id().tenant), req_id(_s->req_id), yield(y) -{} +{ + filter_amz_meta(x_meta_map, _s->info.x_meta_map); +} reservation_t::reservation_t(const DoutPrefixProvider* _dpp, rgw::sal::RadosStore* _store, diff --git a/src/test/rgw/bucket_notification/test_bn.py b/src/test/rgw/bucket_notification/test_bn.py index ae253107cb0..6286d6d6c6e 100644 --- a/src/test/rgw/bucket_notification/test_bn.py +++ b/src/test/rgw/bucket_notification/test_bn.py @@ -345,6 +345,8 @@ def verify_events_by_elements(events, keys, exact_match=False, deletions=False): log.error(events) assert False, err +META_PREFIX = 'x-amz-meta-' + def verify_s3_records_by_elements(records, keys, exact_match=False, deletions=False, expected_sizes={}, etags=[]): """ verify there is at least one record per element """ err = '' @@ -363,6 +365,9 @@ def verify_s3_records_by_elements(records, keys, exact_match=False, deletions=Fa #assert_equal(key.etag[1:-1], record['s3']['object']['eTag']) if etags: assert_in(key.etag[1:-1], etags) + if len(record['s3']['object']['metadata']) > 0: + for meta in record['s3']['object']['metadata']: + assert(meta['key'].startswith(META_PREFIX)) if deletions and record['eventName'].startswith('ObjectRemoved'): key_found = True object_size = record['s3']['object']['size'] @@ -379,6 +384,9 @@ def verify_s3_records_by_elements(records, keys, exact_match=False, deletions=Fa assert_equal(key.etag, record['s3']['object']['eTag']) if etags: assert_in(key.etag[1:-1], etags) + if len(record['s3']['object']['metadata']) > 0: + for meta in record['s3']['object']['metadata']: + assert(meta['key'].startswith(META_PREFIX)) if deletions and record['eventName'].startswith('ObjectRemoved'): key_found = True object_size = record['s3']['object']['size'] @@ -2349,8 +2357,6 @@ def test_ps_s3_multipart_on_master(): # delete the bucket conn.delete_bucket(bucket_name) -META_PREFIX = 'x-amz-meta-' - @attr('amqp_test') def test_ps_s3_metadata_filter_on_master(): """ test s3 notification of metadata on master """ @@ -2482,7 +2488,7 @@ def test_ps_s3_metadata_on_master(): notification_name = bucket_name + NOTIFICATION_SUFFIX meta_key = 'meta1' meta_value = 'This is my metadata value' - meta_prefix = 'x-amz-meta-' + meta_prefix = META_PREFIX topic_conf_list = [{'Id': notification_name, 'TopicArn': topic_arn, 'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*'], }] -- 2.39.5