From adf5474704a07a16acc02d8ff2bec78f7746e363 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 12 Nov 2018 15:55:51 -0800 Subject: [PATCH] rgw: remove RGWMetadataHandler::remove_by_metakey(), rework handler allocation 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 --- src/rgw/rgw_bucket.cc | 68 ++++++++++++++++++-------------------- src/rgw/rgw_bucket.h | 21 ++++++++++++ src/rgw/rgw_data_sync.cc | 6 ++++ src/rgw/rgw_metadata.cc | 29 ++++++---------- src/rgw/rgw_metadata.h | 1 - src/rgw/rgw_sync_module.cc | 11 ++++++ src/rgw/rgw_sync_module.h | 3 ++ 7 files changed, 84 insertions(+), 55 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index dd28a479d54f1..d275467c0cbdf 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -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); diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 7f1135389b471..2834fbf78d787 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -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); /** diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 38285f1b49eaa..5effbb61786ab 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -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) diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 0017c8521b952..dc1e03c3d4182 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -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 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) { diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index 246f23ccf7197..8c19dfba1eb70 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -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& keys, bool *truncated) = 0; diff --git a/src/rgw/rgw_sync_module.cc b/src/rgw/rgw_sync_module.cc index 0f560256c62c2..baa6ff814f4e2 100644 --- a/src/rgw/rgw_sync_module.cc +++ b/src/rgw/rgw_sync_module.cc @@ -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" @@ -16,6 +17,16 @@ #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), diff --git a/src/rgw/rgw_sync_module.h b/src/rgw/rgw_sync_module.h index cd0d144184314..5c376dc937114 100644 --- a/src/rgw/rgw_sync_module.h +++ b/src/rgw/rgw_sync_module.h @@ -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 RGWSyncModuleInstanceRef; -- 2.39.5