]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_filestore_dump: Add --type list to output objects in a pg in json
authorDavid Zafman <david.zafman@inktank.com>
Thu, 15 May 2014 00:39:17 +0000 (17:39 -0700)
committerDavid Zafman <dzafman@redhat.com>
Thu, 28 Aug 2014 23:21:28 +0000 (16:21 -0700)
Signed-off-by: David Zafman <david.zafman@inktank.com>
src/tools/ceph_filestore_dump.cc

index 4a0f49f04d01909c6d9492d695c383fcf10c9e48..e723b6a1e170731e27bc18ccc941f506aac1924b 100644 (file)
@@ -1133,6 +1133,28 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
   return 0;
 }
 
+int do_list(ObjectStore *store, coll_t coll, Formatter *formatter)
+{
+  vector<ghobject_t> objects;
+  ghobject_t next;
+  while (!next.is_max()) {
+    int r = store->collection_list_partial(coll, next, 200, 300, 0,
+      &objects, &next);
+    if (r < 0)
+      return r;
+    for (vector<ghobject_t>::iterator i = objects.begin();
+        i != objects.end(); ++i) {
+
+      formatter->open_object_section("list");
+      i->dump(formatter);
+      formatter->close_section();
+      formatter->flush(cout);
+      cout << std::endl;
+    }
+  }
+  return 0;
+}
+
 int do_remove_object(ObjectStore *store, coll_t coll, ghobject_t &ghobj)
 {
   spg_t pg;
@@ -1202,7 +1224,7 @@ int main(int argc, char **argv)
     ("pgid", po::value<string>(&pgidstr),
      "PG id, mandatory except for import")
     ("type", po::value<string>(&type),
-     "Arg is one of [info, log, remove, export, import]")
+     "Arg is one of [info, log, remove, export, import, list]")
     ("file", po::value<string>(&file),
      "path of file to export or import")
     ("debug", "Enable diagnostic output to stderr")
@@ -1252,7 +1274,7 @@ int main(int argc, char **argv)
     usage(desc);
   }
   if (!vm.count("type") && !(vm.count("object") && vm.count("objcmd"))) {
-    cerr << "Must provide --type (info, log, remove, export, import) or object command..."
+    cerr << "Must provide --type or object command..."
       << std::endl;
     usage(desc);
   } 
@@ -1313,8 +1335,6 @@ int main(int argc, char **argv)
   }
   
   if ((fspath.length() == 0 || jpath.length() == 0) ||
-      (type != "info" && type != "log" && type != "remove" && type != "export"
-        && type != "import") ||
       (type != "import" && pgidstr.length() == 0)) {
     cerr << "Invalid params" << std::endl;
     return 1;
@@ -1545,6 +1565,17 @@ int main(int argc, char **argv)
       usage(desc);
     }
 
+    if (type == "list") {
+      Formatter *formatter = new JSONFormatter(false);
+      r = do_list(fs, coll, formatter);
+      if (r) {
+        cerr << "do_list failed with " << r << std::endl;
+        ret = 1;
+      }
+      goto out;
+    }
+
+    Formatter *formatter = new JSONFormatter(true);
     bufferlist bl;
     map_epoch = PG::peek_map_epoch(fs, coll, infos_oid, &bl);
     if (debug)
@@ -1593,6 +1624,10 @@ int main(int argc, char **argv)
       formatter->close_section();
       formatter->flush(cout);
       cout << std::endl;
+    } else {
+      cerr << "Must provide --type (info, log, remove, export, import, list)"
+       << std::endl;
+      usage(desc);
     }
   } else {
     cerr << "PG '" << pgid << "' not found" << std::endl;