]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: MonmapMonitor: support 'mon getmap [epoch]'
authorJoao Eduardo Luis <joao.luis@inktank.com>
Wed, 30 Oct 2013 12:29:32 +0000 (12:29 +0000)
committerJoao Eduardo Luis <jecluis@gmail.com>
Wed, 30 Oct 2013 12:34:36 +0000 (12:34 +0000)
Fixes: #6683
Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
src/mon/MonmapMonitor.cc

index ca855592445f1aab66da50391b8f8cbcf652bc2d..18c07bcc515a4dd684ef02d55ab2de3760a536c7 100644 (file)
@@ -177,58 +177,67 @@ bool MonmapMonitor::preprocess_command(MMonCommand *m)
     ss.str("");
     r = 0;
 
-  } else if (prefix == "mon getmap") {
-    mon->monmap->encode(rdata, CEPH_FEATURES_ALL);
-    r = 0;
-    ss << "got latest monmap";
+  } else if (prefix == "mon getmap" ||
+             prefix == "mon dump") {
 
-  } else if (prefix == "mon dump") {
-    string format;
-    cmd_getval(g_ceph_context, cmdmap, "format", format, string("plain"));
-    epoch_t epoch = 0;
-    int64_t epochval;
-    if (cmd_getval(g_ceph_context, cmdmap, "epoch", epochval))
-      epoch = epochval;
+    epoch_t epoch;
+    int64_t epochnum;
+    cmd_getval(g_ceph_context, cmdmap, "epoch", epochnum, (int64_t)0);
+    epoch = epochnum;
 
     MonMap *p = mon->monmap;
     if (epoch) {
-      bufferlist b;
-      r = get_version(epoch, b);
+      bufferlist bl;
+      r = get_version(epoch, bl);
       if (r == -ENOENT) {
-       p = 0;
-      } else {
-       p = new MonMap;
-       p->decode(b);
+        ss << "there is no map for epoch " << epoch;
+        goto reply;
       }
+      assert(r == 0);
+      assert(bl.length() > 0);
+      p = new MonMap;
+      p->decode(bl);
     }
-    if (p) {
+
+    assert(p != NULL);
+
+    if (prefix == "mon getmap") {
+      p->encode(rdata, CEPH_FEATURES_ALL);
+      r = 0;
+      ss << "got monmap epoch " << p->get_epoch();
+    } else if (prefix == "mon dump") {
+      string format;
+      cmd_getval(g_ceph_context, cmdmap, "format", format, string("plain"));
       stringstream ds;
       boost::scoped_ptr<Formatter> f(new_formatter(format));
       if (f) {
-       f->open_object_section("monmap");
-       p->dump(f.get());
-       f->open_array_section("quorum");
-       for (set<int>::iterator q = mon->get_quorum().begin(); q != mon->get_quorum().end(); ++q)
-         f->dump_int("mon", *q);
-       f->close_section();
-       f->close_section();
-       f->flush(ds);
-       r = 0;
+        f->open_object_section("monmap");
+        p->dump(f.get());
+        f->open_array_section("quorum");
+        for (set<int>::iterator q = mon->get_quorum().begin();
+            q != mon->get_quorum().end(); ++q) {
+          f->dump_int("mon", *q);
+        }
+        f->close_section();
+        f->close_section();
+        f->flush(ds);
+        r = 0;
       } else {
-       p->print(ds);
-       r = 0;
-      } 
+        p->print(ds);
+        r = 0;
+      }
       rdata.append(ds);
       ss << "dumped monmap epoch " << p->get_epoch();
-      if (p != mon->monmap)
-       delete p;
     }
+    if (p != mon->monmap)
+       delete p;
   }
   else if (prefix == "mon add")
     return false;
   else if (prefix == "mon remove")
     return false;
 
+reply:
   if (r != -1) {
     string rs;
     getline(ss, rs);