Correct the logic of MemTable::ShouldFlushNow().

Summary:
Memtable will now be forced to flush if the one of the following
conditions is met:
1. Already allocated more than write_buffer_size + 60% arena block size.
   (the overflowing condition)
2. Unable to safely allocate one more arena block without hitting the
   overflowing condition AND the unused allocated memory < 25% arena
   block size.

Test Plan: make all check

Reviewers: sdong, haobo

CC: leveldb

Differential Revision: https://reviews.facebook.net/D16893
This commit is contained in:
Yueh-Hsuan Chiang 2014-03-14 14:01:45 -07:00
parent 9b8a2b52d4
commit a5fafd4f46

View File

@ -78,21 +78,23 @@ bool MemTable::ShouldFlushNow() const {
auto allocated_memory = auto allocated_memory =
table_->ApproximateMemoryUsage() + arena_.MemoryAllocatedBytes(); table_->ApproximateMemoryUsage() + arena_.MemoryAllocatedBytes();
if (allocated_memory + kArenaBlockSize * kAllowOverAllocationRatio < // if we can still allocate one more block without exceeding the
kWriteBufferSize) { // over-allocation ratio, then we should not flush.
if (allocated_memory + kArenaBlockSize <
kWriteBufferSize + kArenaBlockSize * kAllowOverAllocationRatio) {
return false; return false;
} }
// if user keeps adding entries that exceeds kWriteBufferSize, we need to // if user keeps adding entries that exceeds kWriteBufferSize, we need to
// flush // flush earlier even though we still have much available memory left.
// earlier even though we still have much available memory left. if (allocated_memory >
if (allocated_memory > kWriteBufferSize * (1 + kAllowOverAllocationRatio)) { kWriteBufferSize + kArenaBlockSize * kAllowOverAllocationRatio) {
return true; return true;
} }
// In this code path, Arena has already allocated its "last block", which // In this code path, Arena has already allocated its "last block", which
// means the total allocatedmemory size is either: // means the total allocatedmemory size is either:
// (1) "moderately" over allocated the memory (no more than `0.4 * arena // (1) "moderately" over allocated the memory (no more than `0.6 * arena
// block size`. Or, // block size`. Or,
// (2) the allocated memory is less than write buffer size, but we'll stop // (2) the allocated memory is less than write buffer size, but we'll stop
// here since if we allocate a new arena block, we'll over allocate too much // here since if we allocate a new arena block, we'll over allocate too much