]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/LevelDBStore: add perfcounters
authorSage Weil <sage@inktank.com>
Thu, 30 May 2013 21:57:42 +0000 (14:57 -0700)
committerSage Weil <sage@inktank.com>
Sun, 2 Jun 2013 21:09:51 +0000 (14:09 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 7802292e0a49be607d7ba139b44d5ea1f98e07e6)

src/mon/MonitorDBStore.h
src/os/FileStore.cc
src/os/LevelDBStore.cc
src/os/LevelDBStore.h

index 6fa7dcac35481a6d46afd3f574eeae7dc2ca3a43..a4aadc7161ab0a52572a484baf3a50fd0bf9aa77 100644 (file)
@@ -521,7 +521,7 @@ class MonitorDBStore
     os << path.substr(0, path.size() - pos) << "/store.db";
     string full_path = os.str();
 
-    LevelDBStore *db_ptr = new LevelDBStore(full_path);
+    LevelDBStore *db_ptr = new LevelDBStore(g_ceph_context, full_path);
     if (!db_ptr) {
       std::cout << __func__ << " error initializing level db back storage in "
                << full_path << std::endl;
index 140289babc469a5f994c6f7bf336b2dee41d0c25..fec058edd1775523486f95965f655f67638c4f55 100644 (file)
@@ -1648,7 +1648,7 @@ int FileStore::mount()
   }
 
   {
-    LevelDBStore *omap_store = new LevelDBStore(omap_dir);
+    LevelDBStore *omap_store = new LevelDBStore(g_ceph_context, omap_dir);
 
     omap_store->options.write_buffer_size = g_conf->osd_leveldb_write_buffer_size;
     omap_store->options.cache_size = g_conf->osd_leveldb_cache_size;
index 31807141c7875ac70b0e11e5425ad556e9cd8cc8..d883797f75d04816db63b7303ec69222e286033a 100644 (file)
@@ -8,6 +8,7 @@
 #include <tr1/memory>
 #include <errno.h>
 using std::string;
+#include "common/perf_counters.h"
 
 int LevelDBStore::init(ostream &out, bool create_if_missing)
 {
@@ -55,8 +56,60 @@ int LevelDBStore::init(ostream &out, bool create_if_missing)
   if (!status.ok()) {
     out << status.ToString() << std::endl;
     return -EINVAL;
-  } else
-    return 0;
+  }
+
+  PerfCountersBuilder plb(g_ceph_context, "leveldb", l_leveldb_first, l_leveldb_last);
+  plb.add_u64_counter(l_leveldb_gets, "leveldb_get");
+  plb.add_u64_counter(l_leveldb_txns, "leveldb_transaction");
+  plb.add_u64_counter(l_leveldb_compact, "leveldb_compact");
+  plb.add_u64_counter(l_leveldb_compact_range, "leveldb_compact_range");
+  plb.add_u64_counter(l_leveldb_compact_queue_merge, "leveldb_compact_queue_merge");
+  plb.add_u64(l_leveldb_compact_queue_len, "leveldb_compact_queue_len");
+  logger = plb.create_perf_counters();
+  cct->get_perfcounters_collection()->add(logger);
+  return 0;
+}
+
+LevelDBStore::~LevelDBStore()
+{
+  close();
+  delete logger;
+}
+
+void LevelDBStore::close()
+{
+  // stop compaction thread
+  compact_queue_lock.Lock();
+  if (compact_thread.is_started()) {
+    compact_queue_stop = true;
+    compact_queue_cond.Signal();
+    compact_queue_lock.Unlock();
+    compact_thread.join();
+  } else {
+    compact_queue_lock.Unlock();
+  }
+
+  cct->get_perfcounters_collection()->remove(logger);
+}
+
+int LevelDBStore::submit_transaction(KeyValueDB::Transaction t)
+{
+  LevelDBTransactionImpl * _t =
+    static_cast<LevelDBTransactionImpl *>(t.get());
+  leveldb::Status s = db->Write(leveldb::WriteOptions(), &(_t->bat));
+  logger->inc(l_leveldb_txns);
+  return s.ok() ? 0 : -1;
+}
+
+int LevelDBStore::submit_transaction_sync(KeyValueDB::Transaction t)
+{
+  LevelDBTransactionImpl * _t =
+    static_cast<LevelDBTransactionImpl *>(t.get());
+  leveldb::WriteOptions options;
+  options.sync = true;
+  leveldb::Status s = db->Write(options, &(_t->bat));
+  logger->inc(l_leveldb_txns);
+  return s.ok() ? 0 : -1;
 }
 
 void LevelDBStore::LevelDBTransactionImpl::set(
@@ -109,6 +162,7 @@ int LevelDBStore::get(
     } else if (!it->valid())
       break;
   }
+  logger->inc(l_leveldb_gets);
   return 0;
 }
 
@@ -141,6 +195,13 @@ int LevelDBStore::split_key(leveldb::Slice in, string *prefix, string *key)
   return 0;
 }
 
