summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-05-02 14:13:07 -0700
committerSage Weil <sage@inktank.com>2013-05-08 16:53:00 -0700
commit3b94f03ec58abe3d7a6d0359ff9b4d75826f3777 (patch)
tree77aad019c1960e17441047cb346ad51c0cf50672
parent9143d6d0d0ebaaee81622587dc21a3d562b05c9c (diff)
downloadceph-3b94f03ec58abe3d7a6d0359ff9b4d75826f3777.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.h5
-rw-r--r--src/mon/MonitorDBStore.h31
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);
+ }
};