0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-15 14:31:11 +01:00

ircd::db: Comment/improve descriptor/column options.

This commit is contained in:
Jason Volk 2018-04-17 15:28:08 -07:00
parent 3b7b6f815e
commit b95a588bc4
2 changed files with 65 additions and 12 deletions

View file

@ -17,13 +17,40 @@ struct ircd::db::database::descriptor
{
using typing = std::pair<std::type_index, std::type_index>;
/// User given name for this column. Must be consistent.
std::string name;
/// User given description of this column; not used by RocksDB
std::string explain;
/// Indicate key and value type.
typing type { typeid(string_view), typeid(string_view) };
/// RocksDB ColumnFamilyOptions string; can be used for items not
/// otherwise specified here.
std::string options {};
/// User given comparator. We can automatically set this value for
/// some types given for the type.first typeid; otherwise it must be
/// set for exotic/unsupported keys.
db::comparator cmp {};
/// User given prefix extractor.
db::prefix_transform prefix {};
/// Size of the LRU cache for uncompressed blocks
size_t cache_size { 16_MiB };
/// Size of the LRU cache for compressed blocks
size_t cache_size_comp { 8_MiB };
/// Bloom filter bits. Filter is still useful even if queries are expected
/// to always hit on this column; see `expect_queries_hit` option.
size_t bloom_bits { 10 };
/// Set this option to true if queries to this column are expected to
/// find keys that exist. This is useful for columns with keys that
/// were first found from values in another column, where if the first
/// column missed there'd be no reason to query this column.
bool expect_queries_hit { false };
};

View file

@ -930,16 +930,22 @@ ircd::db::database::column::column(database *const &d,
}
}
{
// If possible, deduce comparator based on type given in descriptor
if(!this->descriptor.cmp.less)
{
if(key_type == typeid(string_view))
this->cmp.user = cmp_string_view{};
else if(key_type == typeid(int64_t))
this->cmp.user = cmp_int64_t{};
else if(key_type == typeid(uint64_t))
this->cmp.user = cmp_uint64_t{};
else
throw error("column '%s' key type[%s] requires user supplied comparator",
this->name,
key_type.name());
throw error
{
"column '%s' key type[%s] requires user supplied comparator",
this->name,
key_type.name()
};
}
// Set the key comparator
@ -952,26 +958,46 @@ ircd::db::database::column::column(database *const &d,
&this->prefix, [](const rocksdb::SliceTransform *) {}
};
//if(d->mergeop->merger)
// this->options.merge_operator = d->mergeop;
//
// Table options
//
// Setup the cache for assets.
const auto &cache_size(this->descriptor.cache_size);
table_opts.block_cache = rocksdb::NewLRUCache(cache_size);
if(cache_size)
table_opts.block_cache = rocksdb::NewLRUCache(cache_size);
// Setup the cache for compressed assets.
const auto &cache_size_comp(this->descriptor.cache_size_comp);
table_opts.block_cache_compressed = rocksdb::NewLRUCache(cache_size_comp);
// Tickers::READ_AMP_TOTAL_READ_BYTES / Tickers::READ_AMP_ESTIMATE_USEFUL_BYTES
//table_opts.read_amp_bytes_per_bit = 8;
if(cache_size_comp)
table_opts.block_cache_compressed = rocksdb::NewLRUCache(cache_size_comp);
// Setup the bloom filter.
const auto &bloom_bits(this->descriptor.bloom_bits);
if(bloom_bits)
table_opts.filter_policy.reset(rocksdb::NewBloomFilterPolicy(bloom_bits, false));
// Tickers::READ_AMP_TOTAL_READ_BYTES / Tickers::READ_AMP_ESTIMATE_USEFUL_BYTES
//table_opts.read_amp_bytes_per_bit = 8;
this->options.table_factory.reset(rocksdb::NewBlockBasedTableFactory(table_opts));
//log.debug("'%s': Creating new column '%s'", d->name, this->name);
//throw_on_error(d->d->CreateColumnFamily(this->options, this->name, &this->handle));
//
// Misc options
//
// Set the compaction style; we don't override this in the descriptor yet.
this->options.compaction_style = rocksdb::kCompactionStyleLevel;
// Set the compaction priority; this should probably be in the descriptor
// but this is currently selected for the general matrix workload.
this->options.compaction_pri = rocksdb::CompactionPri::kOldestLargestSeqFirst;
// Set filter reductions for this column. This means we expect a key to exist.
this->options.optimize_filters_for_hits = this->descriptor.expect_queries_hit;
// Compression
this->options.compression = rocksdb::kSnappyCompression;
log.debug("schema '%s' declares column [%s => %s] cmp[%s] pfx[%s] lru:%zu:%zu bloom:%zu %s",
db::name(*d),