From: Samuel Just Date: Thu, 2 May 2013 21:13:07 +0000 (-0700) Subject: mon: dump MonitorDBStore transactions to file X-Git-Tag: v0.62~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6c1e4791782ce2b3e101ee80640d896bcda684de;p=ceph.git mon: dump MonitorDBStore transactions to file Signed-off-by: Samuel Just (cherry picked from commit 797089ef082b99910eebfd9454c03d1f027c93bb) --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 687dea107a2d..bb0fea666049 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 a138670df671..3b53a8be80d0 100644 --- a/src/mon/MonitorDBStore.h +++ b/src/mon/MonitorDBStore.h @@ -30,6 +30,8 @@ class MonitorDBStore { boost::scoped_ptr 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 compact_prefixes; for (list::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); + } };