From 43de5e4f089bcebb5aa25652bf2a1b3a5f47f405 Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Tue, 10 Apr 2012 12:07:47 +0100 Subject: [PATCH] FileStore: dumping transactions to a file Dump each queued transaction to a predefined file, specified with --filestore-dump-file, in JSON format. Signed-off-by: Joao Eduardo Luis --- src/common/config_opts.h | 2 ++ src/os/FileStore.cc | 66 +++++++++++++++++++++++++++++++++++++++- src/os/FileStore.h | 8 +++++ 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 32c7f1a6bbb08..e8bdbb17488d0 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -351,6 +351,8 @@ OPTION(filestore_merge_threshold, OPT_INT, 10) OPTION(filestore_split_multiple, OPT_INT, 2) OPTION(filestore_update_collections, OPT_BOOL, false) OPTION(filestore_blackhole, OPT_BOOL, false) // drop any new transactions on the floor +// file onto which store transaction dumps +OPTION(filestore_dump_file, OPT_STR, "") OPTION(journal_dio, OPT_BOOL, true) OPTION(journal_aio, OPT_BOOL, false) OPTION(journal_block_align, OPT_BOOL, true) diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 92b80b1c0c868..dabeaba611347 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -45,6 +45,7 @@ #endif // DARWIN +#include #include #include "FileStore.h" @@ -698,7 +699,9 @@ FileStore::FileStore(const std::string &base, const std::string &jdev) : m_filestore_queue_max_ops(g_conf->filestore_queue_max_ops), m_filestore_queue_max_bytes(g_conf->filestore_queue_max_bytes), m_filestore_queue_committing_max_ops(g_conf->filestore_queue_committing_max_ops), - m_filestore_queue_committing_max_bytes(g_conf->filestore_queue_committing_max_bytes) + m_filestore_queue_committing_max_bytes(g_conf->filestore_queue_committing_max_bytes), +// m_filestore_do_dump(!g_conf->filestore_dump_file.empty()), + m_filestore_dump_fmt(false) { ostringstream oss; oss << basedir << "/current"; @@ -737,6 +740,11 @@ FileStore::FileStore(const std::string &base, const std::string &jdev) : plb.add_u64_counter(l_os_j_full, "journal_full"); logger = plb.create_perf_counters(); + + if (!g_conf->filestore_dump_file.empty()) { + dump_start(g_conf->filestore_dump_file); +// m_filestore_dump.open(g_conf->filestore_dump_file.c_str()); + } } FileStore::~FileStore() @@ -744,6 +752,17 @@ FileStore::~FileStore() if (journal) journal->logger = NULL; delete logger; + + if (m_filestore_do_dump) { + dump_stop(); + } +/* + if (m_filestore_do_dump) { + m_filestore_dump_fmt.close_section(); + m_filestore_dump_fmt.flush(m_filestore_dump); + m_filestore_dump.flush(); + } + */ } static void get_attrname(const char *name, char *buf, int len) @@ -2205,6 +2224,13 @@ int FileStore::queue_transactions(Sequencer *posr, list &tls, dout(5) << "queue_transactions new " << *osr << "/" << osr->parent << dendl; } + if (m_filestore_do_dump) { + for (list::iterator it = tls.begin(); it != tls.end(); it++) { + Transaction *t = *it; + dump_transaction(t, osr); + } + } + if (journal && journal->is_writeable() && !m_filestore_journal_trailing) { Op *o = build_op(tls, onreadable, onreadable_sync, osd_op); op_queue_reserve_throttle(o); @@ -4536,3 +4562,41 @@ void FileStore::handle_conf_change(const struct md_config_t *conf, m_filestore_commit_timeout = conf->filestore_commit_timeout; } } + +void FileStore::dump_start(const std::string& file) { + if (m_filestore_do_dump) { + dump_stop(); + } + m_filestore_dump_fmt.reset(); + m_filestore_dump.open(file.c_str()); + m_filestore_do_dump = true; +} + +void FileStore::dump_stop() { + m_filestore_do_dump = false; + if (m_filestore_dump.is_open()) { + m_filestore_dump_fmt.flush(m_filestore_dump); + m_filestore_dump.flush(); + m_filestore_dump.close(); + } +} + +void +FileStore::dump_transaction(ObjectStore::Transaction *t, OpSequencer *osr) { + + /* test -- dump to dout */ + + /* + dout(0) << " transaction dump:\n"; + t->dump(*_dout); + *_dout << dendl; + */ + + m_filestore_dump_fmt.open_object_section("transaction"); + m_filestore_dump_fmt.dump_format("osr", "%x", osr); + t->dump(&m_filestore_dump_fmt); + m_filestore_dump_fmt.close_section(); + m_filestore_dump_fmt.flush(m_filestore_dump); + m_filestore_dump << "\n"; + m_filestore_dump.flush(); +} diff --git a/src/os/FileStore.h b/src/os/FileStore.h index 62430a5d67cb6..e4ee5c04946ab 100644 --- a/src/os/FileStore.h +++ b/src/os/FileStore.h @@ -33,6 +33,7 @@ #include #include #include +#include using namespace std; #include @@ -430,6 +431,10 @@ public: int _collection_move(coll_t c, coll_t ocid, const hobject_t& o, const SequencerPosition& spos); + void dump_start(const std::string& file); + void dump_stop(); + void dump_transaction(ObjectStore::Transaction *t, OpSequencer *osr); + private: // omap int _omap_clear(coll_t cid, const hobject_t &hoid); @@ -465,6 +470,9 @@ private: int m_filestore_queue_max_bytes; int m_filestore_queue_committing_max_ops; int m_filestore_queue_committing_max_bytes; + bool m_filestore_do_dump; + std::ofstream m_filestore_dump; + JSONFormatter m_filestore_dump_fmt; }; ostream& operator<<(ostream& out, const FileStore::OpSequencer& s); -- 2.39.5