From 9a7a9895b47820280892d491ff425178eaf4b4f4 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 26 Nov 2019 13:01:32 -0800 Subject: [PATCH] rgw: sync: only update data log if bucket exports data Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_bucket.cc | 31 +++++++++++++++++++++++-------- src/rgw/rgw_bucket.h | 30 +++++++++++++++++++++++++++++- src/rgw/rgw_bucket_sync.h | 2 +- src/rgw/rgw_service.cc | 3 ++- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index ac7aa7cf46c..5f376243333 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -2182,16 +2182,22 @@ int RGWDataChangesLog::get_log_shard_id(rgw_bucket& bucket, int shard_id) { return choose_oid(bs); } -int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id) { -#warning FIXME -#if 0 - if (!ctl.bucket->bucket_exports_data(bucket_info.bucket, null_yield)) { - return 0; +bool RGWDataChangesLog::filter_bucket(const rgw_bucket& bucket, optional_yield y) const +{ + if (!bucket_filter) { + return true; } -#endif + return bucket_filter->filter(bucket, y); +} + +int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id) { auto& bucket = bucket_info.bucket; + if (!filter_bucket(bucket, null_yield)) { + return 0; + } + if (observer) { observer->on_bucket_changed(bucket.get_key()); } @@ -3073,10 +3079,16 @@ public: } }; +bool RGWBucketCtl::DataLogFilter::filter(const rgw_bucket& bucket, optional_yield y) const +{ + return bucket_ctl->bucket_exports_data(bucket, null_yield); +} + RGWBucketCtl::RGWBucketCtl(RGWSI_Zone *zone_svc, RGWSI_Bucket *bucket_svc, RGWSI_Bucket_Sync *bucket_sync_svc, - RGWSI_BucketIndex *bi_svc) : cct(zone_svc->ctx()) + RGWSI_BucketIndex *bi_svc) : cct(zone_svc->ctx()), + datalog_filter(this) { svc.zone = zone_svc; svc.bucket = bucket_svc; @@ -3086,7 +3098,8 @@ RGWBucketCtl::RGWBucketCtl(RGWSI_Zone *zone_svc, void RGWBucketCtl::init(RGWUserCtl *user_ctl, RGWBucketMetadataHandler *_bm_handler, - RGWBucketInstanceMetadataHandler *_bmi_handler) + RGWBucketInstanceMetadataHandler *_bmi_handler, + RGWDataChangesLog *datalog) { ctl.user = user_ctl; @@ -3095,6 +3108,8 @@ void RGWBucketCtl::init(RGWUserCtl *user_ctl, bucket_be_handler = bm_handler->get_be_handler(); bi_be_handler = bmi_handler->get_be_handler(); + + datalog->set_bucket_filter(&datalog_filter); } int RGWBucketCtl::call(std::function f) { diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 3190a56c482..d0f38869c54 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -34,6 +34,8 @@ class RGWSI_Meta; class RGWBucketMetadataHandler; class RGWBucketInstanceMetadataHandler; class RGWUserCtl; +class RGWBucketCtl; + namespace rgw { namespace sal { class RGWRadosStore; class RGWBucketList; @@ -492,6 +494,15 @@ struct RGWDataChangesLogMarker { }; class RGWDataChangesLog { +public: + class BucketFilter { + public: + virtual ~BucketFilter() {} + + virtual bool filter(const rgw_bucket& bucket, optional_yield y) const = 0; + }; +private: + CephContext *cct; rgw::BucketChangeObserver *observer = nullptr; @@ -544,6 +555,8 @@ class RGWDataChangesLog { ChangesRenewThread *renew_thread; + BucketFilter *bucket_filter{nullptr}; + public: RGWDataChangesLog(RGWSI_Zone *zone_svc, RGWSI_Cls *cls_svc); @@ -576,6 +589,12 @@ public: } bool going_down(); + + void set_bucket_filter(BucketFilter *f) { + bucket_filter = f; + } + + bool filter_bucket(const rgw_bucket& bucket, optional_yield y) const; }; struct rgw_ep_info { @@ -608,6 +627,14 @@ class RGWBucketCtl RGWSI_BucketInstance_BE_Handler bi_be_handler; /* bucket instance backend handler */ int call(std::function f); + + class DataLogFilter : public RGWDataChangesLog::BucketFilter { + RGWBucketCtl *bucket_ctl; + public: + DataLogFilter(RGWBucketCtl *_bucket_ctl) : bucket_ctl(_bucket_ctl) {} + + bool filter(const rgw_bucket& bucket, optional_yield y) const override; + } datalog_filter; public: RGWBucketCtl(RGWSI_Zone *zone_svc, @@ -617,7 +644,8 @@ public: void init(RGWUserCtl *user_ctl, RGWBucketMetadataHandler *_bm_handler, - RGWBucketInstanceMetadataHandler *_bmi_handler); + RGWBucketInstanceMetadataHandler *_bmi_handler, + RGWDataChangesLog *datalog); struct Bucket { struct GetParams { diff --git a/src/rgw/rgw_bucket_sync.h b/src/rgw/rgw_bucket_sync.h index 8545d4986d5..27d5f8bb1bc 100644 --- a/src/rgw/rgw_bucket_sync.h +++ b/src/rgw/rgw_bucket_sync.h @@ -301,7 +301,7 @@ class RGWBucketSyncPolicyHandler { bool bucket_is_sync_source() const { - return !targets.empty(); + return !targets.empty() || !resolved_dests.empty(); } bool bucket_is_sync_target() const { diff --git a/src/rgw/rgw_service.cc b/src/rgw/rgw_service.cc index 00803b81a85..1aabb088477 100644 --- a/src/rgw/rgw_service.cc +++ b/src/rgw/rgw_service.cc @@ -365,7 +365,8 @@ int RGWCtlDef::init(RGWServices& svc) user->init(bucket.get()); bucket->init(user.get(), (RGWBucketMetadataHandler *)bucket_meta_handler, - (RGWBucketInstanceMetadataHandler *)bi_meta_handler); + (RGWBucketInstanceMetadataHandler *)bi_meta_handler, + svc.datalog_rados->get_log()); otp->init((RGWOTPMetadataHandler *)meta.otp.get()); -- 2.39.5