diff --git a/src/os/filestore/DBObjectMap.cc b/src/os/filestore/DBObjectMap.cc index 0e5debc419cef..62e5499079b32 100644 --- a/src/os/filestore/DBObjectMap.cc +++ b/src/os/filestore/DBObjectMap.cc @@ -1262,3 +1262,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 68d035cd9f897..8e1e6b8eb0982 100644 --- a/src/os/filestore/DBObjectMap.h +++ b/src/os/filestore/DBObjectMap.h @@ -222,6 +222,11 @@ class DBObjectMap : public ObjectMap { 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) override; static const string USER_PREFIX; @@ -533,4 +538,6 @@ class DBObjectMap : public ObjectMap { 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 eead17684e3e1..12ba7426e3dea 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;