]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kv/LevelDBStore: log leveldb to ceph log 6921/head
authorSage Weil <sage@redhat.com>
Tue, 15 Dec 2015 02:02:52 +0000 (21:02 -0500)
committerSage Weil <sage@redhat.com>
Tue, 15 Dec 2015 02:03:05 +0000 (21:03 -0500)
This greatly eases debugging, and avoids the unbounded growth of
the leveldb LOG file.

Signed-off-by: Sage Weil <sage@redhat.com>
src/common/config_opts.h
src/kv/LevelDBStore.cc
src/kv/LevelDBStore.h

index 9781da67d980b8f2032421ec65fe69b1c3a40203..75dcb8a8701ae51a35ddef02b7c6952348f616e7 100644 (file)
@@ -138,6 +138,7 @@ SUBSYS(xio, 1, 5)
 SUBSYS(compressor, 1, 5)
 SUBSYS(newstore, 1, 5)
 SUBSYS(rocksdb, 4, 5)
+SUBSYS(leveldb, 4, 5)
 
 OPTION(key, OPT_STR, "")
 OPTION(keyfile, OPT_STR, "")
@@ -747,6 +748,7 @@ OPTION(threadpool_default_timeout, OPT_INT, 60)
 // default wait time for an empty queue before pinging the hb timeout
 OPTION(threadpool_empty_queue_max_wait, OPT_INT, 2)
 
+OPTION(leveldb_log_to_ceph_log, OPT_BOOL, true)
 OPTION(leveldb_write_buffer_size, OPT_U64, 8 *1024*1024) // leveldb write buffer size
 OPTION(leveldb_cache_size, OPT_U64, 128 *1024*1024) // leveldb cache size
 OPTION(leveldb_block_size, OPT_U64, 0) // leveldb block size
index 2db6dc94ed7407eafe72eaaf576dfe8eee426319..481fbf16d044b4648f4b873c447fa67de9939641 100644 (file)
@@ -11,6 +11,34 @@ using std::string;
 #include "common/debug.h"
 #include "common/perf_counters.h"
 
+#define dout_subsys ceph_subsys_leveldb
+#undef dout_prefix
+#define dout_prefix *_dout << "leveldb: "
+
+class CephLevelDBLogger : public leveldb::Logger {
+  CephContext *cct;
+public:
+  CephLevelDBLogger(CephContext *c) : cct(c) {
+    cct->get();
+  }
+  ~CephLevelDBLogger() {
+    cct->put();
+  }
+
+  // Write an entry to the log file with the specified format.
+  void Logv(const char* format, va_list ap) {
+    dout(1);
+    char buf[65536];
+    vsnprintf(buf, sizeof(buf), format, ap);
+    *_dout << buf << dendl;
+  }
+};
+
+leveldb::Logger *create_leveldb_ceph_logger()
+{
+  return new CephLevelDBLogger(g_ceph_context);
+}
+
 int LevelDBStore::init(string option_str)
 {
   // init defaults.  caller can override these if they want
@@ -62,6 +90,11 @@ int LevelDBStore::do_open(ostream &out, bool create_if_missing)
   ldoptions.paranoid_checks = options.paranoid_checks;
   ldoptions.create_if_missing = create_if_missing;
 
+  if (g_conf->leveldb_log_to_ceph_log) {
+    ceph_logger = new CephLevelDBLogger(g_ceph_context);
+    ldoptions.info_log = ceph_logger;
+  }
+  
   if (options.log_file.length()) {
     leveldb::Env *env = leveldb::Env::Default();
     env->NewLogger(options.log_file, &ldoptions.info_log);
@@ -110,6 +143,7 @@ LevelDBStore::~LevelDBStore()
 {
   close();
   delete logger;
+  delete ceph_logger;
 
   // Ensure db is destroyed before dependent db_cache and filterpolicy
   db.reset();
index 2ce421c2fdc5423558ffc8a7ac9fd8274d2f60ce..6ffcb62da80834aacaa3a59c4197da46ca4babfd 100644 (file)
@@ -45,12 +45,17 @@ enum {
   l_leveldb_last,
 };
 
+extern leveldb::Logger *create_leveldb_ceph_logger();
+
+class CephLevelDBLogger;
+
 /**
  * Uses LevelDB to implement the KeyValueDB interface
  */
 class LevelDBStore : public KeyValueDB {
   CephContext *cct;
   PerfCounters *logger;
+  CephLevelDBLogger *ceph_logger;
   string path;
   boost::scoped_ptr<leveldb::Cache> db_cache;
 #ifdef HAVE_LEVELDB_FILTER_POLICY
@@ -148,6 +153,7 @@ public:
   LevelDBStore(CephContext *c, const string &path) :
     cct(c),
     logger(NULL),
+    ceph_logger(NULL),
     path(path),
     db_cache(NULL),
 #ifdef HAVE_LEVELDB_FILTER_POLICY