OPTION(bluestore_log_collection_list_age, OPT_DOUBLE)
OPTION(bluestore_volume_selection_policy, OPT_STR)
OPTION(bluestore_volume_selection_reserved_factor, OPT_DOUBLE)
+OPTION(bluestore_volume_selection_reserved, OPT_INT)
OPTION(kstore_max_ops, OPT_U64)
OPTION(kstore_max_bytes, OPT_U64)
.set_default(2.0)
.set_description("DB level size multiplier. Determines amount of space at DB device to bar from the usage when 'use some extra' policy is in action. Reserved size is determined as sum(L_max_size[0], L_max_size[L-1]) + L_max_size[L] * this_factor"),
+ Option("bluestore_volume_selection_reserved", Option::TYPE_INT, Option::LEVEL_ADVANCED)
+ .set_flag(Option::FLAG_STARTUP)
+ .set_default(0)
+ .set_description("Space reserved at DB device and not allowed for 'use some extra' policy usage. Overrides 'bluestore_volume_selection_reserved_factor' setting and introduces straightforward limit."),
+
// -----------------------------------------
// kstore
uint64_t _level_base,
uint64_t _level_multiplier,
double reserved_factor,
+ uint64_t reserved,
bool new_pol)
{
l_totals[LEVEL_WAL - LEVEL_FIRST] = _wal_total;
}
// Calculating how much extra space is available at DB volume.
- // Which is equal to
- // DB size - sum_max_level_size(0, L-1) - max_level_size(L) * reserved_factor
- uint64_t prev_levels = _level0_size;
- uint64_t cur_level = _level_base;
- uint64_t cur_threshold = 0;
- do {
- uint64_t next_level = cur_level * _level_multiplier;
- uint64_t next_threshold = prev_levels + cur_level + next_level * reserved_factor;
- if (_db_total <= next_threshold) {
- db_avail4slow = cur_threshold ? _db_total - cur_threshold : 0;
- break;
- } else {
- prev_levels += cur_level;
- cur_level = next_level;
- cur_threshold = next_threshold;
- }
- } while (true);
+ // Depending on the presence of explicit reserved size specification it might be either
+ // * DB volume size - reserved
+ // or
+ // * DB volume size - sum_max_level_size(0, L-1) - max_level_size(L) * reserved_factor
+ if (!reserved) {
+ uint64_t prev_levels = _level0_size;
+ uint64_t cur_level = _level_base;
+ uint64_t cur_threshold = 0;
+ do {
+ uint64_t next_level = cur_level * _level_multiplier;
+ uint64_t next_threshold = prev_levels + cur_level + next_level * reserved_factor;
+ if (_db_total <= next_threshold) {
+ db_avail4slow = cur_threshold ? _db_total - cur_threshold : 0;
+ break;
+ } else {
+ prev_levels += cur_level;
+ cur_level = next_level;
+ cur_threshold = next_threshold;
+ }
+ } while (true);
+ } else {
+ db_avail4slow = _db_total - reserved;
+ }
}
void* get_hint_by_device(uint8_t dev) const override {