]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/kv/rocksdb_cache/BinnedLRUCache.h
import ceph quincy 17.2.1
[ceph.git] / ceph / src / kv / rocksdb_cache / BinnedLRUCache.h
index 96023ce22f7edfc351ef9e4eb8d486c08b2acf9b..d6d109d9d962aa05f4d7da06a734c15e6da6943e 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <string>
 #include <mutex>
+#include <boost/circular_buffer.hpp>
 
 #include "ShardedCache.h"
 #include "common/autovector.h"
@@ -55,8 +56,9 @@ std::shared_ptr<rocksdb::Cache> NewBinnedLRUCache(
     double high_pri_pool_ratio = 0.0);
 
 struct BinnedLRUHandle {
+  std::shared_ptr<uint64_t> age_bin;
   void* value;
-  void (*deleter)(const rocksdb::Slice&, void* value);
+  DeleterFn deleter;
   BinnedLRUHandle* next_hash;
   BinnedLRUHandle* next;
   BinnedLRUHandle* prev;
@@ -171,7 +173,7 @@ class BinnedLRUHandleTable {
 // A single shard of sharded cache.
 class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
  public:
-  BinnedLRUCacheShard(size_t capacity, bool strict_capacity_limit,
+  BinnedLRUCacheShard(CephContext *c, size_t capacity, bool strict_capacity_limit,
                 double high_pri_pool_ratio);
   virtual ~BinnedLRUCacheShard();
 
@@ -189,7 +191,7 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
   // Like Cache methods, but with an extra "hash" parameter.
   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) override;
   virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, uint32_t hash) override;
@@ -205,13 +207,19 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
   virtual size_t GetUsage() const override;
   virtual size_t GetPinnedUsage() const override;
 
-  virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
-                                      bool thread_safe) override;
+  virtual void ApplyToAllCacheEntries(
+    const std::function<void(const rocksdb::Slice& key,
+                             void* value,
+                             size_t charge,
+                             DeleterFn)>& callback,
+    bool thread_safe) override;
 
   virtual void EraseUnRefEntries() override;
 
   virtual std::string GetPrintableOptions() const override;
 
+  virtual DeleterFn GetDeleter(rocksdb::Cache::Handle* handle) const override;
+
   void TEST_GetLRUList(BinnedLRUHandle** lru, BinnedLRUHandle** lru_low_pri);
 
   //  Retrieves number of elements in LRU, for unit test purpose only
@@ -224,7 +232,20 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
   // Retrieves high pri pool usage
   size_t GetHighPriPoolUsage() const;
 
+  // Rotate the bins
+  void shift_bins();
+
+  // Get the bin count
+  uint32_t get_bin_count() const;
+
+  // Set the bin count
+  void set_bin_count(uint32_t count);
+
+  // Get the byte counts for a range of age bins
+  uint64_t sum_bins(uint32_t start, uint32_t end) const;
+
  private:
+  CephContext *cct;
   void LRU_Remove(BinnedLRUHandle* e);
   void LRU_Insert(BinnedLRUHandle* e);
 
@@ -289,6 +310,9 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
   // We don't count mutex_ as the cache's internal state so semantically we
   // don't mind mutex_ invoking the non-const actions.
   mutable std::mutex mutex_;
+
+  // Circular buffer of byte counters for age binning
+  boost::circular_buffer<std::shared_ptr<uint64_t>> age_bins;
 };
 
 class BinnedLRUCache : public ShardedCache {
@@ -303,7 +327,9 @@ class BinnedLRUCache : public ShardedCache {
   virtual size_t GetCharge(Handle* handle) const override;
   virtual uint32_t GetHash(Handle* handle) const override;
   virtual void DisownData() override;
-
+#if (ROCKSDB_MAJOR >= 7 || (ROCKSDB_MAJOR == 6 && ROCKSDB_MINOR >= 22))
+  virtual DeleterFn GetDeleter(Handle* handle) const override;
+#endif
   //  Retrieves number of elements in LRU, for unit test purpose only
   size_t TEST_GetLRUSize();
   // Sets the high pri pool ratio
@@ -320,6 +346,11 @@ class BinnedLRUCache : public ShardedCache {
   virtual int64_t get_committed_size() const {
     return GetCapacity();
   }
+  virtual void shift_bins();
+  uint64_t sum_bins(uint32_t start, uint32_t end) const;
+  uint32_t get_bin_count() const;
+  void set_bin_count(uint32_t count);
+
   virtual std::string get_cache_name() const {
     return "RocksDB Binned LRU Cache";
   }