From: xinxin shu Date: Mon, 25 May 2015 00:34:11 +0000 (+0800) Subject: dump keyvaluestore transaction to a file X-Git-Tag: v9.0.3~190^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0a98b0210d29e5bd10d7529cff2d976d6fb8517a;p=ceph.git dump keyvaluestore transaction to a file Signed-off-by: xinxin shu --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index e79eeaab801f..1fc24e810bda 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -851,6 +851,7 @@ OPTION(keyvaluestore_default_strip_size, OPT_INT, 4096) // Only affect new objec OPTION(keyvaluestore_max_expected_write_size, OPT_U64, 1ULL << 24) // bytes OPTION(keyvaluestore_header_cache_size, OPT_INT, 4096) // Header cache size OPTION(keyvaluestore_backend, OPT_STR, "leveldb") +OPTION(keyvaluestore_dump_file, OPT_STR, "") // file onto which store transaction dumps // max bytes to search ahead in journal searching for corruption OPTION(journal_max_corrupt_search, OPT_U64, 10<<20) diff --git a/src/os/KeyValueStore.cc b/src/os/KeyValueStore.cc index 02303a908284..19fbd3f13e52 100644 --- a/src/os/KeyValueStore.cc +++ b/src/os/KeyValueStore.cc @@ -538,7 +538,9 @@ KeyValueStore::KeyValueStore(const std::string &base, m_keyvaluestore_queue_max_bytes(g_conf->keyvaluestore_queue_max_bytes), m_keyvaluestore_strip_size(g_conf->keyvaluestore_default_strip_size), m_keyvaluestore_max_expected_write_size(g_conf->keyvaluestore_max_expected_write_size), - do_update(do_update) + do_update(do_update), + m_keyvaluestore_do_dump(false), + m_keyvaluestore_dump_fmt(true) { ostringstream oss; oss << basedir << "/current"; @@ -571,6 +573,10 @@ KeyValueStore::~KeyValueStore() g_ceph_context->get_perfcounters_collection()->remove(perf_logger); delete perf_logger; + + if (m_keyvaluestore_do_dump) { + dump_stop(); + } } int KeyValueStore::statfs(struct statfs *buf) @@ -1010,6 +1016,8 @@ int KeyValueStore::queue_transactions(Sequencer *posr, list &tls, Op *o = build_op(tls, ondisk, onreadable, onreadable_sync, osd_op); op_queue_reserve_throttle(o, handle); + if (m_keyvaluestore_do_dump) + dump_transactions(o->tls, o->op, osr); dout(5) << "queue_transactions (trailing journal) " << " " << tls <keyvaluestore_default_strip_size; default_strip_size = m_keyvaluestore_strip_size; } + if (changed.count("keyvaluestore_dump_file")) { + if (conf->keyvaluestore_dump_file.length() && + conf->keyvaluestore_dump_file != "-") { + dump_start(conf->keyvaluestore_dump_file); + } else { + dump_stop(); + } + } +} + +void KeyValueStore::dump_start(const std::string file) +{ + dout(10) << "dump_start " << file << dendl; + if (m_keyvaluestore_do_dump) { + dump_stop(); + } + m_keyvaluestore_dump_fmt.reset(); + m_keyvaluestore_dump_fmt.open_array_section("dump"); + m_keyvaluestore_dump.open(file.c_str()); + m_keyvaluestore_do_dump = true; } +void KeyValueStore::dump_stop() +{ + dout(10) << "dump_stop" << dendl; + m_keyvaluestore_do_dump = false; + if (m_keyvaluestore_dump.is_open()) { + m_keyvaluestore_dump_fmt.close_section(); + m_keyvaluestore_dump_fmt.flush(m_keyvaluestore_dump); + m_keyvaluestore_dump.flush(); + m_keyvaluestore_dump.close(); + } +} void KeyValueStore::dump_transactions(list& ls, uint64_t seq, OpSequencer *osr) { + m_keyvaluestore_dump_fmt.open_array_section("transactions"); + unsigned trans_num = 0; + for (list::iterator i = ls.begin(); i != ls.end(); ++i, ++trans_num) { + m_keyvaluestore_dump_fmt.open_object_section("transaction"); + m_keyvaluestore_dump_fmt.dump_string("osr", osr->get_name()); + m_keyvaluestore_dump_fmt.dump_unsigned("seq", seq); + m_keyvaluestore_dump_fmt.dump_unsigned("trans_num", trans_num); + (*i)->dump(&m_keyvaluestore_dump_fmt); + m_keyvaluestore_dump_fmt.close_section(); + } + m_keyvaluestore_dump_fmt.close_section(); + m_keyvaluestore_dump_fmt.flush(m_keyvaluestore_dump); + m_keyvaluestore_dump.flush(); } diff --git a/src/os/KeyValueStore.h b/src/os/KeyValueStore.h index 376a37097ce3..8288acc01cbc 100644 --- a/src/os/KeyValueStore.h +++ b/src/os/KeyValueStore.h @@ -645,6 +645,8 @@ class KeyValueStore : public ObjectStore, ObjectMap::ObjectMapIterator get_omap_iterator(coll_t c, const ghobject_t &oid); + void dump_start(const std::string file); + void dump_stop(); void dump_transactions(list& ls, uint64_t seq, OpSequencer *osr); @@ -681,6 +683,9 @@ class KeyValueStore : public ObjectStore, int m_keyvaluestore_strip_size; uint64_t m_keyvaluestore_max_expected_write_size; int do_update; + bool m_keyvaluestore_do_dump; + std::ofstream m_keyvaluestore_dump; + JSONFormatter m_keyvaluestore_dump_fmt; static const string OBJECT_STRIP_PREFIX; static const string OBJECT_XATTR;