]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: dump MonitorDBStore transactions to file
authorSamuel Just <sam.just@inktank.com>
Thu, 2 May 2013 21:13:07 +0000 (14:13 -0700)
committerSage Weil <sage@inktank.com>
Wed, 8 May 2013 23:55:06 +0000 (16:55 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit 797089ef082b99910eebfd9454c03d1f027c93bb)

src/common/config_opts.h
src/mon/MonitorDBStore.h

index 687dea107a2d369e90a83da2db4fda883eb3f45c..bb0fea66604962978b72390e35dff0855d53dc5d 100644 (file)
@@ -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
index a138670df671f6e15396f04e7c1d7235cdacbd88..3b53a8be80d08c937903fb553f97b875a92cd07e 100644 (file)
@@ -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);
+  }
 
 };