From 7d08249b1996961bc17ad44a8c81a435d5808000 Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Mon, 12 Aug 2013 10:26:29 -0700 Subject: ceph_test_store_tool: add 'set prefix key' feature Allow reading from a file. See --help for more info. Signed-off-by: Joao Eduardo Luis --- src/Makefile.am | 2 +- .../ObjectMap/test_store_tool/test_store_tool.cc | 56 ++++++++++++++++++++-- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index de760788958..09a7c216244 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1097,7 +1097,7 @@ ceph_test_keyvaluedb_iterators_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} ${ bin_DEBUGPROGRAMS += ceph_test_keyvaluedb_iterators ceph_test_store_tool_SOURCES = test/ObjectMap/test_store_tool/test_store_tool.cc \ - os/LevelDBStore.cc + os/LevelDBStore.cc common/strtol.cc ceph_test_store_tool_LDFLAGS = ${AM_LDFLAGS} ceph_test_store_tool_LDADD = $(LIBOS_LDA) $(LIBGLOBAL_LDA) ceph_test_store_tool_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS} diff --git a/src/test/ObjectMap/test_store_tool/test_store_tool.cc b/src/test/ObjectMap/test_store_tool/test_store_tool.cc index ace91220df6..9146db89aaa 100644 --- a/src/test/ObjectMap/test_store_tool/test_store_tool.cc +++ b/src/test/ObjectMap/test_store_tool/test_store_tool.cc @@ -24,6 +24,7 @@ #include "common/errno.h" #include "common/safe_io.h" #include "common/config.h" +#include "common/strtol.h" using namespace std; @@ -79,7 +80,7 @@ class StoreTool assert(!prefix.empty() && !key.empty()); map result; - set keys; + std::set keys; keys.insert(key); db->get(prefix, keys, &result); @@ -90,6 +91,18 @@ class StoreTool exists = false; return bufferlist(); } + + bool set(const string &prefix, const string &key, bufferlist &val) { + assert(!prefix.empty()); + assert(!key.empty()); + assert(val.length() > 0); + + KeyValueDB::Transaction tx = db->get_transaction(); + tx->set(prefix, key, val); + int ret = db->submit_transaction_sync(tx); + + return (ret == 0); + } }; void usage(const char *pname) @@ -100,7 +113,7 @@ void usage(const char *pname) << " list [prefix]\n" << " exists [key]\n" << " get \n" - << " verify \n" + << " set [ver |in ]\n" << std::endl; } @@ -171,8 +184,43 @@ int main(int argc, const char *argv[]) bl.hexdump(os); std::cout << os.str() << std::endl; - } else if (cmd == "verify") { - assert(0); + } else if (cmd == "set") { + if (argc < 7) { + usage(argv[0]); + return 1; + } + string prefix(argv[3]); + string key(argv[4]); + string subcmd(argv[5]); + + bufferlist val; + string errstr; + if (subcmd == "ver") { + version_t v = (version_t) strict_strtoll(argv[6], 10, &errstr); + if (!errstr.empty()) { + std::cerr << "error reading version: " << errstr << std::endl; + return 1; + } + ::encode(v, val); + } else if (subcmd == "in") { + int ret = val.read_file(argv[6], &errstr); + if (ret < 0 || !errstr.empty()) { + std::cerr << "error reading file: " << errstr << std::endl; + return 1; + } + } else { + std::cerr << "unrecognized subcommand '" << subcmd << "'" << std::endl; + usage(argv[0]); + return 1; + } + + bool ret = st.set(prefix, key, val); + if (!ret) { + std::cerr << "error setting (" + << prefix << "," << key << ")" << std::endl; + return 1; + } + } else { std::cerr << "Unrecognized command: " << cmd << std::endl; return 1; -- cgit v1.2.1