]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: remove RGWMetadataHandler::remove_by_metakey(), rework handler allocation
authorYehuda Sadeh <yehuda@redhat.com>
Mon, 12 Nov 2018 23:55:51 +0000 (15:55 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Thu, 24 Jan 2019 04:19:02 +0000 (20:19 -0800)
Trying to keep a limited api for metadata ops. Bucket and bucket instance meta
handler allocation is controlled by sync module.

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_data_sync.cc
src/rgw/rgw_metadata.cc
src/rgw/rgw_metadata.h
src/rgw/rgw_sync_module.cc
src/rgw/rgw_sync_module.h

index dd28a479d54f15c9a626332a8263638343f3f0bf..d275467c0cbdfad5b9923ab8ed724e8c55d65335 100644 (file)
@@ -2503,36 +2503,18 @@ void get_md5_digest(const RGWBucketEntryPoint *be, string& md5_digest) {
 }
 
 class RGWArchiveBucketMetadataHandler : public RGWBucketMetadataHandler {
-
 public:
-
-  int remove_by_metakey(RGWRados *store, string& metadata_key) override {
-
-    ldout(store->ctx(), 0) << "SKIP: bucket removal is not allowed on archive zone: " << metadata_key << " ... proceeding to rename" << dendl;
-
-    string type;
-    string entry;
-    store->meta_mgr->parse_metadata_key(metadata_key, type, entry);
-
-    RGWMetadataObject *obj;
-    int ret = get(store, entry, &obj);
-    if (ret < 0) {
-        return ret;
-    }
-
-    RGWBucketEntryPoint be;
-    RGWObjectCtx obj_ctx(store);
-    RGWObjVersionTracker objv_tracker;
-    objv_tracker.read_version = obj->get_version();
-
-    delete obj;
+  int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) override {
+    ldout(store->ctx(), 0) << "SKIP: bucket removal is not allowed on archive zone: bucket:" << entry << " ... proceeding to rename" << dendl;
 
     string tenant_name, bucket_name;
     parse_bucket(entry, &tenant_name, &bucket_name);
 
     real_time mtime;
 
-    ret = store->get_bucket_entrypoint_info(obj_ctx, tenant_name, bucket_name, be, &objv_tracker, &mtime, NULL);
+    RGWBucketEntryPoint be;
+    RGWObjectCtx obj_ctx(store);
+    int ret = store->get_bucket_entrypoint_info(obj_ctx, tenant_name, bucket_name, be, &objv_tracker, &mtime, NULL);
     if (ret < 0) {
         return ret;
     }
@@ -2545,6 +2527,8 @@ public:
 
     RGWBucketEntryMetadataObject *be_mdo = new RGWBucketEntryMetadataObject(be, objv_tracker.read_version, mtime);
 
+    string metadata_key = string("bucket:") + entry;
+
     JSONFormatter f(false);
     f.open_object_section("metadata_info");
     encode_json("key", metadata_key + archive_zone_suffix, &f);
@@ -2646,7 +2630,6 @@ public:
     /* idempotent */
     return 0;
   }
-
 };
 
 class RGWBucketInstanceMetadataHandler : public RGWMetadataHandler {
@@ -2869,24 +2852,39 @@ public:
 };
 
 class RGWArchiveBucketInstanceMetadataHandler : public RGWBucketInstanceMetadataHandler {
-
 public:
 
-   int remove_by_metakey(RGWRados *store, string& metadata_key) override {
-       ldout(store->ctx(), 0) << "SKIP: bucket instance removal is not allowed on archive zone: " << metadata_key << dendl;
-          return 0;
-   }
-
+  int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) override {
+    ldout(store->ctx(), 0) << "SKIP: bucket instance removal is not allowed on archive zone: bucket.instance:" << entry << dendl;
+    return 0;
+  }
 };
 
