From 6b62519edd8bd4058cb4fd2e15abea4d8efdf514 Mon Sep 17 00:00:00 2001 From: "Javier M. Mellid" Date: Fri, 12 Oct 2018 14:21:41 +0200 Subject: [PATCH] rgw: Add archive zone metadata manager The current implementation supports one only metadata manager. The new archive zone requires a new metadata manager to override functionality. The archive zone metadata manager need to plug in/out depending on the zone tier type. This metadata manager switching is driven by the new archive data sync module. The metadata manager switch requires migrating the old metadata manager state to the new one to avoid crashing the current operations. Signed-off-by: Javier M. Mellid --- src/rgw/rgw_data_sync.cc | 16 ++++++++++++++++ src/rgw/rgw_metadata.cc | 6 ++++++ src/rgw/rgw_metadata.h | 11 +++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 1ad06149bc246..38285f1b49eaa 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -1691,6 +1691,8 @@ class RGWArchiveDataSyncModule : public RGWDefaultDataSyncModule { public: RGWArchiveDataSyncModule() {} + void init(RGWDataSyncEnv *sync_env, uint64_t instance_id) override; + RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, @@ -1712,6 +1714,20 @@ int RGWArchiveSyncModule::create_instance(CephContext *cct, const JSONFormattabl return 0; } +void RGWArchiveDataSyncModule::init(RGWDataSyncEnv *sync_env, uint64_t instance_id) { + + ldout(sync_env->cct, 0) << "Switching to archive zone metadata manager" << dendl; + + // FIXME: this code crashes... migrating the current state (handles, md_logs, + // current_log...) in meta_mgr raises errors (threads, locks ...) + + //RGWMetadataManager *current_meta_mgr = sync_env->store->meta_mgr; + //RGWMetadataManager *new_meta_mgr = new RGWArchiveMetadataManager(sync_env->cct, sync_env->store); + //new_meta_mgr.update_state_from(current_meta_mgr); + //delete current_meta_mgr; + //current_meta_mgr = new_meta_mgr; +} + RGWCoroutine *RGWArchiveDataSyncModule::sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) { ldout(sync_env->cct, 0) << "SYNC_ARCHIVE: sync_object: b=" << bucket_info.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch << dendl; diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 1d36ce7c2ee71..0017c8521b952 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -360,6 +360,12 @@ RGWMetadataManager::RGWMetadataManager(CephContext *_cct, RGWRados *_store) { } +RGWArchiveMetadataManager::RGWArchiveMetadataManager(CephContext *_cct, RGWRados *_store) + : RGWMetadataManager(_cct, _store) +{ + ldout(store->ctx(), 0) << "RGWArchiveMetadataManager() constructor check" << dendl; +} + RGWMetadataManager::~RGWMetadataManager() { map::iterator iter; diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index 2c8d61db5baf6..246f23ccf7197 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -294,8 +294,6 @@ WRITE_CLASS_ENCODER(RGWMetadataLogHistory) class RGWMetadataManager { map handlers; - CephContext *cct; - RGWRados *store; // maintain a separate metadata log for each period std::map md_logs; @@ -319,6 +317,10 @@ class RGWMetadataManager { RGWObjVersionTracker *objv_tracker, RGWMetadataHandler::sync_type_t sync_mode); +protected: + CephContext *cct; + RGWRados *store; + public: RGWMetadataManager(CephContext *_cct, RGWRados *_store); ~RGWMetadataManager(); @@ -424,4 +426,9 @@ int RGWMetadataManager::mutate(RGWMetadataHandler *handler, const string& key, return 0; } +class RGWArchiveMetadataManager : public RGWMetadataManager { +public: + RGWArchiveMetadataManager(CephContext *_cct, RGWRados *_store); +}; + #endif -- 2.39.5