]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw-admin: data sync status command
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 15 Sep 2015 21:51:50 +0000 (14:51 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 12 Feb 2016 00:12:51 +0000 (16:12 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_data_sync.cc
src/rgw/rgw_data_sync.h

index 6a2138111b74ddb55788a493aa04521e782b8d4b..df5533eca65b9c456d3fddf1f5ee5450df550f39 100644 (file)
@@ -607,7 +607,7 @@ static int get_cmd(const char *cmd, const char *prev_cmd, const char *prev_prev_
       *need_more = true;
       return 0;
     }
-  } else if ((strcmp(prev_prev_cmd, "metadata") == 0) &&
+  } else if ((prev_prev_cmd && strcmp(prev_prev_cmd, "metadata") == 0) &&
             (strcmp(prev_cmd, "sync") == 0)) {
     if (strcmp(cmd, "status") == 0)
       return OPT_METADATA_SYNC_STATUS;
@@ -637,7 +637,7 @@ static int get_cmd(const char *cmd, const char *prev_cmd, const char *prev_prev_
       return OPT_DATALOG_LIST;
     if (strcmp(cmd, "trim") == 0)
       return OPT_DATALOG_TRIM;
-  } else if ((strcmp(prev_prev_cmd, "data") == 0) &&
+  } else if ((prev_prev_cmd && strcmp(prev_prev_cmd, "data") == 0) &&
             (strcmp(prev_cmd, "sync") == 0)) {
     if (strcmp(cmd, "status") == 0)
       return OPT_DATA_SYNC_STATUS;
@@ -1391,6 +1391,8 @@ int main(int argc, char **argv)
   string err;
   long long tmp = 0;
 
+  string source_zone;
+
   for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ) {
     if (ceph_argparse_double_dash(args, i)) {
       break;
@@ -1638,6 +1640,8 @@ int main(int argc, char **argv)
       zone_id = val;
     } else if (ceph_argparse_witharg(args, i, &val, "--zone-new-name", (char*)NULL)) {
       zone_new_name = val;
+    } else if (ceph_argparse_witharg(args, i, &val, "--source-zone", (char*)NULL)) {
+      source_zone = val;
     } else if (strncmp(*i, "-", 1) == 0) {
       cerr << "ERROR: invalid flag " << *i << std::endl;
       return EINVAL;
@@ -3821,8 +3825,11 @@ next:
   }
 
   if (opt_cmd == OPT_DATA_SYNC_STATUS) {
-#if 0
-    RGWDataSyncStatusManager sync(store);
+    if (source_zone.empty()) {
+      cerr << "ERROR: source zone not specified" << std::endl;
+      return EINVAL;
+    }
+    RGWDataSyncStatusManager sync(store, source_zone);
 
     int ret = sync.init();
     if (ret < 0) {
@@ -3840,7 +3847,6 @@ next:
 
     encode_json("sync_status", sync_status, formatter);
     formatter->flush(cout);
-#endif
   }
 
   if (opt_cmd == OPT_DATA_SYNC_INIT) {
index 2e6951a5794a584f5182f9c0b1941337694791b2..1db7892730b78da5fb1c38bb27e8eb8ccd917e48 100644 (file)
@@ -56,6 +56,43 @@ void rgw_datalog_shard_data::decode_json(JSONObj *obj) {
   JSONDecoder::decode_json("entries", entries, obj);
 };
 
+class RGWReadDataSyncStatusCoroutine : public RGWSimpleRadosReadCR<rgw_data_sync_info> {
+  RGWAsyncRadosProcessor *async_rados;
+  RGWRados *store;
+  RGWObjectCtx& obj_ctx;
+
+  string source_zone;
+
+  rgw_data_sync_status *sync_status;
+
+public:
+  RGWReadDataSyncStatusCoroutine(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
+                     RGWObjectCtx& _obj_ctx, const string& _source_zone,
+                     rgw_data_sync_status *_status) : RGWSimpleRadosReadCR(_async_rados, _store, _obj_ctx,
+                                                                           _store->get_zone_params().log_pool,
+                                                                           datalog_sync_status_oid,
+                                                                           &_status->sync_info),
+                                                                            async_rados(_async_rados), store(_store),
+                                                                            obj_ctx(_obj_ctx), source_zone(_source_zone),
+                                                                           sync_status(_status) {}
+
+  int handle_data(rgw_data_sync_info& data);
+};
+
+int RGWReadDataSyncStatusCoroutine::handle_data(rgw_data_sync_info& data)
+{
+  if (retcode == -ENOENT) {
+    return retcode;
+  }
+
+  map<uint32_t, rgw_data_sync_marker>& markers = sync_status->sync_markers;
+  for (int i = 0; i < (int)data.num_shards; i++) {
+    spawn(new RGWSimpleRadosReadCR<rgw_data_sync_marker>(async_rados, store, obj_ctx, store->get_zone_params().log_pool,
+                                                   RGWDataSyncStatusManager::shard_obj_name(source_zone, i), &markers[i]), true);
+  }
+  return 0;
+}
+
 int RGWRemoteDataLog::read_log_info(rgw_datalog_info *log_info)
 {
   rgw_http_param_pair pairs[] = { { "type", "data" },
@@ -72,13 +109,14 @@ int RGWRemoteDataLog::read_log_info(rgw_datalog_info *log_info)
   return 0;
 }
 
-int RGWRemoteDataLog::init(RGWRESTConn *_conn)
+int RGWRemoteDataLog::init(const string& _source_zone, RGWRESTConn *_conn)
 {
   CephContext *cct = store->ctx();
   async_rados = new RGWAsyncRadosProcessor(store, cct->_conf->rgw_num_async_rados_threads);
   async_rados->start();
 
   conn = _conn;
+  source_zone = _source_zone;
 
   int ret = http_manager.set_threaded();
   if (ret < 0) {
@@ -163,6 +201,12 @@ int RGWRemoteDataLog::get_shard_info(int shard_id)
   return 0;
 }
 
+int RGWRemoteDataLog::read_sync_status(rgw_data_sync_status *sync_status)
+{
+  RGWObjectCtx obj_ctx(store, NULL);
+  return run(new RGWReadDataSyncStatusCoroutine(async_rados, store, obj_ctx, source_zone, sync_status));
+}
+
 int RGWDataSyncStatusManager::init()
 {
   map<string, RGWRESTConn *>::iterator iter = store->zone_conn_map.find(source_zone);
@@ -183,7 +227,7 @@ int RGWDataSyncStatusManager::init()
 
   source_status_obj = rgw_obj(store->get_zone_params().log_pool, datalog_sync_status_oid);
 
-  r = source_log.init(conn);
+  r = source_log.init(source_zone, conn);
   if (r < 0) {
     lderr(store->ctx()) << "ERROR: failed to init remote log, r=" << r << dendl;
     return r;
index c080602c3e3fcfa48b1e3d561c8a16f206bbdb09..f2a075f6125297b5a473046e2edf4cfc7ee1eb2d 100644 (file)
@@ -132,6 +132,7 @@ class RGWDataSyncCR;
 class RGWRemoteDataLog : public RGWCoroutinesManager {
   RGWRados *store;
   RGWRESTConn *conn;
+  string source_zone;
   RGWAsyncRadosProcessor *async_rados;
 
   RGWHTTPManager http_manager;
@@ -145,7 +146,7 @@ public:
                                        http_manager(store->ctx(), &completion_mgr),
                                        status_manager(_sm), data_sync_cr(NULL) {}
 
-  int init(RGWRESTConn *_conn);
+  int init(const string& _source_zone, RGWRESTConn *_conn);
   void finish();
 
   int read_log_info(rgw_datalog_info *log_info);