From 761ee7c6af8802ab6b668a0b7ccaa819b2764456 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Wed, 8 Feb 2017 09:40:49 -0800 Subject: [PATCH] tools: Add dump-headers command to ceph-osdomap-tool Signed-off-by: David Zafman (cherry picked from commit f4101591ad701a62fe027c4744ca8ea505f44bdc) Conflicts: src/os/filestore/DBObjectMap.h (trivial) --- src/os/filestore/DBObjectMap.cc | 38 +++++++++++++++++++++++++++++++++ src/os/filestore/DBObjectMap.h | 7 ++++++ src/tools/ceph_osdomap_tool.cc | 12 ++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/os/filestore/DBObjectMap.cc b/src/os/filestore/DBObjectMap.cc index e9d572ca9dd7b..ccc6bbf522607 100644 --- a/src/os/filestore/DBObjectMap.cc +++ b/src/os/filestore/DBObjectMap.cc @@ -1260,3 +1260,41 @@ int DBObjectMap::list_objects(vector *out) } return 0; } + +int DBObjectMap::list_object_headers(vector<_Header> *out) +{ + int error = 0; + KeyValueDB::Iterator iter = db->get_iterator(HOBJECT_TO_SEQ); + for (iter->seek_to_first(); iter->valid(); iter->next()) { + bufferlist bl = iter->value(); + bufferlist::iterator bliter = bl.begin(); + _Header header; + header.decode(bliter); + out->push_back(header); + while (header.parent) { + set to_get; + map got; + to_get.insert(HEADER_KEY); + db->get(sys_parent_prefix(header), to_get, &got); + if (got.empty()) { + dout(0) << "Missing: seq " << header.parent << dendl; + error = -ENOENT; + break; + } else { + bl = got.begin()->second; + bufferlist::iterator bliter = bl.begin(); + header.decode(bliter); + out->push_back(header); + } + } + } + return error; +} + +ostream& operator<<(ostream& out, const DBObjectMap::_Header& h) +{ + out << "seq=" << h.seq << " parent=" << h.parent + << " num_children=" << h.num_children + << " ghobject=" << h.oid; + return out; +} diff --git a/src/os/filestore/DBObjectMap.h b/src/os/filestore/DBObjectMap.h index e0860327a6905..26d435320f539 100644 --- a/src/os/filestore/DBObjectMap.h +++ b/src/os/filestore/DBObjectMap.h @@ -221,6 +221,11 @@ public: int list_objects(vector *objs ///< [out] objects ); + struct _Header; + // Util, get all object headers, there must be no other concurrent access + int list_object_headers(vector<_Header> *out ///< [out] headers + ); + ObjectMapIterator get_iterator(const ghobject_t &oid); static const string USER_PREFIX; @@ -531,4 +536,6 @@ private: WRITE_CLASS_ENCODER(DBObjectMap::_Header) WRITE_CLASS_ENCODER(DBObjectMap::State) +ostream& operator<<(ostream& out, const DBObjectMap::_Header& h); + #endif diff --git a/src/tools/ceph_osdomap_tool.cc b/src/tools/ceph_osdomap_tool.cc index 9eb7a8c939a33..269ff44643da6 100644 --- a/src/tools/ceph_osdomap_tool.cc +++ b/src/tools/ceph_osdomap_tool.cc @@ -35,7 +35,7 @@ int main(int argc, char **argv) { ("paranoid", "use paranoid checking") ("oid", po::value(&oid), "Restrict to this object id when dumping objects") ("command", po::value(&cmd), - "command arg is one of [dump-raw-keys, dump-raw-key-vals, dump-objects, dump-objects-with-keys, check], mandatory") + "command arg is one of [dump-raw-keys, dump-raw-key-vals, dump-objects, dump-objects-with-keys, check, dump-headers], mandatory") ; po::positional_options_description p; p.add("command", 1); @@ -155,6 +155,16 @@ int main(int argc, char **argv) { goto done; } std::cout << "check succeeded" << std::endl; + } else if (cmd == "dump-headers") { + vector headers; + r = omap.list_object_headers(&headers); + if (r < 0) { + std::cerr << "list_object_headers got: " << cpp_strerror(r) << std::endl; + r = 1; + goto done; + } + for (auto i : headers) + std::cout << i << std::endl; } else { std::cerr << "Did not recognize command " << cmd << std::endl; goto done; -- 2.39.5