From e2a299e803978550c607086f414dcc0e9a58e232 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 4 Jan 2018 17:14:49 +0800 Subject: [PATCH] mds: add asok command that dumps cached snap infos Signed-off-by: "Yan, Zheng" --- src/mds/MDSDaemon.cc | 6 ++++++ src/mds/MDSRank.cc | 17 +++++++++++++++++ src/mds/SnapClient.cc | 39 +++++++++++++++++++++++++++++++++++++++ src/mds/SnapClient.h | 2 ++ src/mds/SnapServer.cc | 4 +++- 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 4b3a6a2a34b3f..0717f455b237a 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -258,6 +258,11 @@ void MDSDaemon::set_up_admin_socket() asok_hook, "dump metadata loads"); assert(r == 0); + r = admin_socket->register_command("dump snaps", + "dump snaps name=server,type=CephChoices,strings=--server,req=false", + asok_hook, + "dump snapshots"); + assert(r == 0); r = admin_socket->register_command("session evict", "session evict name=client_id,type=CephString", asok_hook, @@ -333,6 +338,7 @@ void MDSDaemon::clean_up_admin_socket() admin_socket->unregister_command("cache status"); admin_socket->unregister_command("dump tree"); admin_socket->unregister_command("dump loads"); + admin_socket->unregister_command("dump snaps"); admin_socket->unregister_command("session evict"); admin_socket->unregister_command("osdmap barrier"); admin_socket->unregister_command("session ls"); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 2337c4e07e094..e32db61df1204 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2020,6 +2020,23 @@ bool MDSRankDispatcher::handle_asok_command( ss << "Failed to dump loads: " << cpp_strerror(r); f->reset(); } + } else if (command == "dump snaps") { + Mutex::Locker l(mds_lock); + string server; + cmd_getval(g_ceph_context, cmdmap, "server", server); + if (server == "--server") { + if (mdsmap->get_tableserver() == whoami) { + snapserver->dump(f); + } else { + ss << "Not snapserver"; + } + } else { + int r = snapclient->dump_cache(f); + if (r != 0) { + ss << "Failed to dump snapclient: " << cpp_strerror(r); + f->reset(); + } + } } else if (command == "force_readonly") { Mutex::Locker l(mds_lock); mdcache->force_readonly(); diff --git a/src/mds/SnapClient.cc b/src/mds/SnapClient.cc index 103fd2c50b198..df667df3b807a 100644 --- a/src/mds/SnapClient.cc +++ b/src/mds/SnapClient.cc @@ -274,3 +274,42 @@ void SnapClient::get_snap_infos(map& infomap, infomap.insert(result.begin(), result.end()); } + +int SnapClient::dump_cache(Formatter *f) const +{ + if (!is_synced()) { + dout(5) << "dump_cache: not synced" << dendl; + return -EINVAL; + } + + map snaps; + for (auto& p : cached_snaps) + snaps[p.first] = &p.second; + + for (auto tid : committing_tids) { + auto q = cached_pending_update.find(tid); + if (q != cached_pending_update.end()) + snaps[q->second.snapid] = &q->second; + + auto r = cached_pending_destroy.find(tid); + if (r != cached_pending_destroy.end()) + snaps.erase(r->second.first); + } + + f->open_object_section("snapclient"); + + f->dump_int("last_created", get_last_created()); + f->dump_int("last_destroyed", get_last_destroyed()); + + f->open_array_section("snaps"); + for (auto p : snaps) { + f->open_object_section("snap"); + p.second->dump(f); + f->close_section(); + } + f->close_section(); + + f->close_section(); + + return 0; +} diff --git a/src/mds/SnapClient.h b/src/mds/SnapClient.h index cc98587788209..8c30b2cc338ec 100644 --- a/src/mds/SnapClient.h +++ b/src/mds/SnapClient.h @@ -107,6 +107,8 @@ public: set filter(const set& snaps) const; const SnapInfo* get_snap_info(snapid_t snapid) const; void get_snap_infos(map& infomap, const set& snaps) const; + + int dump_cache(Formatter *f) const; }; #endif diff --git a/src/mds/SnapServer.cc b/src/mds/SnapServer.cc index e6eed75307a0f..4bdbfd8e8fb75 100644 --- a/src/mds/SnapServer.cc +++ b/src/mds/SnapServer.cc @@ -366,7 +366,9 @@ void SnapServer::dump(Formatter *f) const { f->open_object_section("snapserver"); - f->dump_int("last_snap", last_snap.val); + f->dump_int("last_snap", last_snap); + f->dump_int("last_created", last_created); + f->dump_int("last_destroyed", last_destroyed); f->open_array_section("pending_noop"); for(set::const_iterator i = pending_noop.begin(); i != pending_noop.end(); ++i) { -- 2.39.5