SUBSYS(compressor, 1, 5)
SUBSYS(newstore, 1, 5)
SUBSYS(rocksdb, 4, 5)
+SUBSYS(leveldb, 4, 5)
OPTION(key, OPT_STR, "")
OPTION(keyfile, OPT_STR, "")
// 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
#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
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);
{
close();
delete logger;
+ delete ceph_logger;
// Ensure db is destroyed before dependent db_cache and filterpolicy
db.reset();
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
LevelDBStore(CephContext *c, const string &path) :
cct(c),
logger(NULL),
+ ceph_logger(NULL),
path(path),
db_cache(NULL),
#ifdef HAVE_LEVELDB_FILTER_POLICY