]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add asok command that dumps cached snap infos
authorYan, Zheng <zyan@redhat.com>
Thu, 4 Jan 2018 09:14:49 +0000 (17:14 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 9 Feb 2018 10:42:29 +0000 (18:42 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/SnapClient.cc
src/mds/SnapClient.h
src/mds/SnapServer.cc

index 4b3a6a2a34b3f92e5db89ae9a5cd7402627d3ca4..0717f455b237a821bd28ebbb9ec8ebdc4143f767 100644 (file)
@@ -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");
index 2337c4e07e0947ee6861ccf8f6a089285a2efe83..e32db61df1204e783759b1b9b25bf5d79484d0e5 100644 (file)
@@ -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();
index 103fd2c50b198b3a5ee05485ae2c068522450fd7..df667df3b807ae58908bf57c76e996e13b8f087f 100644 (file)
@@ -274,3 +274,42 @@ void SnapClient::get_snap_infos(map<snapid_t, const SnapInfo*>& 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<snapid_t, const SnapInfo*> 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;
+}
index cc98587788209961210acf8306f0ab951d74d5c4..8c30b2cc338ec66e3b6940a217608d91fa010115 100644 (file)
@@ -107,6 +107,8 @@ public:
   set<snapid_t> filter(const set<snapid_t>& snaps) const;
   const SnapInfo* get_snap_info(snapid_t snapid) const;
   void get_snap_infos(map<snapid_t, const SnapInfo*>& infomap, const set<snapid_t>& snaps) const;
+
+  int dump_cache(Formatter *f) const;
 };
 
 #endif
index e6eed75307a0fcb1ddb3991cbbb3c0fb1480ca6a..4bdbfd8e8fb7535c539a2fce5708202c5a666fe7 100644 (file)
@@ -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<version_t>::const_iterator i = pending_noop.begin(); i != pending_noop.end(); ++i) {