]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kv: add per-prefix space estimation
authorSage Weil <sage@redhat.com>
Tue, 3 Oct 2017 03:17:54 +0000 (22:17 -0500)
committerJosh Durgin <jdurgin@redhat.com>
Wed, 3 Jul 2019 00:11:51 +0000 (20:11 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit c6da00b418764ca8fec248b768f3744ca1e655ed)

src/kv/KeyValueDB.h
src/kv/RocksDBStore.cc
src/kv/RocksDBStore.h

index 398f1d152b9823a17e23a1f73136d4bccd62b74e..131608f3d50c5ded66772c5a1939a8466b42806f 100644 (file)
@@ -419,6 +419,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 d47f6da37202576ccf3500a9aacd663d620224bc..8a0ef7478211928e5b187132630a43cd9e3adbf9 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 34470d5c963172b97398480509e883ad173231ee..fed340699ac12cf7fff9eeeb2c8b0d3509531ff0 100644 (file)
@@ -188,6 +188,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;