diff options
author | Joao Eduardo Luis <joao.luis@inktank.com> | 2013-10-13 13:44:29 +0100 |
---|---|---|
committer | Joao Eduardo Luis <joao.luis@inktank.com> | 2013-10-16 21:25:06 +0100 |
commit | 85914b27e67879e5d5b8f05c569919155b690d4f (patch) | |
tree | 801715a43bc1a5d14c4577ca15610896c8fd8055 | |
parent | da69fa09c8274585225471c68c1acc788a3881f4 (diff) | |
download | ceph-85914b27e67879e5d5b8f05c569919155b690d4f.tar.gz |
ceph-kvstore-tool: calc store crc
Reuse 'list()' function to traverse the store and calc not only version's
crcs, but also calc the store's crc.
Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
-rw-r--r-- | src/tools/ceph-kvstore-tool.cc | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/tools/ceph-kvstore-tool.cc b/src/tools/ceph-kvstore-tool.cc index 8fcf3f30e82..ffd462bbabd 100644 --- a/src/tools/ceph-kvstore-tool.cc +++ b/src/tools/ceph-kvstore-tool.cc @@ -39,7 +39,9 @@ class StoreTool db.reset(db_ptr); } - void list(const string &prefix, const bool do_crc) { + uint32_t traverse(const string &prefix, + const bool do_crc, + ostream *out) { KeyValueDB::WholeSpaceIterator iter = db->get_iterator(); if (prefix.empty()) @@ -47,18 +49,36 @@ class StoreTool else iter->seek_to_first(prefix); + uint32_t crc = -1; + while (iter->valid()) { pair<string,string> rk = iter->raw_key(); if (!prefix.empty() && (rk.first != prefix)) - break; + break; - std::cout << rk.first << ":" << rk.second; + if (out) + *out << rk.first << ":" << rk.second; if (do_crc) { - std::cout << " (" << iter->value().crc32c(0) << ")"; + bufferlist bl; + bl.append(rk.first); + bl.append(rk.second); + bl.append(iter->value()); + + crc = bl.crc32c(crc); + if (out) { + *out << " (" << bl.crc32c(0) << ")"; + } } - std::cout << std::endl; + if (out) + *out << std::endl; iter->next(); } + + return crc; + } + + void list(const string &prefix, const bool do_crc) { + traverse(prefix, do_crc, &std::cout); } bool exists(const string &prefix) { @@ -132,6 +152,7 @@ void usage(const char *pname) << " crc <prefix> <key>\n" << " get-size\n" << " set <prefix> <key> [ver <N>|in <file>]\n" + << " store-crc <path>\n" << std::endl; } @@ -260,6 +281,9 @@ int main(int argc, const char *argv[]) << prefix << "," << key << ")" << std::endl; return 1; } + } else if (cmd == "store-crc") { + uint32_t crc = st.traverse(string(), true, NULL); + std::cout << "store at '" << path << "' crc " << crc << std::endl; } else { std::cerr << "Unrecognized command: " << cmd << std::endl; |