]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Add archive zone metadata manager
authorJavier M. Mellid <jmunhoz@igalia.com>
Fri, 12 Oct 2018 12:21:41 +0000 (14:21 +0200)
committerYehuda Sadeh <yehuda@redhat.com>
Thu, 24 Jan 2019 04:19:02 +0000 (20:19 -0800)
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 <jmunhoz@igalia.com>
src/rgw/rgw_data_sync.cc
src/rgw/rgw_metadata.cc
src/rgw/rgw_metadata.h

index 1ad06149bc24658808f1d4cc19a4d914533572cf..38285f1b49eaa65ae2bbf1ab49cae92735c3769f 100644 (file)
@@ -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;
index 1d36ce7c2ee719731f16d63d2b69513b1cccc95f..0017c8521b952ec40ca128bb6582ef636f0e76c9 100644 (file)
@@ -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<string, RGWMetadataHandler *>::iterator iter;
index 2c8d61db5baf653adb372b0cd037bc4dae8a2fad..246f23ccf719784e9f812867f13408f2503b2cc4 100644 (file)
@@ -294,8 +294,6 @@ WRITE_CLASS_ENCODER(RGWMetadataLogHistory)
 
 class RGWMetadataManager {
   map<string, RGWMetadataHandler *> handlers;
-  CephContext *cct;
-  RGWRados *store;
 
   // maintain a separate metadata log for each period
   std::map<std::string, RGWMetadataLog> 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