Skip to content

Commit

Permalink
CR#1
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuval-Ariel committed Dec 19, 2022
1 parent ffe9b9c commit 4998b24
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 145 deletions.
29 changes: 21 additions & 8 deletions db/column_family.cc
Original file line number Diff line number Diff line change
Expand Up @@ -882,19 +882,30 @@ int GetL0ThresholdSpeedupCompaction(int level0_file_num_compaction_trigger,
} // namespace

namespace {
const uint64_t Gb = 1073741824u;
const uint64_t Mb = 1048576u;
const uint64_t Gb = 1ull << 30;
const uint64_t Mb = 1ull << 20;
const uint64_t kMinWriteRate = 16 * 1024u; // Minimum write rate 16KB/s.
const int kMemtablePenalty = 10;
const int kNearStopPenalty = 4;
} // namespace

double ColumnFamilyData::TEST_CalculateWriteDelayDivider(
uint64_t compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options,
WriteStallCause& write_stall_cause) {
return CalculateWriteDelayDividerAndMaybeUpdateWriteStallCause(
compaction_needed_bytes, mutable_cf_options, write_stall_cause);
}

std::unique_ptr<WriteControllerToken> ColumnFamilyData::DynamicSetupDelay(
WriteController* write_controller, uint64_t compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options,
WriteStallCause& write_stall_cause) {
uint64_t max_write_rate = write_controller->max_delayed_write_rate();

const double rate_divider = CalculateWriteDelayDivider(
compaction_needed_bytes, write_stall_cause, mutable_cf_options);
const double rate_divider =
CalculateWriteDelayDividerAndMaybeUpdateWriteStallCause(
compaction_needed_bytes, mutable_cf_options, write_stall_cause);
assert(rate_divider >= 1);
auto write_rate = static_cast<uint64_t>(max_write_rate / rate_divider);
if (write_rate < kMinWriteRate) {
Expand Down Expand Up @@ -945,10 +956,11 @@ ColumnFamilyData::GetWriteStallConditionAndCause(
// Delay divider is by how much we divide the users delayed_write_rate.
// E.g. divider 10 will result in 10 Mb/s from users 100 Mb/s.
// The rate is reduced linearly according to the range from slowdown to stop.
double ColumnFamilyData::CalculateWriteDelayDivider(
double
ColumnFamilyData::CalculateWriteDelayDividerAndMaybeUpdateWriteStallCause(
uint64_t compaction_needed_bytes,
ColumnFamilyData::WriteStallCause& write_stall_cause,
const MutableCFOptions& mutable_cf_options) {
const MutableCFOptions& mutable_cf_options,
ColumnFamilyData::WriteStallCause& write_stall_cause) {
assert(current_ != nullptr);

const auto* vstorage = current_->storage_info();
Expand All @@ -963,7 +975,7 @@ double ColumnFamilyData::CalculateWriteDelayDivider(
mutable_cf_options.max_write_buffer_number - 1 &&
num_unflushed_memtables - 1 >=
ioptions_.min_write_buffer_number_to_merge) {
memtable_divider = 10;
memtable_divider = kMemtablePenalty;
}

// Pending Compaction Bytes
Expand All @@ -973,6 +985,7 @@ double ColumnFamilyData::CalculateWriteDelayDivider(
auto hard_limit = mutable_cf_options.hard_pending_compaction_bytes_limit;
// soft_limit != hard_limit here. we're in a kDelayed state here and not
// stop.
assert(hard_limit > soft_limit);
uint64_t soft_hard_range = hard_limit - soft_limit;
// change rate every 1G change or 100Mb if soft_hard_range is too small.
auto step_size = soft_hard_range > Gb ? Gb : 100 * Mb;
Expand Down
16 changes: 8 additions & 8 deletions db/column_family.h
Original file line number Diff line number Diff line change
Expand Up @@ -485,22 +485,22 @@ class ColumnFamilyData {
WriteStallCondition RecalculateWriteStallConditions(
const MutableCFOptions& mutable_cf_options);

// REQUIREMENT: db mutex must be held
double TEST_CalculateWriteDelayDivider(
uint64_t compaction_needed_bytes, WriteStallCause& write_stall_cause,
const MutableCFOptions& mutable_cf_options) {
return CalculateWriteDelayDivider(compaction_needed_bytes,
write_stall_cause, mutable_cf_options);
}
uint64_t compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options,
WriteStallCause& write_stall_cause);

private:
std::unique_ptr<WriteControllerToken> DynamicSetupDelay(
WriteController* write_controller, uint64_t compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options,
WriteStallCause& write_stall_cause);

double CalculateWriteDelayDivider(uint64_t compaction_needed_bytes,
WriteStallCause& write_stall_cause,
const MutableCFOptions& mutable_cf_options);
double CalculateWriteDelayDividerAndMaybeUpdateWriteStallCause(
uint64_t compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options,
WriteStallCause& write_stall_cause);

public:
void set_initialized() { initialized_.store(true); }
Expand Down
Loading

0 comments on commit 4998b24

Please sign in to comment.