From 3d49dcedffa0dfd2f52ab7251b65fec14e489ca7 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 15 Sep 2015 14:51:50 -0700 Subject: [PATCH] rgw-admin: data sync status command Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_admin.cc | 16 +++++++++----- src/rgw/rgw_data_sync.cc | 48 ++++++++++++++++++++++++++++++++++++++-- src/rgw/rgw_data_sync.h | 3 ++- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 6a2138111b74d..df5533eca65b9 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -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::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) { diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 2e6951a5794a5..1db7892730b78 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -56,6 +56,43 @@ void rgw_datalog_shard_data::decode_json(JSONObj *obj) { JSONDecoder::decode_json("entries", entries, obj); }; +class RGWReadDataSyncStatusCoroutine : public RGWSimpleRadosReadCR { + 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& markers = sync_status->sync_markers; + for (int i = 0; i < (int)data.num_shards; i++) { + spawn(new RGWSimpleRadosReadCR(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::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; diff --git a/src/rgw/rgw_data_sync.h b/src/rgw/rgw_data_sync.h index c080602c3e3fc..f2a075f612529 100644 --- a/src/rgw/rgw_data_sync.h +++ b/src/rgw/rgw_data_sync.h @@ -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); -- 2.39.5