]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: sync: only update data log if bucket exports data
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 26 Nov 2019 21:01:32 +0000 (13:01 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 28 Jan 2020 18:20:39 +0000 (10:20 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_bucket_sync.h
src/rgw/rgw_service.cc

index ac7aa7cf46c5cb028a510acaacd91f3303c77cd8..5f37624333330c367ebb10eb9de7407d30a78422 100644 (file)
@@ -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<int(RGWSI_Bucket_X_Ctx& ctx)> f) {
index 3190a56c4825cb41e3fec40b73457f11aa8c8422..d0f38869c540775eddcd690c430a17df0999f8d5 100644 (file)
@@ -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<int(RGWSI_Bucket_X_Ctx& ctx)> 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 {
index 8545d4986d5bbc6c26673ef99e45872307c3803f..27d5f8bb1bc9db06a109b8df5be02591365626be 100644 (file)
@@ -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 {
index 00803b81a85a9f8880f50914846a1810ec551c9e..1aabb08847777b05b77217416e849efb85ba797a 100644 (file)
@@ -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());