From: Javier M. Mellid Date: Fri, 12 Oct 2018 12:21:41 +0000 (+0200) Subject: rgw: Add archive zone metadata manager X-Git-Tag: v14.1.0~269^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6b62519edd8bd4058cb4fd2e15abea4d8efdf514;p=ceph.git 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 --- diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 1ad06149bc24..38285f1b49ea 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 1d36ce7c2ee7..0017c8521b95 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 2c8d61db5baf..246f23ccf719 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