mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ircd::db::database: Add custom allocator stub; apply per-cache allocators.
This commit is contained in:
parent
9f2bdd3ca2
commit
36a0394184
3 changed files with 107 additions and 4 deletions
|
@ -98,6 +98,7 @@ struct ircd::db::database
|
||||||
struct sst;
|
struct sst;
|
||||||
struct wal;
|
struct wal;
|
||||||
struct wal_filter;
|
struct wal_filter;
|
||||||
|
struct allocator;
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
uint64_t checkpoint;
|
uint64_t checkpoint;
|
||||||
|
@ -110,6 +111,7 @@ struct ircd::db::database
|
||||||
std::shared_ptr<struct events> events;
|
std::shared_ptr<struct events> events;
|
||||||
std::shared_ptr<struct mergeop> mergeop;
|
std::shared_ptr<struct mergeop> mergeop;
|
||||||
std::unique_ptr<struct wal_filter> wal_filter;
|
std::unique_ptr<struct wal_filter> wal_filter;
|
||||||
|
std::shared_ptr<struct allocator> allocator;
|
||||||
std::shared_ptr<rocksdb::SstFileManager> ssts;
|
std::shared_ptr<rocksdb::SstFileManager> ssts;
|
||||||
std::shared_ptr<rocksdb::Cache> row_cache;
|
std::shared_ptr<rocksdb::Cache> row_cache;
|
||||||
std::vector<descriptor> descriptors;
|
std::vector<descriptor> descriptors;
|
||||||
|
|
81
ircd/db.cc
81
ircd/db.cc
|
@ -1143,6 +1143,12 @@ try
|
||||||
{
|
{
|
||||||
std::make_unique<struct wal_filter>(this)
|
std::make_unique<struct wal_filter>(this)
|
||||||
}
|
}
|
||||||
|
,allocator
|
||||||
|
{
|
||||||
|
#ifdef IRCD_DB_HAS_ALLOCATOR
|
||||||
|
std::make_shared<struct allocator>(this)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
,ssts{rocksdb::NewSstFileManager
|
,ssts{rocksdb::NewSstFileManager
|
||||||
(
|
(
|
||||||
env.get(), // env
|
env.get(), // env
|
||||||
|
@ -1156,7 +1162,10 @@ try
|
||||||
)}
|
)}
|
||||||
,row_cache
|
,row_cache
|
||||||
{
|
{
|
||||||
std::make_shared<database::cache>(this, this->stats, this->name, 16_MiB)
|
std::make_shared<database::cache>
|
||||||
|
(
|
||||||
|
this, this->stats, this->allocator, this->name, 16_MiB
|
||||||
|
)
|
||||||
}
|
}
|
||||||
,descriptors
|
,descriptors
|
||||||
{
|
{
|
||||||
|
@ -1879,7 +1888,16 @@ ircd::db::database::column::column(database &d,
|
||||||
,cmp{this->d, this->descriptor->cmp}
|
,cmp{this->d, this->descriptor->cmp}
|
||||||
,prefix{this->d, this->descriptor->prefix}
|
,prefix{this->d, this->descriptor->prefix}
|
||||||
,cfilter{this, this->descriptor->compactor}
|
,cfilter{this, this->descriptor->compactor}
|
||||||
,stats{std::make_shared<struct database::stats>(this->d)}
|
,stats
|
||||||
|
{
|
||||||
|
std::make_shared<struct database::stats>(this->d)
|
||||||
|
}
|
||||||
|
,allocator
|
||||||
|
{
|
||||||
|
#ifdef IRCD_DB_HAS_ALLOCATOR
|
||||||
|
std::make_shared<struct allocator>(this->d, this)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
,handle
|
,handle
|
||||||
{
|
{
|
||||||
nullptr, [&d](rocksdb::ColumnFamilyHandle *const handle)
|
nullptr, [&d](rocksdb::ColumnFamilyHandle *const handle)
|
||||||
|
@ -2045,7 +2063,7 @@ ircd::db::database::column::column(database &d,
|
||||||
// Setup the cache for assets.
|
// Setup the cache for assets.
|
||||||
const auto &cache_size(this->descriptor->cache_size);
|
const auto &cache_size(this->descriptor->cache_size);
|
||||||
if(cache_size != 0)
|
if(cache_size != 0)
|
||||||
table_opts.block_cache = std::make_shared<database::cache>(this->d, this->stats, this->name, cache_size);
|
table_opts.block_cache = std::make_shared<database::cache>(this->d, this->stats, this->allocator, this->name, cache_size);
|
||||||
|
|
||||||
// RocksDB will create an 8_MiB block_cache if we don't create our own.
|
// RocksDB will create an 8_MiB block_cache if we don't create our own.
|
||||||
// To honor the user's desire for a zero-size cache, this must be set.
|
// To honor the user's desire for a zero-size cache, this must be set.
|
||||||
|
@ -2058,7 +2076,7 @@ ircd::db::database::column::column(database &d,
|
||||||
// Setup the cache for compressed assets.
|
// Setup the cache for compressed assets.
|
||||||
const auto &cache_size_comp(this->descriptor->cache_size_comp);
|
const auto &cache_size_comp(this->descriptor->cache_size_comp);
|
||||||
if(cache_size_comp != 0)
|
if(cache_size_comp != 0)
|
||||||
table_opts.block_cache_compressed = std::make_shared<database::cache>(this->d, this->stats, this->name, cache_size_comp);
|
table_opts.block_cache_compressed = std::make_shared<database::cache>(this->d, this->stats, this->allocator, this->name, cache_size_comp);
|
||||||
|
|
||||||
// Setup the bloom filter.
|
// Setup the bloom filter.
|
||||||
const auto &bloom_bits(this->descriptor->bloom_bits);
|
const auto &bloom_bits(this->descriptor->bloom_bits);
|
||||||
|
@ -3031,11 +3049,13 @@ ircd::db::database::cache::DEFAULT_HI_PRIO
|
||||||
|
|
||||||
ircd::db::database::cache::cache(database *const &d,
|
ircd::db::database::cache::cache(database *const &d,
|
||||||
std::shared_ptr<struct database::stats> stats,
|
std::shared_ptr<struct database::stats> stats,
|
||||||
|
std::shared_ptr<struct database::allocator> allocator,
|
||||||
std::string name,
|
std::string name,
|
||||||
const ssize_t &initial_capacity)
|
const ssize_t &initial_capacity)
|
||||||
:d{d}
|
:d{d}
|
||||||
,name{std::move(name)}
|
,name{std::move(name)}
|
||||||
,stats{std::move(stats)}
|
,stats{std::move(stats)}
|
||||||
|
,allocator{std::move(allocator)}
|
||||||
,c
|
,c
|
||||||
{
|
{
|
||||||
rocksdb::NewLRUCache
|
rocksdb::NewLRUCache
|
||||||
|
@ -3044,6 +3064,9 @@ ircd::db::database::cache::cache(database *const &d,
|
||||||
,DEFAULT_SHARD_BITS
|
,DEFAULT_SHARD_BITS
|
||||||
,DEFAULT_STRICT
|
,DEFAULT_STRICT
|
||||||
,DEFAULT_HI_PRIO
|
,DEFAULT_HI_PRIO
|
||||||
|
#ifdef IRCD_DB_HAS_ALLOCATOR
|
||||||
|
,d->allocator
|
||||||
|
#endif
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -3446,6 +3469,56 @@ const noexcept
|
||||||
return db::name(*d).c_str();
|
return db::name(*d).c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// database::allocator
|
||||||
|
//
|
||||||
|
#ifdef IRCD_DB_HAS_ALLOCATOR
|
||||||
|
|
||||||
|
ircd::db::database::allocator::allocator(database *const &d,
|
||||||
|
database::column *const &c)
|
||||||
|
:d{d}
|
||||||
|
,c{c}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::database::allocator::~allocator()
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
ircd::db::database::allocator::UsableSize(void *const ptr,
|
||||||
|
size_t allocation_size)
|
||||||
|
const noexcept
|
||||||
|
{
|
||||||
|
return allocation_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::db::database::allocator::Deallocate(void *const ptr)
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
std::free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
ircd::db::database::allocator::Allocate(size_t size)
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
return std::malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
ircd::db::database::allocator::Name()
|
||||||
|
const noexcept
|
||||||
|
{
|
||||||
|
return c? db::name(*c).c_str():
|
||||||
|
d? db::name(*d).c_str():
|
||||||
|
"unaffiliated";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif IRCD_DB_HAS_ALLOCATOR
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
|
|
@ -27,6 +27,11 @@ namespace ircd::db
|
||||||
#define IRCD_DB_HAS_CACHE_GETCHARGE
|
#define IRCD_DB_HAS_CACHE_GETCHARGE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ROCKSDB_MAJOR > 5 \
|
||||||
|
|| (ROCKSDB_MAJOR == 5 && ROCKSDB_MINOR >= 18)
|
||||||
|
#define IRCD_DB_HAS_ALLOCATOR
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ircd::db::database::cache final
|
struct ircd::db::database::cache final
|
||||||
:std::enable_shared_from_this<ircd::db::database::cache>
|
:std::enable_shared_from_this<ircd::db::database::cache>
|
||||||
,rocksdb::Cache
|
,rocksdb::Cache
|
||||||
|
@ -44,6 +49,7 @@ struct ircd::db::database::cache final
|
||||||
database *d;
|
database *d;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::shared_ptr<struct database::stats> stats;
|
std::shared_ptr<struct database::stats> stats;
|
||||||
|
std::shared_ptr<struct database::allocator> allocator;
|
||||||
std::shared_ptr<rocksdb::Cache> c;
|
std::shared_ptr<rocksdb::Cache> c;
|
||||||
|
|
||||||
const char *Name() const noexcept override;
|
const char *Name() const noexcept override;
|
||||||
|
@ -71,6 +77,7 @@ struct ircd::db::database::cache final
|
||||||
|
|
||||||
cache(database *const &,
|
cache(database *const &,
|
||||||
std::shared_ptr<struct database::stats>,
|
std::shared_ptr<struct database::stats>,
|
||||||
|
std::shared_ptr<struct database::allocator>,
|
||||||
std::string name,
|
std::string name,
|
||||||
const ssize_t &initial_capacity = -1);
|
const ssize_t &initial_capacity = -1);
|
||||||
|
|
||||||
|
@ -160,6 +167,7 @@ struct ircd::db::database::column final
|
||||||
prefix_transform prefix;
|
prefix_transform prefix;
|
||||||
compaction_filter cfilter;
|
compaction_filter cfilter;
|
||||||
std::shared_ptr<struct database::stats> stats;
|
std::shared_ptr<struct database::stats> stats;
|
||||||
|
std::shared_ptr<struct database::allocator> allocator;
|
||||||
rocksdb::BlockBasedTableOptions table_opts;
|
rocksdb::BlockBasedTableOptions table_opts;
|
||||||
custom_ptr<rocksdb::ColumnFamilyHandle> handle;
|
custom_ptr<rocksdb::ColumnFamilyHandle> handle;
|
||||||
|
|
||||||
|
@ -282,3 +290,23 @@ struct ircd::db::database::wal_filter
|
||||||
wal_filter(database *const &);
|
wal_filter(database *const &);
|
||||||
~wal_filter() noexcept;
|
~wal_filter() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef IRCD_DB_HAS_ALLOCATOR
|
||||||
|
/// Dynamic memory
|
||||||
|
struct ircd::db::database::allocator
|
||||||
|
:rocksdb::MemoryAllocator
|
||||||
|
{
|
||||||
|
database *d {nullptr};
|
||||||
|
database::column *c{nullptr};
|
||||||
|
|
||||||
|
const char *Name() const noexcept override;
|
||||||
|
void *Allocate(size_t) noexcept override;
|
||||||
|
void Deallocate(void *) noexcept override;
|
||||||
|
size_t UsableSize(void *, size_t) const noexcept override;
|
||||||
|
|
||||||
|
allocator(database *const &,
|
||||||
|
database::column *const & = nullptr);
|
||||||
|
|
||||||
|
~allocator() noexcept;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue