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:
parent
9b8a2b52d4
commit
a5fafd4f46
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user