From 9f5004faec796031a2a9e315554562f8c0222310 Mon Sep 17 00:00:00 2001 From: Yuval Ariel Date: Sun, 14 Apr 2024 18:04:24 +0300 Subject: [PATCH] prettify --- db/db_impl/db_impl_write.cc | 8 ++++++-- include/rocksdb/write_buffer_manager.h | 8 +++++++- memtable/write_buffer_manager.cc | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/db/db_impl/db_impl_write.cc b/db/db_impl/db_impl_write.cc index d63ab3fbda..ae0d68fbd4 100644 --- a/db/db_impl/db_impl_write.cc +++ b/db/db_impl/db_impl_write.cc @@ -1747,9 +1747,13 @@ Status DBImpl::HandleWriteBufferManagerFlush(WriteContext* write_context) { if (immutable_db_options_.atomic_flush) { SelectColumnFamiliesForAtomicFlush(&cfds); } else { + // As part of https://github.com/speedb-io/speedb/pull/859, theres a need to + // schedule more flushes since the cfd picked for flush was the oldest one + // and not necessarily enough to resolve the stall issue. + // For this reason, schedule enough flushes so that the memory usage is at + // least below the flush trigger (kMutableLimit * buffer_size) int64_t total_mem_to_free = - write_buffer_manager()->mutable_memtable_memory_usage() - - write_buffer_manager()->buffer_size() * 7 / 8; + write_buffer_manager()->memory_above_flush_trigger(); for (auto cfd : *versions_->GetColumnFamilySet()) { if (cfd->IsDropped()) { continue; diff --git a/include/rocksdb/write_buffer_manager.h b/include/rocksdb/write_buffer_manager.h index 691280ca32..52eaf0b825 100644 --- a/include/rocksdb/write_buffer_manager.h +++ b/include/rocksdb/write_buffer_manager.h @@ -67,6 +67,8 @@ class WriteBufferManager final { static constexpr uint64_t kNoDelayedWriteFactor = 0U; static constexpr uint64_t kMaxDelayedWriteFactor = 100U; static constexpr uint64_t kStopDelayedWriteFactor = kMaxDelayedWriteFactor; + static constexpr double kMutableLimit = 0.875; + enum class UsageState { kNone, kDelay, kStop }; public: @@ -152,6 +154,10 @@ class WriteBufferManager final { return ((inactive >= total) ? 0 : (total - inactive)); } + int64_t memory_above_flush_trigger() { + return mutable_memtable_memory_usage() - buffer_size() * kMutableLimit; + } + // Returns the total inactive memory used by memtables. size_t immmutable_memtable_memory_usage() const { return memory_inactive_.load(std::memory_order_relaxed); @@ -180,7 +186,7 @@ class WriteBufferManager final { [[maybe_unused]] auto was_enabled = enabled(); buffer_size_.store(new_size, std::memory_order_relaxed); - mutable_limit_.store(new_size * 7 / 8, std::memory_order_relaxed); + mutable_limit_.store(new_size * kMutableLimit, std::memory_order_relaxed); assert(was_enabled == enabled()); diff --git a/memtable/write_buffer_manager.cc b/memtable/write_buffer_manager.cc index bdfc389798..87fb3cb656 100644 --- a/memtable/write_buffer_manager.cc +++ b/memtable/write_buffer_manager.cc @@ -54,7 +54,7 @@ WriteBufferManager::WriteBufferManager( const FlushInitiationOptions& flush_initiation_options, uint16_t start_delay_percent) : buffer_size_(_buffer_size), - mutable_limit_(buffer_size_ * 7 / 8), + mutable_limit_(buffer_size_ * kMutableLimit), memory_used_(0), memory_inactive_(0), memory_being_freed_(0U),