diff options
author | Samuel Just <sam.just@inktank.com> | 2013-05-02 14:13:07 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-08 16:55:06 -0700 |
commit | 6c1e4791782ce2b3e101ee80640d896bcda684de (patch) | |
tree | 12817fbd3f79d0829e6755a6948f2c72a34ac406 | |
parent | 5a631b852d915b062c90d56ee299e20f934a641d (diff) | |
download | ceph-6c1e4791782ce2b3e101ee80640d896bcda684de.tar.gz |
mon: dump MonitorDBStore transactions to file
Signed-off-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit 797089ef082b99910eebfd9454c03d1f027c93bb)
-rw-r--r-- | src/common/config_opts.h | 5 | ||||
-rw-r--r-- | src/mon/MonitorDBStore.h | 31 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 687dea107a2..bb0fea66604 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -180,6 +180,11 @@ OPTION(mon_sync_debug, OPT_BOOL, false) // enable sync-specific debug OPTION(mon_sync_debug_leader, OPT_INT, -1) // monitor to be used as the sync leader OPTION(mon_sync_debug_provider, OPT_INT, -1) // monitor to be used as the sync provider OPTION(mon_sync_debug_provider_fallback, OPT_INT, -1) // monitor to be used as fallback if sync provider fails + +// dump transactions +OPTION(mon_debug_dump_transactions, OPT_BOOL, true) +OPTION(mon_debug_dump_location, OPT_STR, "/var/log/ceph/$cluster-$name.tdump") + OPTION(mon_sync_leader_kill_at, OPT_INT, 0) // kill the sync leader at a specifc point in the work flow OPTION(mon_sync_provider_kill_at, OPT_INT, 0) // kill the sync provider at a specific point in the work flow OPTION(mon_sync_requester_kill_at, OPT_INT, 0) // kill the sync requester at a specific point in the work flow diff --git a/src/mon/MonitorDBStore.h b/src/mon/MonitorDBStore.h index a138670df67..3b53a8be80d 100644 --- a/src/mon/MonitorDBStore.h +++ b/src/mon/MonitorDBStore.h @@ -30,6 +30,8 @@ class MonitorDBStore { boost::scoped_ptr<LevelDBStore> db; + bool do_dump; + int dump_fd; public: @@ -185,6 +187,12 @@ class MonitorDBStore int apply_transaction(MonitorDBStore::Transaction& t) { KeyValueDB::Transaction dbt = db->get_transaction(); + if (do_dump) { + bufferlist bl; + t.encode(bl); + bl.write_fd(dump_fd); + } + list<string> compact_prefixes; for (list<Op>::iterator it = t.ops.begin(); it != t.ops.end(); ++it) { Op& op = *it; @@ -486,7 +494,8 @@ class MonitorDBStore db->compact_prefix(prefix); } - MonitorDBStore(const string& path) : db(0) { + MonitorDBStore(const string& path) : + db(0), do_dump(false), dump_fd(-1) { string::const_reverse_iterator rit; int pos = 0; for (rit = path.rbegin(); rit != path.rend(); ++rit, ++pos) { @@ -512,11 +521,27 @@ class MonitorDBStore db->options.max_open_files = g_conf->mon_leveldb_max_open_files; db->options.paranoid_checks = g_conf->mon_leveldb_paranoid; db->options.log_file = g_conf->mon_leveldb_log; + + if (g_conf->mon_debug_dump_transactions) { + do_dump = true; + dump_fd = ::open( + g_conf->mon_debug_dump_location.c_str(), + O_CREAT|O_APPEND|O_WRONLY, 0644); + if (!dump_fd) { + dump_fd = -errno; + derr << "Could not open log file, got " + << cpp_strerror(dump_fd) << dendl; + } + } } - MonitorDBStore(LevelDBStore *db_ptr) { + MonitorDBStore(LevelDBStore *db_ptr) : + db(0), do_dump(false), dump_fd(-1) { db.reset(db_ptr); } - ~MonitorDBStore() { } + ~MonitorDBStore() { + if (do_dump) + ::close(dump_fd); + } }; |