A heuristic way to check if a memtable is full

Summary:
This is is based on https://reviews.facebook.net/D15027. It's not finished but I would like to give a prototype to avoid arena over-allocation while making better use of the already allocated memory blocks.

Instead of check approximate memtable size, we will take a deeper look at the arena, which incorporate essential idea that @sdong suggests: flush when arena has allocated its last and the last is "almost full"

Test Plan: N/A

Reviewers: haobo, sdong

Reviewed By: sdong

CC: leveldb, sdong

Differential Revision: https://reviews.facebook.net/D15051
This commit is contained in:
Kai Liu
2014-03-12 16:40:14 -07:00
parent 7b7793e97a
commit 11da8bc5df
6 changed files with 157 additions and 44 deletions

View File

@@ -1094,8 +1094,7 @@ Status DBImpl::RecoverLogFile(uint64_t log_number, SequenceNumber* max_sequence,
*max_sequence = last_seq;
}
if (!read_only &&
mem_->ApproximateMemoryUsage() > options_.write_buffer_size) {
if (!read_only && mem_->ShouldFlush()) {
status = WriteLevel0TableForRecovery(mem_, &edit);
// we still want to clear memtable, even if the recovery failed
delete mem_->Unref();
@@ -3533,8 +3532,7 @@ Status DBImpl::MakeRoomForWrite(bool force,
allow_delay = false; // Do not delay a single write more than once
mutex_.Lock();
delayed_writes_++;
} else if (!force &&
(mem_->ApproximateMemoryUsage() <= options_.write_buffer_size)) {
} else if (!force && !mem_->ShouldFlush()) {
// There is room in current memtable
if (allow_delay) {
DelayLoggingAndReset();