]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
kv: add per-prefix space estimation
authorSage Weil <sage@redhat.com>
Tue, 3 Oct 2017 03:17:54 +0000 (22:17 -0500)
committerSage Weil <sage@redhat.com>
Wed, 15 Aug 2018 22:18:43 +0000 (17:18 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/kv/KeyValueDB.h
src/kv/RocksDBStore.cc
src/kv/RocksDBStore.h

index 097fe12827804444adc7469315d59275f1707707..e8d7aced708a41b9d74677c26728010cb3626a7a 100644 (file)
@@ -418,6 +418,11 @@ public:
 
   virtual ~KeyValueDB() {}
 
+  /// estimate space utilization for a prefix (in bytes)
+  virtual int64_t estimate_prefix_size(const string& prefix) {
+    return 0;
+  }
+
   /// compact the underlying store
   virtual void compact() {}
 
index 928b4d915fb81ae74e4ed1e4217df5490e35da09..b59bb3dfeeae8771c4eec5ba582a97d57154275d 100644 (file)
@@ -678,6 +678,27 @@ void RocksDBStore::split_stats(const std::string &s, char delim, std::vector<std
     }
 }
 
+int64_t RocksDBStore::estimate_prefix_size(const string& prefix)
+{
+  auto cf = get_cf_handle(prefix);
+  uint64_t size = 0;
+  uint8_t flags =
+    //rocksdb::DB::INCLUDE_MEMTABLES |  // do not include memtables...
+    rocksdb::DB::INCLUDE_FILES;
+  if (cf) {
+    string start(1, '\x00');
+    string limit("\xff\xff\xff\xff");
+    rocksdb::Range r(start, limit);
+    db->GetApproximateSizes(cf, &r, 1, &size, flags);
+  } else {
+    string limit = prefix + "\xff\xff\xff\xff";
+    rocksdb::Range r(prefix, limit);
+    db->GetApproximateSizes(default_cf,
+                           &r, 1, &size, flags);
+  }
+  return size;
+}
+
 void RocksDBStore::get_statistics(Formatter *f)
 {
   if (!g_conf()->rocksdb_perf)  {
index 96058f04af9a26114d9e92ecf43182951a5b8781..08477dded929c668e8494163b89c38e1b56003a5 100644 (file)
@@ -192,6 +192,8 @@ public:
     return logger;
   }
 
+  int64_t estimate_prefix_size(const string& prefix) override;
+
   struct  RocksWBHandler: public rocksdb::WriteBatch::Handler {
     std::string seen ;
     int num_seen = 0;