+void LevelDBStore::compact()
+{
+  logger->inc(l_leveldb_compact);
+  db->CompactRange(NULL, NULL);
+}
+
+
 void LevelDBStore::compact_thread_entry()
 {
   compact_queue_lock.Lock();
@@ -148,7 +209,9 @@ void LevelDBStore::compact_thread_entry()
     while (!compact_queue.empty()) {
       pair<string,string> range = compact_queue.front();
       compact_queue.pop_front();
+      logger->set(l_leveldb_compact_queue_len, compact_queue.size());
       compact_queue_lock.Unlock();
+      logger->inc(l_leveldb_compact_range);
       compact_range(range.first, range.second);
       compact_queue_lock.Lock();
       continue;
@@ -174,11 +237,13 @@ void LevelDBStore::compact_range_async(const string& start, const string& end)
       // merge with existing range to the right
       compact_queue.push_back(make_pair(start, p->second));
       compact_queue.erase(p);
+      logger->inc(l_leveldb_compact_queue_merge);
       break;
     } else if (p->second >= start && p->second < end) {
       // merge with existing range to the left
       compact_queue.push_back(make_pair(p->first, end));
       compact_queue.erase(p);
+      logger->inc(l_leveldb_compact_queue_merge);
       break;
     } else {
       ++p;
@@ -187,6 +252,7 @@ void LevelDBStore::compact_range_async(const string& start, const string& end)
   if (p == compact_queue.end()) {
     // no merge, new entry.
     compact_queue.push_back(make_pair(start, end));
+    logger->set(l_leveldb_compact_queue_len, compact_queue.size());
   }
   compact_queue_cond.Signal();
   if (!compact_thread.is_started()) {
index 556ba0388ee8652530ac9119e46398cd01b73235..f3809cf349654fc182151491951d32170b9ce2fe 100644 (file)
 #include "leveldb/filter_policy.h"
 #endif
 
+#include "common/ceph_context.h"
+
+class PerfCounters;
+
+enum {
+  l_leveldb_first = 34300,
+  l_leveldb_gets,
+  l_leveldb_txns,
+  l_leveldb_compact,
+  l_leveldb_compact_range,
+  l_leveldb_compact_queue_merge,
+  l_leveldb_compact_queue_len,
+  l_leveldb_last,
+};
+
 /**
  * Uses LevelDB to implement the KeyValueDB interface
  */
 class LevelDBStore : public KeyValueDB {
+  CephContext *cct;
+  PerfCounters *logger;
   string path;
   boost::scoped_ptr<leveldb::DB> db;
   boost::scoped_ptr<leveldb::Cache> db_cache;
@@ -60,9 +77,7 @@ class LevelDBStore : public KeyValueDB {
 
 public:
   /// compact the underlying leveldb store
-  void compact() {
-    db->CompactRange(NULL, NULL);
-  }
+  void compact();
 
   /// compact leveldb for all keys with a given prefix
   void compact_prefix(const string& prefix) {
@@ -117,7 +132,9 @@ public:
     {}
   } options;
 
-  LevelDBStore(const string &path) :
+  LevelDBStore(CephContext *c, const string &path) :
+    cct(c),
+    logger(NULL),
     path(path),
     db_cache(NULL),
 #ifdef HAVE_LEVELDB_FILTER_POLICY
@@ -129,17 +146,7 @@ public:
     options()
   {}
 
-  ~LevelDBStore() {
-    compact_queue_lock.Lock();
-    if (compact_thread.is_started()) {
-      compact_queue_stop = true;
-      compact_queue_cond.Signal();
-      compact_queue_lock.Unlock();
-      compact_thread.join();
-    } else {
-      compact_queue_lock.Unlock();
-    }
-  }
+  ~LevelDBStore();
 
   /// Opens underlying db
   int open(ostream &out) {
@@ -150,6 +157,8 @@ public:
     return init(out, true);
   }
 
+  void close();
+
   class LevelDBTransactionImpl : public KeyValueDB::TransactionImpl {
   public:
     leveldb::WriteBatch bat;
@@ -175,22 +184,8 @@ public:
       new LevelDBTransactionImpl(this));
   }
 
-  int submit_transaction(KeyValueDB::Transaction t) {
-    LevelDBTransactionImpl * _t =
-      static_cast<LevelDBTransactionImpl *>(t.get());
-    leveldb::Status s = db->Write(leveldb::WriteOptions(), &(_t->bat));
-    return s.ok() ? 0 : -1;
-  }
-
-  int submit_transaction_sync(KeyValueDB::Transaction t) {
-    LevelDBTransactionImpl * _t =
-      static_cast<LevelDBTransactionImpl *>(t.get());
-    leveldb::WriteOptions options;
-    options.sync = true;
-    leveldb::Status s = db->Write(options, &(_t->bat));
-    return s.ok() ? 0 : -1;
-  }
-
+  int submit_transaction(KeyValueDB::Transaction t);
+  int submit_transaction_sync(KeyValueDB::Transaction t);
   int get(
     const string &prefix,
     const std::set<string> &key,