]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/kv/rocksdb_cache/ShardedCache.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / kv / rocksdb_cache / ShardedCache.h
index 4d64893ab1c7bc889d646f66ee84374e8626f1e5..0ed692233f1a73e1bd9fb1d2ffa51d5ed35740f0 100644 (file)
@@ -14,6 +14,7 @@
 #include <string>
 #include <mutex>
 
+#include "rocksdb/version.h"
 #include "rocksdb/cache.h"
 #include "include/ceph_hash.h"
 #include "common/PriorityCache.h"
 #ifndef CACHE_LINE_SIZE
 #define CACHE_LINE_SIZE 64 // XXX arch-specific define 
 #endif
-#define ROCKSDB_PRIszt "zu"
 
 namespace rocksdb_cache {
 
+using DeleterFn = void (*)(const rocksdb::Slice& key, void* value);
+
 // Single cache shard interface.
 class CacheShard {
  public:
@@ -34,7 +36,7 @@ class CacheShard {
 
   virtual rocksdb::Status Insert(const rocksdb::Slice& key, uint32_t hash, void* value,
                                  size_t charge,
-                                 void (*deleter)(const rocksdb::Slice& key, void* value),
+                                 DeleterFn deleter,
                                  rocksdb::Cache::Handle** handle, rocksdb::Cache::Priority priority) = 0;
   virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, uint32_t hash) = 0;
   virtual bool Ref(rocksdb::Cache::Handle* handle) = 0;
@@ -44,10 +46,15 @@ class CacheShard {
   virtual void SetStrictCapacityLimit(bool strict_capacity_limit) = 0;
   virtual size_t GetUsage() const = 0;
   virtual size_t GetPinnedUsage() const = 0;
-  virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
-                                      bool thread_safe) = 0;
+  virtual void ApplyToAllCacheEntries(
+    const std::function<void(const rocksdb::Slice& key,
+                             void* value,
+                             size_t charge,
+                             DeleterFn)>& callback,
+    bool thread_safe) = 0;
   virtual void EraseUnRefEntries() = 0;
   virtual std::string GetPrintableOptions() const { return ""; }
+  virtual DeleterFn GetDeleter(rocksdb::Cache::Handle* handle) const = 0;
 };
 
 // Generic cache interface which shards cache by hash of keys. 2^num_shard_bits
@@ -57,37 +64,49 @@ class ShardedCache : public rocksdb::Cache, public PriorityCache::PriCache {
  public:
   ShardedCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit);
   virtual ~ShardedCache() = default;
+  // rocksdb::Cache
   virtual const char* Name() const override = 0;
-  virtual CacheShard* GetShard(int shard) = 0;
-  virtual const CacheShard* GetShard(int shard) const = 0;
-  virtual void* Value(Handle* handle) override = 0;
-  virtual size_t GetCharge(Handle* handle) const = 0;
-  virtual uint32_t GetHash(Handle* handle) const = 0;
-  virtual void DisownData() override = 0;
-
-  virtual void SetCapacity(size_t capacity) override;
-  virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
-
   virtual rocksdb::Status Insert(const rocksdb::Slice& key, void* value, size_t charge,
-                                 void (*deleter)(const rocksdb::Slice& key, void* value),
+                                 DeleterFn,
                                  rocksdb::Cache::Handle** handle, Priority priority) override;
   virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats) override;
   virtual bool Ref(rocksdb::Cache::Handle* handle) override;
   virtual bool Release(rocksdb::Cache::Handle* handle, bool force_erase = false) override;
+  virtual void* Value(Handle* handle) override = 0;
   virtual void Erase(const rocksdb::Slice& key) override;
   virtual uint64_t NewId() override;
-  virtual size_t GetCapacity() const override;
+  virtual void SetCapacity(size_t capacity) override;
+  virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
   virtual bool HasStrictCapacityLimit() const override;
+  virtual size_t GetCapacity() const override;
   virtual size_t GetUsage() const override;
   virtual size_t GetUsage(rocksdb::Cache::Handle* handle) const override;
   virtual size_t GetPinnedUsage() const override;
+  virtual size_t GetCharge(Handle* handle) const = 0;
+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
+  virtual DeleterFn GetDeleter(Handle* handle) const override;
+#endif
+  virtual void DisownData() override = 0;
+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
+  virtual void ApplyToAllEntries(
+      const std::function<void(const rocksdb::Slice& key, void* value, size_t charge,
+                               DeleterFn deleter)>& callback,
+      const ApplyToAllEntriesOptions& opts) override;
+#else
   virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
                                       bool thread_safe) override;
+#endif
   virtual void EraseUnRefEntries() override;
   virtual std::string GetPrintableOptions() const override;
+  virtual CacheShard* GetShard(int shard) = 0;
+  virtual const CacheShard* GetShard(int shard) const = 0;
+  virtual uint32_t GetHash(Handle* handle) const = 0;
 
   int GetNumShardBits() const { return num_shard_bits_; }
 
+  virtual uint32_t get_bin_count() const = 0;
+  virtual void set_bin_count(uint32_t count) = 0;
+
   // PriCache
   virtual int64_t get_cache_bytes(PriorityCache::Priority pri) const {
     return cache_bytes[pri];
@@ -111,6 +130,42 @@ class ShardedCache : public rocksdb::Cache, public PriorityCache::PriCache {
   }
   virtual void set_cache_ratio(double ratio) {
     cache_ratio = ratio;
+  }
+    virtual uint64_t get_bins(PriorityCache::Priority pri) const {
+    if (pri > PriorityCache::Priority::PRI0 &&
+        pri < PriorityCache::Priority::LAST) {
+      return bins[pri];
+    }
+    return 0;
+  }
+  virtual void set_bins(PriorityCache::Priority pri, uint64_t end_bin) {
+    if (pri <= PriorityCache::Priority::PRI0 ||
+        pri >= PriorityCache::Priority::LAST) {
+      return;
+    }
+    bins[pri] = end_bin;
+    uint64_t max = 0;
+    for (int pri = 1; pri < PriorityCache::Priority::LAST; pri++) {
+      if (bins[pri] > max) {
+        max = bins[pri];
+      }
+    }
+    set_bin_count(max);
+  }
+  virtual void import_bins(const std::vector<uint64_t> &bins_v) {
+    uint64_t max = 0;
+    for (int pri = 1; pri < PriorityCache::Priority::LAST; pri++) {
+      unsigned i = (unsigned) pri - 1;
+      if (i < bins_v.size()) {
+        bins[pri] = bins_v[i];
+        if (bins[pri] > max) {
+          max = bins[pri];
+        }
+      } else {
+        bins[pri] = 0;
+      }
+    }
+    set_bin_count(max);
   }
   virtual std::string get_cache_name() const = 0;
 
@@ -120,11 +175,12 @@ class ShardedCache : public rocksdb::Cache, public PriorityCache::PriCache {
 //    return Hash(s.data(), s.size(), 0);
   }
 
-  uint32_t Shard(uint32_t hash) {
+  uint32_t Shard(uint32_t hash) const {
     // Note, hash >> 32 yields hash in gcc, not the zero we expect!
     return (num_shard_bits_ > 0) ? (hash >> (32 - num_shard_bits_)) : 0;
   }
 
+  uint64_t bins[PriorityCache::Priority::LAST+1] = {0};
   int64_t cache_bytes[PriorityCache::Priority::LAST+1] = {0};
   double cache_ratio = 0;