--- ceph-17.2.6/src/kv/rocksdb_cache/ShardedCache.h.orig 2023-04-05 11:09:51.000000000 -0400 +++ ceph-17.2.6/src/kv/rocksdb_cache/ShardedCache.h 2023-04-21 16:22:26.665067333 -0400 @@ -15,7 +15,7 @@ #include #include "rocksdb/version.h" -#include "rocksdb/cache.h" +#include "rocksdb/advanced_cache.h" #include "include/ceph_hash.h" #include "common/PriorityCache.h" //#include "hash.h" @@ -26,7 +26,8 @@ namespace rocksdb_cache { -using DeleterFn = void (*)(const rocksdb::Slice& key, void* value); +// using DeleterFn = void (*)(const rocksdb::Slice& key, void* value); +using DeleterFn = void (*)(rocksdb::Cache::ObjectPtr obj, rocksdb::MemoryAllocator* allocator); // Single cache shard interface. class CacheShard { @@ -34,11 +35,19 @@ CacheShard() = default; virtual ~CacheShard() = default; - virtual rocksdb::Status Insert(const rocksdb::Slice& key, uint32_t hash, void* value, - size_t charge, - 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 rocksdb::Status Insert(const rocksdb::Slice& key, + rockdb::ObjectPtr obj, + const rocksdb::CacheItemHelper* helper, + size_t charge, + rocksdb:Handle** handle = nullptr, + Rocksdb::Priority priority = Rocksdb::Priority::LOW) + virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, + const rocksdb::CacheItemHelper* helper = nullptr, + rocksdb::CreateContext* create_context = nullptr, + rocksdb::Priority priority = rocksdb::Priority::LOW, + bool wait = true, + rocksdb::Statistics* stats = nullptr); + virtual bool Ref(rocksdb::Cache::Handle* handle) = 0; virtual bool Release(rocksdb::Cache::Handle* handle, bool force_erase = false) = 0; virtual void Erase(const rocksdb::Slice& key, uint32_t hash) = 0; @@ -68,8 +77,8 @@ virtual const char* Name() const override = 0; virtual rocksdb::Status Insert(const rocksdb::Slice& key, void* value, size_t charge, DeleterFn, - rocksdb::Cache::Handle** handle, Priority priority) override; - virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats) override; + rocksdb::Cache::Handle** handle, Priority priority); + virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats); 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; @@ -84,14 +93,17 @@ virtual size_t GetPinnedUsage() const override; virtual size_t GetCharge(Handle* handle) const = 0; #if (ROCKSDB_MAJOR >= 7 || (ROCKSDB_MAJOR == 6 && ROCKSDB_MINOR >= 22)) - virtual DeleterFn GetDeleter(Handle* handle) const override; + virtual DeleterFn GetDeleter(Handle* handle) const; #endif virtual void DisownData() override = 0; #if (ROCKSDB_MAJOR >= 7 || (ROCKSDB_MAJOR == 6 && ROCKSDB_MINOR >= 22)) + virtual const rocksdb::CacheItemHelper* GetCacheItemHelper(rocksdb::Cache::Handle* handle) const; virtual void ApplyToAllEntries( - const std::function& callback, - const ApplyToAllEntriesOptions& opts) override; + const std::function& callback, + const rocksdb::ApplyToAllEntriesOptions& opts); #else virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t), bool thread_safe) override; --- ceph-17.2.6/src/kv/RocksDBStore.cc.orig 2023-04-05 11:09:51.000000000 -0400 +++ ceph-17.2.6/src/kv/RocksDBStore.cc 2023-04-20 16:19:29.280669881 -0400 @@ -903,6 +903,19 @@ // base_name - name of column without shard suffix: "-"+number // options - additional options to apply // cf_opt - column family options to update + +rocksdb::Status GetColumnFamilyOptionsFromMap( + const rocksdb::ColumnFamilyOptions& base_options, + const std::unordered_map& opts_map, + rocksdb::ColumnFamilyOptions* new_options, bool input_strings_escaped, + bool ignore_unknown_options) { + rocksdb::ConfigOptions config_options; + config_options.ignore_unknown_options = ignore_unknown_options; + config_options.input_strings_escaped = input_strings_escaped; + return rocksdb::GetColumnFamilyOptionsFromMap(config_options, base_options, opts_map, + new_options); +} + int RocksDBStore::update_column_family_options(const std::string& base_name, const std::string& more_options, rocksdb::ColumnFamilyOptions* cf_opt) @@ -916,7 +929,7 @@ << " options=" << more_options << dendl; return r; } - status = rocksdb::GetColumnFamilyOptionsFromMap(*cf_opt, options_map, cf_opt); + status = GetColumnFamilyOptionsFromMap(*cf_opt, options_map, cf_opt, false, false); if (!status.ok()) { dout(5) << __func__ << " invalid column family optionsp; column family=" << base_name << " options=" << more_options << dendl; @@ -937,6 +950,20 @@ return 0; } +rocksdb::Status GetBlockBasedTableOptionsFromMap( + const rocksdb::BlockBasedTableOptions& table_options, + const std::unordered_map& opts_map, + rocksdb::BlockBasedTableOptions* new_table_options, bool input_strings_escaped, + bool ignore_unknown_options) { + rocksdb::ConfigOptions config_options; + config_options.input_strings_escaped = input_strings_escaped; + config_options.ignore_unknown_options = ignore_unknown_options; + config_options.invoke_prepare_options = false; + + return rocksdb::GetBlockBasedTableOptionsFromMap(config_options, table_options, + opts_map, new_table_options); +} + int RocksDBStore::apply_block_cache_options(const std::string& column_name, const std::string& block_cache_opt, rocksdb::ColumnFamilyOptions* cf_opt) @@ -981,7 +1008,7 @@ } rocksdb::BlockBasedTableOptions column_bbt_opts; - status = GetBlockBasedTableOptionsFromMap(bbt_opts, cache_options_map, &column_bbt_opts); + status = GetBlockBasedTableOptionsFromMap(bbt_opts, cache_options_map, &column_bbt_opts, false, false); if (!status.ok()) { dout(5) << __func__ << " invalid block cache options; column=" << column_name << " options=" << block_cache_opt << dendl; --- ceph-17.2.6/src/kv/rocksdb_cache/BinnedLRUCache.h.orig 2023-04-21 10:11:00.180387609 -0400 +++ ceph-17.2.6/src/kv/rocksdb_cache/BinnedLRUCache.h 2023-04-21 10:17:15.527816193 -0400 @@ -121,7 +121,7 @@ void Free() { ceph_assert((refs == 1 && InCache()) || (refs == 0 && !InCache())); if (deleter) { - (*deleter)(key(), value); + (*deleter)(this, nullptr); } delete[] key_data; delete this;