From 698423957cd32ca87280ddadcd2c72343960a125 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 14 Dec 2015 21:02:52 -0500 Subject: [PATCH] kv/LevelDBStore: log leveldb to ceph log This greatly eases debugging, and avoids the unbounded growth of the leveldb LOG file. Signed-off-by: Sage Weil --- src/common/config_opts.h | 2 ++ src/kv/LevelDBStore.cc | 34 ++++++++++++++++++++++++++++++++++ src/kv/LevelDBStore.h | 6 ++++++ 3 files changed, 42 insertions(+) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 9781da67d980..75dcb8a8701a 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -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 diff --git a/src/kv/LevelDBStore.cc b/src/kv/LevelDBStore.cc index 2db6dc94ed74..481fbf16d044 100644 --- a/src/kv/LevelDBStore.cc +++ b/src/kv/LevelDBStore.cc @@ -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(); diff --git a/src/kv/LevelDBStore.h b/src/kv/LevelDBStore.h index 2ce421c2fdc5..6ffcb62da808 100644 --- a/src/kv/LevelDBStore.h +++ b/src/kv/LevelDBStore.h @@ -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 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 -- 2.47.3