+RGWMetadataHandler *RGWBucketMetaHandlerAllocator::alloc() {
+  return new RGWBucketMetadataHandler;
+}
+
+RGWMetadataHandler *RGWBucketInstanceMetaHandlerAllocator::alloc() {
+  return new RGWBucketInstanceMetadataHandler;
+}
+
+RGWMetadataHandler *RGWArchiveBucketMetaHandlerAllocator::alloc() {
+  return new RGWArchiveBucketMetadataHandler;
+}
+
+RGWMetadataHandler *RGWArchiveBucketInstanceMetaHandlerAllocator::alloc() {
+  return new RGWArchiveBucketInstanceMetadataHandler;
+}
+
 void rgw_bucket_init(RGWMetadataManager *mm)
 {
-  if (mm->get_store()->get_zone().tier_type == "archive") {
-      bucket_meta_handler = new RGWArchiveBucketMetadataHandler;
-      bucket_instance_meta_handler = new RGWArchiveBucketInstanceMetadataHandler;
+  auto sync_module = mm->get_store()->get_sync_module();
+  if (sync_module) {
+    bucket_meta_handler = sync_module->alloc_bucket_meta_handler();
+    bucket_instance_meta_handler = sync_module->alloc_bucket_instance_meta_handler();
   } else {
-      bucket_meta_handler = new RGWBucketMetadataHandler;
-      bucket_instance_meta_handler = new RGWBucketInstanceMetadataHandler;
+    bucket_meta_handler = RGWBucketMetaHandlerAllocator::alloc();
+    bucket_instance_meta_handler = RGWBucketInstanceMetaHandlerAllocator::alloc();
   }
   mm->register_handler(bucket_meta_handler);
   mm->register_handler(bucket_instance_meta_handler);
index 7f1135389b47146d639c6507d4f2ea659f38c088..2834fbf78d7870d1f0e950f3cee89442478c67e2 100644 (file)
@@ -163,6 +163,27 @@ public:
 WRITE_CLASS_ENCODER(RGWUserBuckets)
 
 class RGWMetadataManager;
+class RGWMetadataHandler;
+
+class RGWBucketMetaHandlerAllocator {
+public:
+  static RGWMetadataHandler *alloc();
+};
+
+class RGWBucketInstanceMetaHandlerAllocator {
+public:
+  static RGWMetadataHandler *alloc();
+};
+
+class RGWArchiveBucketMetaHandlerAllocator {
+public:
+  static RGWMetadataHandler *alloc();
+};
+
+class RGWArchiveBucketInstanceMetaHandlerAllocator {
+public:
+  static RGWMetadataHandler *alloc();
+};
 
 extern void rgw_bucket_init(RGWMetadataManager *mm);
 /**
index 38285f1b49eaa65ae2bbf1ab49cae92735c3769f..5effbb61786abc93e6bec6db8bff50df7f6ee50d 100644 (file)
@@ -1706,6 +1706,12 @@ public:
   RGWDataSyncModule *get_data_handler() override {
     return &data_handler;
   }
+  RGWMetadataHandler *alloc_bucket_meta_handler() override {
+    return RGWArchiveBucketMetaHandlerAllocator::alloc();
+  }
+  RGWMetadataHandler *alloc_bucket_instance_meta_handler() override {
+    return RGWArchiveBucketInstanceMetaHandlerAllocator::alloc();
+  }
 };
 
 int RGWArchiveSyncModule::create_instance(CephContext *cct, const JSONFormattable& config, RGWSyncModuleInstanceRef *instance)
index 0017c8521b952ec40ca128bb6582ef636f0e76c9..dc1e03c3d4182ae3a61ef1b5ffa45c5ba6ce5e11 100644 (file)
@@ -275,23 +275,6 @@ obj_version& RGWMetadataObject::get_version()
   return objv;
 }
 
-int RGWMetadataHandler::remove_by_metakey(RGWRados *store, string& metadata_key) {
-    string entry;
-    string type;
-    store->meta_mgr->parse_metadata_key(metadata_key, type, entry);
-
-    RGWMetadataObject *obj;
-    int ret = get(store, entry, &obj);
-    if (ret < 0) {
-        return ret;
-    }
-    RGWObjVersionTracker objv_tracker;
-    objv_tracker.read_version = obj->get_version();
-    delete obj;
-
-    return remove(store, entry, objv_tracker);
-}
-
 class RGWMetadataTopHandler : public RGWMetadataHandler {
   struct iter_data {
     set<string> sections;
@@ -310,7 +293,6 @@ public:
   virtual void get_pool_and_oid(RGWRados *store, const string& key, rgw_pool& pool, string& oid) override {}
 
   int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) override { return -ENOTSUP; }
-  int remove_by_metakey(RGWRados *store, string& metadata_key) override { return -ENOTSUP; }
 
   int list_keys_init(RGWRados *store, const string& marker, void **phandle) override {
     iter_data *data = new iter_data;
@@ -871,7 +853,16 @@ int RGWMetadataManager::remove(string& metadata_key)
     return ret;
   }
 
-  return handler->remove_by_metakey(store, metadata_key);
+  RGWMetadataObject *obj;
+  ret = handler->get(store, entry, &obj);
+  if (ret < 0) {
+    return ret;
+  }
+  RGWObjVersionTracker objv_tracker;
+  objv_tracker.read_version = obj->get_version();
+  delete obj;
+
+  return handler->remove(store, entry, objv_tracker);
 }
 
 int RGWMetadataManager::lock_exclusive(string& metadata_key, timespan duration, string& owner_id) {
index 246f23ccf719784e9f812867f13408f2503b2cc4..8c19dfba1eb70a922d9d779f59101385b84e98dc 100644 (file)
@@ -80,7 +80,6 @@ public:
   virtual int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker,
                   real_time mtime, JSONObj *obj, sync_type_t type) = 0;
   virtual int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) = 0;
-  virtual int remove_by_metakey(RGWRados *store, string& metadata_key);
 
   virtual int list_keys_init(RGWRados *store, const string& marker, void **phandle) = 0;
   virtual int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated) = 0;
index 0f560256c62c21a23881bfd88a4707f85e59cc27..baa6ff814f4e2860a7405160aa6fc6e2740cc568 100644 (file)
@@ -6,6 +6,7 @@
 #include "rgw_cr_rados.h"
 #include "rgw_sync_module.h"
 #include "rgw_data_sync.h"
+#include "rgw_bucket.h"
 
 #include "rgw_sync_module_log.h"
 #include "rgw_sync_module_es.h"
 
 #define dout_subsys ceph_subsys_rgw
 
+RGWMetadataHandler *RGWSyncModuleInstance::alloc_bucket_meta_handler()
+{
+  return RGWBucketMetaHandlerAllocator::alloc();
+}
+
+RGWMetadataHandler *RGWSyncModuleInstance::alloc_bucket_instance_meta_handler()
+{
+  return RGWBucketInstanceMetaHandlerAllocator::alloc();
+}
+
 RGWStatRemoteObjCBCR::RGWStatRemoteObjCBCR(RGWDataSyncEnv *_sync_env,
                        RGWBucketInfo& _bucket_info, rgw_obj_key& _key) : RGWCoroutine(_sync_env->cct),
                                                           sync_env(_sync_env),
index cd0d1441843142a72c82ab3b76f657308c77053c..5c376dc937114e62693adbba8a4b203bdec90c96 100644 (file)
@@ -36,6 +36,7 @@ public:
 };
 
 class RGWRESTMgr;
+class RGWMetadataHandler;
 
 class RGWSyncModuleInstance {
 public:
@@ -48,6 +49,8 @@ public:
   virtual bool supports_user_writes() {
     return false;
   }
+  virtual RGWMetadataHandler *alloc_bucket_meta_handler();
+  virtual RGWMetadataHandler *alloc_bucket_instance_meta_handler();
 };
 
 typedef std::shared_ptr<RGWSyncModuleInstance> RGWSyncModuleInstanceRef;