From 637bd5601e93dac0304951f44660090e96f709af Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 23 Nov 2015 14:38:18 -0800 Subject: [PATCH] rgw: remove sync reporting will use the cr reporting framework instead Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_sync.cc | 137 +++++--------------------------------------- src/rgw/rgw_sync.h | 111 +---------------------------------- 2 files changed, 17 insertions(+), 231 deletions(-) diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index 0b962d808d3d1..f1a08a1dc03a0 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -24,51 +24,6 @@ static string mdlog_sync_status_oid = "mdlog.sync-status"; static string mdlog_sync_status_shard_prefix = "mdlog.sync-status.shard"; static string mdlog_sync_full_sync_index_prefix = "meta.full-sync.index"; -#define REPORT_MAX_HISTORY 10 -RGWReportContainer::RGWReportContainer(CephContext *_cct, RGWReportContainer *_parent, - const string& _id, const string& _op, const string& _status) : cct(_cct), parent(_parent), id(_id), operation(_op), - max_history(REPORT_MAX_HISTORY), lock("RGWReportContainer::lock") { - timestamp = ceph_clock_now(cct); - set_status(_status); -} - -void RGWReportContainer::set_status(const string& s) { - RWLock::WLocker l(lock); - if (!timestamp.is_zero()) { - status_history.push_back(StatusHistoryItem(timestamp, status)); - } - if (status_history.size() > (size_t)max_history) { - status_history.pop_front(); - } - timestamp = ceph_clock_now(cct); - status = s; -} - -void RGWReportContainer::dump(Formatter *f) const { - RWLock::RLocker rl(lock); - ::encode_json("id", id, f); - ::encode_json("timestamp", timestamp, f); - ::encode_json("operation", operation, f); - ::encode_json("status", status, f); - ::encode_json("status_history", status_history, f); - f->open_array_section("actions"); - for (auto i = actions.begin(); i != actions.end(); ++i) { - ::encode_json(i->first.c_str(), *(i->second), f); - } - f->close_section(); -} - -void RGWReportContainer::StatusHistoryItem::dump(Formatter *f) const { - ::encode_json("timestamp", timestamp, f); - ::encode_json("status", status, f); -} - -void RGWMetaSyncReport::dump(Formatter *f) const { - RWLock::RLocker rl(lock); - ::encode_json("source", source, f); - ::encode_json("report", report, f); -} - void RGWSyncBackoff::update_wait_time() { if (cur_wait == 0) { @@ -277,32 +232,8 @@ int RGWRemoteMetaLog::get_shard_info(int shard_id) #define CLONE_MAX_ENTRIES 100 -class RGWMetadataSyncReportHook : public AdminSocketHook { - RGWMetaSyncStatusManager *status_mgr; -public: - RGWMetadataSyncReportHook(RGWMetaSyncStatusManager *_sm) : status_mgr(_sm) {} - bool call(std::string command, cmdmap_t& cmdmap, std::string format, - bufferlist& out) { - stringstream ss; - JSONFormatter f; - ::encode_json("status", status_mgr->get_sync_report(), &f); - f.flush(ss); - out.append(ss); - return true; - } -}; - int RGWMetaSyncStatusManager::init() { - AdminSocket *admin_socket = store->ctx()->get_admin_socket(); - asok_hook = new RGWMetadataSyncReportHook(this); - int r = admin_socket->register_command("metadata sync report", "metadata sync report", asok_hook, - "dump metadata sync process status for the specific radosgw process"); - if (r < 0) { - lderr(store->ctx()) << "ERROR: fail to register admin socket command (r=" << r << ")" << dendl; - /* continue, non critical error */ - } - if (store->is_meta_master()) { return 0; } @@ -314,7 +245,7 @@ int RGWMetaSyncStatusManager::init() const char *log_pool = store->get_zone_params().log_pool.name.c_str(); librados::Rados *rados = store->get_rados_handle(); - r = rados->ioctx_create(log_pool, ioctx); + int r = rados->ioctx_create(log_pool, ioctx); if (r < 0) { lderr(store->ctx()) << "ERROR: failed to open log pool (" << store->get_zone_params().log_pool.name << " ret=" << r << dendl; return r; @@ -530,18 +461,16 @@ public: class RGWInitSyncStatusCoroutine : public RGWCoroutine { RGWMetaSyncEnv *sync_env; - RGWReportContainer *report; RGWObjectCtx& obj_ctx; rgw_meta_sync_info status; map shards_info; RGWContinuousLeaseCR *lease_cr; public: - RGWInitSyncStatusCoroutine(RGWMetaSyncEnv *_sync_env, RGWReportContainer& parent_report, + RGWInitSyncStatusCoroutine(RGWMetaSyncEnv *_sync_env, RGWObjectCtx& _obj_ctx, uint32_t _num_shards) : RGWCoroutine(_sync_env->store->ctx()), sync_env(_sync_env), obj_ctx(_obj_ctx), lease_cr(NULL) { status.num_shards = _num_shards; - report = parent_report.new_action("init", "RGWInitSyncStatusCoroutine", "start"); } ~RGWInitSyncStatusCoroutine() { @@ -549,7 +478,6 @@ public: lease_cr->abort(); lease_cr->put(); } - report->finish(); } int operate() { @@ -632,31 +560,20 @@ public: class RGWReadSyncStatusCoroutine : public RGWSimpleRadosReadCR { RGWMetaSyncEnv *sync_env; RGWObjectCtx& obj_ctx; - RGWReportContainer *report; rgw_meta_sync_status *sync_status; public: RGWReadSyncStatusCoroutine(RGWMetaSyncEnv *_sync_env, - RGWObjectCtx& _obj_ctx, RGWReportContainer *parent_report, + RGWObjectCtx& _obj_ctx, rgw_meta_sync_status *_status) : RGWSimpleRadosReadCR(_sync_env->async_rados, _sync_env->store, _obj_ctx, _sync_env->store->get_zone_params().log_pool, _sync_env->status_oid(), &_status->sync_info), sync_env(_sync_env), obj_ctx(_obj_ctx), - report(NULL), sync_status(_status) { - if (parent_report) { - report = parent_report->new_action("read_status", "read metadata sync status", "start"); - } - } - - ~RGWReadSyncStatusCoroutine() { - if (report) { - report->finish(); - } } int handle_data(rgw_meta_sync_info& data); @@ -698,21 +615,17 @@ class RGWFetchAllMetaCR : public RGWCoroutine { map& markers; - RGWReportContainer *report; - public: - RGWFetchAllMetaCR(RGWMetaSyncEnv *_sync_env, RGWReportContainer& parent_report, int _num_shards, + RGWFetchAllMetaCR(RGWMetaSyncEnv *_sync_env, int _num_shards, map& _markers) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), num_shards(_num_shards), ret_status(0), entries_index(NULL), lease_cr(NULL), lost_lock(false), failed(false), markers(_markers) { - report = parent_report.new_action("init", "fetch all meta", "start"); } ~RGWFetchAllMetaCR() { if (lease_cr) { lease_cr->put(); } - report->finish(); } void append_section_from_set(set& all_sections, const string& name) { @@ -1102,7 +1015,6 @@ public: class RGWMetaSyncShardCR : public RGWCoroutine { RGWMetaSyncEnv *sync_env; - RGWReportContainer *report; rgw_bucket pool; @@ -1144,7 +1056,7 @@ class RGWMetaSyncShardCR : public RGWCoroutine { int total_entries; public: - RGWMetaSyncShardCR(RGWMetaSyncEnv *_sync_env, RGWReportContainer *parent_report, + RGWMetaSyncShardCR(RGWMetaSyncEnv *_sync_env, rgw_bucket& _pool, uint32_t _shard_id, rgw_meta_sync_marker& _marker, bool *_reset_backoff) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), @@ -1155,7 +1067,6 @@ public: lease_cr(NULL), lost_lock(false), reset_backoff(_reset_backoff), can_adjust_marker(false), total_entries(0) { *reset_backoff = false; - report = parent_report->new_action("sync_shard", "RGWMetaSyncShardCR", "init"); } ~RGWMetaSyncShardCR() { @@ -1164,7 +1075,6 @@ public: lease_cr->abort(); lease_cr->put(); } - report->finish(); } void set_marker_tracker(RGWMetaSyncShardMarkerTrack *mt) { @@ -1486,7 +1396,6 @@ public: class RGWMetaSyncShardControlCR : public RGWBackoffControlCR { RGWMetaSyncEnv *sync_env; - RGWReportContainer *report; rgw_bucket pool; @@ -1497,7 +1406,6 @@ class RGWMetaSyncShardControlCR : public RGWBackoffControlCR public: RGWMetaSyncShardControlCR(RGWMetaSyncEnv *_sync_env, - RGWReportContainer *parent_report, rgw_bucket& _pool, uint32_t _shard_id, rgw_meta_sync_marker& _marker) : RGWBackoffControlCR(_sync_env->cct), sync_env(_sync_env), @@ -1506,14 +1414,10 @@ public: sync_marker(_marker), obj_ctx(sync_env->store) { char buf[16]; snprintf(buf, sizeof(buf), "%d", shard_id); - report = parent_report->new_action(buf, "RGWMetaSyncShardControlCR", "run"); - } - ~RGWMetaSyncShardControlCR() { - report->finish(); } RGWCoroutine *alloc_cr() { - return new RGWMetaSyncShardCR(sync_env, report, pool, shard_id, sync_marker, backoff_ptr()); + return new RGWMetaSyncShardCR(sync_env, pool, shard_id, sync_marker, backoff_ptr()); } RGWCoroutine *alloc_finisher_cr() { @@ -1530,16 +1434,10 @@ class RGWMetaSyncCR : public RGWCoroutine { map shard_crs; - RGWReportContainer *report; - public: - RGWMetaSyncCR(RGWMetaSyncEnv *_sync_env, RGWReportContainer& parent_report, rgw_meta_sync_status& _sync_status) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), + RGWMetaSyncCR(RGWMetaSyncEnv *_sync_env, rgw_meta_sync_status& _sync_status) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), sync_status(_sync_status) { - report = parent_report.new_action("sync", "RGWMetaSyncCR", "start"); - } - ~RGWMetaSyncCR() { - report->finish(); } int operate() { @@ -1550,7 +1448,7 @@ public: uint32_t shard_id = iter->first; rgw_meta_sync_marker marker; - RGWMetaSyncShardControlCR *shard_cr = new RGWMetaSyncShardControlCR(sync_env, report, + RGWMetaSyncShardControlCR *shard_cr = new RGWMetaSyncShardControlCR(sync_env, sync_env->store->get_zone_params().log_pool, shard_id, sync_status.sync_markers[shard_id]); @@ -1580,8 +1478,6 @@ void RGWRemoteMetaLog::init_sync_env(RGWMetaSyncEnv *env) { env->conn = conn; env->async_rados = async_rados; env->http_manager = &http_manager; - - sync_report.set_source(conn->get_remote_id()); } int RGWRemoteMetaLog::clone_shards(int num_shards, vector& clone_markers) @@ -1617,7 +1513,7 @@ int RGWRemoteMetaLog::read_sync_status(rgw_meta_sync_status *sync_status) } RGWObjectCtx obj_ctx(store, NULL); - return run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, NULL, sync_status)); + return run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, sync_status)); } int RGWRemoteMetaLog::init_sync_status(int num_shards) @@ -1637,7 +1533,7 @@ int RGWRemoteMetaLog::init_sync_status(int num_shards) } RGWObjectCtx obj_ctx(store, NULL); - return run(new RGWInitSyncStatusCoroutine(&sync_env, sync_report.get_container(), obj_ctx, num_shards)); + return run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx, num_shards)); } int RGWRemoteMetaLog::set_sync_info(const rgw_meta_sync_info& sync_info) @@ -1649,12 +1545,9 @@ int RGWRemoteMetaLog::set_sync_info(const rgw_meta_sync_info& sync_info) int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status) { if (store->is_meta_master()) { - sync_report.set_status("no metadata sync needed on master"); return 0; } - sync_report.set_status("metadata sync"); - RGWObjectCtx obj_ctx(store, NULL); rgw_mdlog_info mdlog_info; @@ -1672,7 +1565,7 @@ int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status } do { - r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_report.get_container(), &sync_status)); + r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_status)); if (r < 0 && r != -ENOENT) { ldout(store->ctx(), 0) << "ERROR: failed to fetch sync status r=" << r << dendl; return r; @@ -1680,7 +1573,7 @@ int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status if (sync_status.sync_info.state == rgw_meta_sync_info::StateInit) { ldout(store->ctx(), 20) << __func__ << "(): init" << dendl; - r = run(new RGWInitSyncStatusCoroutine(&sync_env, sync_report.get_container(), obj_ctx, num_shards)); + r = run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx, num_shards)); if (r == -EBUSY) { backoff.backoff_sleep(); continue; @@ -1694,7 +1587,7 @@ int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status } while (sync_status.sync_info.state == rgw_meta_sync_info::StateInit); do { - r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_report.get_container(), &sync_status)); + r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_status)); if (r < 0 && r != -ENOENT) { ldout(store->ctx(), 0) << "ERROR: failed to fetch sync status r=" << r << dendl; return r; @@ -1703,7 +1596,7 @@ int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status switch ((rgw_meta_sync_info::SyncState)sync_status.sync_info.state) { case rgw_meta_sync_info::StateBuildingFullSyncMaps: ldout(store->ctx(), 20) << __func__ << "(): building full sync maps" << dendl; - r = run(new RGWFetchAllMetaCR(&sync_env, sync_report.get_container(), num_shards, sync_status.sync_markers)); + r = run(new RGWFetchAllMetaCR(&sync_env, num_shards, sync_status.sync_markers)); if (r == -EBUSY || r == -EAGAIN) { backoff.backoff_sleep(); continue; @@ -1723,7 +1616,7 @@ int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status /* fall through */ case rgw_meta_sync_info::StateSync: ldout(store->ctx(), 20) << __func__ << "(): sync" << dendl; - meta_sync_cr = new RGWMetaSyncCR(&sync_env, sync_report.get_container(), sync_status); + meta_sync_cr = new RGWMetaSyncCR(&sync_env, sync_status); r = run(meta_sync_cr); if (r < 0) { ldout(store->ctx(), 0) << "ERROR: failed to fetch all metadata keys" << dendl; diff --git a/src/rgw/rgw_sync.h b/src/rgw/rgw_sync.h index 7b68c6f5608a1..de0fd2b0aa4cf 100644 --- a/src/rgw/rgw_sync.h +++ b/src/rgw/rgw_sync.h @@ -21,104 +21,6 @@ class RGWMetaSyncStatusManager; class RGWMetaSyncCR; class RGWRESTConn; -class RGWReportContainer : public RefCountedObject { - CephContext *cct; - RGWReportContainer *parent; - - string id; - string operation; - utime_t timestamp; - string status; - - struct StatusHistoryItem { - utime_t timestamp; - string status; - - StatusHistoryItem() {} - StatusHistoryItem(const utime_t& _ts, const string& _status) : timestamp(_ts), status(_status) {} - - void dump(Formatter *f) const; - }; - deque status_history; - - int max_history; - - map actions; - - RWLock lock; - - bool _finish_action(const string& id) { - auto i = actions.find(id); - if (i != actions.end()) { - i->second->put(); - actions.erase(i); - return true; - } - return false; - } - -public: - RGWReportContainer(CephContext *_cct) : cct(_cct), parent(NULL), lock("RGWStatsuContainer::lock") {} - RGWReportContainer(CephContext *_cct, RGWReportContainer *_parent, const string& _id, const string& _op, const string& _status); - - void set_status(const string& s); - - RGWReportContainer *new_action(RGWReportContainer *new_status) { - get(); - finish_action(new_status->id); - new_status->get(); - actions[new_status->id] = new_status; - return new_status; - } - - RGWReportContainer *new_action(const string& action_id, const string& op, const string& status) { - RGWReportContainer *new_status = new RGWReportContainer(cct, this, action_id, op, status); - return new_action(new_status); - } - - void finish_action(const string& action_id) { - lock.get_write(); - bool need_put = _finish_action(action_id); - lock.unlock(); - if (need_put) { - put(); - } - } - - void finish() { - if (parent) { - parent->finish_action(id); - } - put(); - } - - virtual void dump(Formatter *f) const; -}; - -class RGWMetaSyncReport { - string source; - - RGWReportContainer report; - - RWLock lock; - -public: - RGWMetaSyncReport(CephContext *cct) : report(cct), lock("RGWMetaSycnReport::lock") {} - - void set_source(const string& s) { - RWLock::WLocker l(lock); - source = s; - } - - RGWReportContainer& get_container() { return report; } - - void set_status(const string& s) { - report.set_status(s); - } - - void dump(Formatter *f) const; -}; - #define DEFAULT_BACKOFF_MAX 30 class RGWSyncBackoff { @@ -190,8 +92,6 @@ struct RGWMetaSyncEnv { string status_oid(); }; -class RGWMetadataSyncReportHook; - class RGWRemoteMetaLog : public RGWCoroutinesManager { RGWRados *store; RGWRESTConn *conn; @@ -206,15 +106,13 @@ class RGWRemoteMetaLog : public RGWCoroutinesManager { RGWMetaSyncEnv sync_env; - RGWMetaSyncReport sync_report; - void init_sync_env(RGWMetaSyncEnv *env); public: RGWRemoteMetaLog(RGWRados *_store, RGWMetaSyncStatusManager *_sm) : RGWCoroutinesManager(_store->ctx(), _store->get_cr_registry()), store(_store), conn(NULL), async_rados(nullptr), http_manager(store->ctx(), &completion_mgr), - status_manager(_sm), meta_sync_cr(NULL), sync_report(_store->ctx()) {} + status_manager(_sm), meta_sync_cr(NULL) {} int init(); void finish(); @@ -235,8 +133,6 @@ public: RGWMetaSyncEnv& get_sync_env() { return sync_env; } - - RGWMetaSyncReport& get_sync_report() { return sync_report; } }; class RGWMetaSyncStatusManager { @@ -268,16 +164,13 @@ class RGWMetaSyncStatusManager { map ts_to_shard; vector clone_markers; - RGWMetadataSyncReportHook *asok_hook; - public: RGWMetaSyncStatusManager(RGWRados *_store) : store(_store), master_log(store, this), num_shards(0), - ts_to_shard_lock("ts_to_shard_lock"), asok_hook(NULL) {} + ts_to_shard_lock("ts_to_shard_lock") {} int init(); void finish(); rgw_meta_sync_status& get_sync_status() { return sync_status; } - RGWMetaSyncReport& get_sync_report() { return master_log.get_sync_report(); } int read_sync_status() { return master_log.read_sync_status(&sync_status); } int init_sync_status() { return master_log.init_sync_status(num_shards); } -- 2.39.5