0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-27 07:54:05 +01:00

ircd::db: Add cache entry iteration (experimental).

This commit is contained in:
Jason Volk 2018-05-14 16:53:28 -07:00
parent 8f40fd574a
commit 9e0acde5cf
2 changed files with 49 additions and 0 deletions

View file

@ -36,4 +36,9 @@ namespace ircd::db
// Test if key exists // Test if key exists
bool exists(rocksdb::Cache &, const string_view &key); bool exists(rocksdb::Cache &, const string_view &key);
bool exists(rocksdb::Cache *const &, const string_view &key); bool exists(rocksdb::Cache *const &, const string_view &key);
// Iterate the cache entries.
using cache_closure = std::function<void (const string_view &, const size_t &)>;
void for_each(rocksdb::Cache &, const cache_closure &);
void for_each(rocksdb::Cache *const &, const cache_closure &);
} }

View file

@ -5074,6 +5074,50 @@ ircd::db::_seek_(rocksdb::Iterator &it,
// cache.h // cache.h
// //
void
ircd::db::for_each(rocksdb::Cache *const &cache,
const cache_closure &closure)
{
if(cache)
for_each(*cache, closure);
}
void
ircd::db::for_each(rocksdb::Cache &cache,
const cache_closure &closure)
{
thread_local rocksdb::Cache *_cache;
_cache = &cache;
thread_local const cache_closure *_closure;
_closure = &closure;
cache.ApplyToAllCacheEntries([]
(void *const data, const size_t charge)
{
assert(_cache);
assert(_closure);
auto *const &handle
{
reinterpret_cast<rocksdb::Cache::Handle *>(data)
};
const void *const &value
{
_cache->Value(handle)
};
assert(value);
const auto &s
{
*reinterpret_cast<const rocksdb::Slice *>(value)
};
(*_closure)(slice(s), charge);
},
false);
}
bool bool
ircd::db::exists(rocksdb::Cache *const &cache, ircd::db::exists(rocksdb::Cache *const &cache,
const string_view &key) const string_view &key)