Skip to content

Commit b69e7d9

Browse files
committed
[CF] Better handling of memtable logs
Summary: DBImpl now keeps a list of alive_log_files_. On every FindObsoleteFiles, it deletes all alive log files that are smaller than versions_->MinLogNumber() Test Plan: make check passes no specific unit tests yet, will add Reviewers: dhruba, haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D16293
1 parent d39da4b commit b69e7d9

File tree

4 files changed

+12
-27
lines changed

4 files changed

+12
-27
lines changed

db/db_impl.cc

+11-14
Original file line numberDiff line numberDiff line change
@@ -1112,9 +1112,8 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
11121112
mutex_.Unlock();
11131113
std::vector<Iterator*> memtables;
11141114
for (MemTable* m : mems) {
1115-
Log(options_.info_log,
1116-
"Flushing memtable with log file: %lu\n",
1117-
(unsigned long)m->GetLogNumber());
1115+
Log(options_.info_log, "Flushing memtable with next log file: %lu\n",
1116+
(unsigned long)m->GetNextLogNumber());
11181117
memtables.push_back(m->NewIterator());
11191118
}
11201119
Iterator* iter = NewMergingIterator(env_, &cfd->internal_comparator(),
@@ -1206,11 +1205,6 @@ Status DBImpl::FlushMemTableToOutputFile(ColumnFamilyData* cfd,
12061205
edit->SetLogNumber(mems.back()->GetNextLogNumber());
12071206
edit->SetColumnFamily(cfd->GetID());
12081207

1209-
std::vector<uint64_t> logs_to_delete;
1210-
for (auto mem : mems) {
1211-
logs_to_delete.push_back(mem->GetLogNumber());
1212-
}
1213-
12141208
// This will release and re-acquire the mutex.
12151209
Status s = WriteLevel0Table(cfd, mems, edit, &file_number);
12161210

@@ -1239,10 +1233,11 @@ Status DBImpl::FlushMemTableToOutputFile(ColumnFamilyData* cfd,
12391233

12401234
if (disable_delete_obsolete_files_ == 0) {
12411235
// add to deletion state
1242-
deletion_state.log_delete_files.insert(
1243-
deletion_state.log_delete_files.end(),
1244-
logs_to_delete.begin(),
1245-
logs_to_delete.end());
1236+
while (alive_log_files_.size() &&
1237+
*alive_log_files_.begin() < versions_->MinLogNumber()) {
1238+
deletion_state.log_delete_files.push_back(*alive_log_files_.begin());
1239+
alive_log_files_.pop_front();
1240+
}
12461241
}
12471242
}
12481243
return s;
@@ -3589,12 +3584,14 @@ Status DBImpl::MakeRoomForWrite(ColumnFamilyData* cfd, bool force) {
35893584
logfile_number_ = new_log_number;
35903585
log_.reset(new log::Writer(std::move(lfile)));
35913586
cfd->mem()->SetNextLogNumber(logfile_number_);
3587+
// TODO also update log number for all column families with empty
3588+
// memtables (i.e. don't have data in the old log)
35923589
cfd->imm()->Add(cfd->mem());
35933590
if (force) {
35943591
cfd->imm()->FlushRequested();
35953592
}
35963593
new_mem->Ref();
3597-
new_mem->SetLogNumber(logfile_number_);
3594+
alive_log_files_.push_back(logfile_number_);
35983595
cfd->SetMemtable(new_mem);
35993596
Log(options_.info_log, "New memtable created with log file: #%lu\n",
36003597
(unsigned long)logfile_number_);
@@ -3936,7 +3933,7 @@ Status DB::Open(const DBOptions& db_options, const std::string& dbname,
39363933
if (s.ok()) {
39373934
for (auto cfd : *impl->versions_->GetColumnFamilySet()) {
39383935
delete cfd->InstallSuperVersion(new SuperVersion());
3939-
cfd->mem()->SetLogNumber(impl->logfile_number_);
3936+
impl->alive_log_files_.push_back(impl->logfile_number_);
39403937
}
39413938
impl->DeleteObsoleteFiles();
39423939
impl->MaybeScheduleFlushOrCompaction();

db/db_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ class DBImpl : public DB {
386386
unique_ptr<log::Writer> log_;
387387
ColumnFamilyHandleImpl* default_cf_handle_;
388388
unique_ptr<ColumnFamilyMemTablesImpl> column_family_memtables_;
389+
std::deque<uint32_t> alive_log_files_;
389390

390391
std::string host_name_;
391392

db/memtable.cc

-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ MemTable::MemTable(const InternalKeyComparator& cmp,
4848
file_number_(0),
4949
first_seqno_(0),
5050
mem_next_logfile_number_(0),
51-
mem_logfile_number_(0),
5251
locks_(options.inplace_update_support ? options.inplace_update_num_locks
5352
: 0),
5453
prefix_extractor_(options.prefix_extractor) {

db/memtable.h

-12
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,6 @@ class MemTable {
143143
// be flushed to storage
144144
void SetNextLogNumber(uint64_t num) { mem_next_logfile_number_ = num; }
145145

146-
// Returns the logfile number that can be safely deleted when this
147-
// memstore is flushed to storage
148-
uint64_t GetLogNumber() { return mem_logfile_number_; }
149-
150-
// Sets the logfile number that can be safely deleted when this
151-
// memstore is flushed to storage
152-
void SetLogNumber(uint64_t num) { mem_logfile_number_ = num; }
153-
154146
// Notify the underlying storage that no more items will be added
155147
void MarkImmutable() { table_->MarkReadOnly(); }
156148

@@ -186,10 +178,6 @@ class MemTable {
186178
// The log files earlier than this number can be deleted.
187179
uint64_t mem_next_logfile_number_;
188180

189-
// The log file that backs this memtable (to be deleted when
190-
// memtable flush is done)
191-
uint64_t mem_logfile_number_;
192-
193181
// rw locks for inplace updates
194182
std::vector<port::RWMutex> locks_;
195183

0 commit comments

Comments
 (0)