|
|
@ -736,8 +736,8 @@ bool DBImpl::CollectKVLogs() { |
|
|
|
total_files += current->NumFiles(i); |
|
|
|
} |
|
|
|
//这个判断保证了所有被选择回收的kvlog都是不对应于mem、imm、L0文件的
|
|
|
|
if(current->kvlogs_.size() < total_files + 10) { |
|
|
|
std::cout << "kvlogs not enough : " << current->kvlogs_.size() << " " << total_files << std::endl; |
|
|
|
if(current->kvlogs_.size() < total_files * 20) { |
|
|
|
// std::cout << "kvlogs not enough : " << current->kvlogs_.size() << " " << total_files << std::endl;
|
|
|
|
current->Unref(); |
|
|
|
return false; |
|
|
|
} |
|
|
@ -766,11 +766,7 @@ bool DBImpl::CollectKVLogs() { |
|
|
|
Iterator *deep_iter = NewInternalDeepIterator(ro,&latest_sequence,&seed); |
|
|
|
// Iterator *iter = NewDBIterator(this, user_comparator(), deep_iter, latest_sequence, seed);
|
|
|
|
|
|
|
|
uint64_t budget = 10000; |
|
|
|
SequenceNumber limit = latest_sequence + budget; |
|
|
|
SequenceNumber now_seq = latest_sequence; |
|
|
|
// std::cout << limit << " " << latest_sequence << std::endl;
|
|
|
|
versions_->SetLastSequence(limit); |
|
|
|
uint64_t budget = 100; |
|
|
|
only_Level0 = true; //保证后续的小合并的结果只会在level0
|
|
|
|
mutex_.Unlock(); |
|
|
|
|
|
|
@ -783,12 +779,12 @@ bool DBImpl::CollectKVLogs() { |
|
|
|
std::set<uint64_t> kvlogs_to_remove; |
|
|
|
bool has_collected = false; |
|
|
|
|
|
|
|
for(int i = 0; i < kvlogs.size(); i++) { |
|
|
|
for(int i = 0; i < std::min(kvlogs.size(),20ul) && budget > 0; i++) { |
|
|
|
FileMetaData *f = kvlogs[i]; |
|
|
|
SequentialFile *file; |
|
|
|
env_->NewSequentialFile(KVLogFileName(dbname_, f->number), &file); |
|
|
|
KVLogReader reader(file); |
|
|
|
for(int cnt = 0; reader.Valid() && now_seq <= limit; reader.Next(), cnt ++) { |
|
|
|
for(int cnt = 0; reader.Valid(); reader.Next(), cnt ++) { |
|
|
|
// std::cout << "find KV: " << reader.Key().ToString() << " " << reader.Value().ToString() << " " << reader.Seq() << "\n";
|
|
|
|
if(reader.Type() == kTypeDeletion) { |
|
|
|
// std::cout << "is delete record\n";
|
|
|
@ -796,7 +792,7 @@ bool DBImpl::CollectKVLogs() { |
|
|
|
} |
|
|
|
saved_key_.clear(); |
|
|
|
AppendInternalKey(&saved_key_, |
|
|
|
ParsedInternalKey(reader.Key(),latest_sequence,kValueTypeForSeek)); |
|
|
|
ParsedInternalKey(reader.Key(),latest_sequence,kValueTypeForSeek,metaKVLog.number)); |
|
|
|
deep_iter->Seek(saved_key_); |
|
|
|
|
|
|
|
// ParseInternalKey(reader.Key(), &key_in_kvlog);
|
|
|
@ -818,24 +814,29 @@ bool DBImpl::CollectKVLogs() { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
if(i > 0) { |
|
|
|
budget = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
has_collected = true; |
|
|
|
// std::cout << "collected KV: " << reader.Key().ToString() << " " << reader.Value().ToString() << " " << reader.Seq() << "\n";
|
|
|
|
if((limit - now_seq) % 100 == 0) { |
|
|
|
std::cout << "collected KV: " << reader.Value().ToString() << " " << reader.Seq() << " " << cnt << "\n"; |
|
|
|
std::cout << "rest budget : " << limit - now_seq << "\n"; |
|
|
|
} |
|
|
|
// if(budget % 100 == 0) {
|
|
|
|
// std::cout << "collected KV: " << reader.Value().ToString() << " " << reader.Seq() << " " << cnt << "\n";
|
|
|
|
// std::cout << "rest budget : " << budget << "\n";
|
|
|
|
// }
|
|
|
|
budget--; |
|
|
|
write_batch.Clear(); |
|
|
|
kp_batch.Clear(); |
|
|
|
write_batch.Put(reader.Key(), reader.Value()); |
|
|
|
now_seq += 1; |
|
|
|
WriteBatchInternal::SetSequence(&write_batch, now_seq); |
|
|
|
WriteBatchInternal::SetSequence(&write_batch, reader.Seq()); |
|
|
|
kvlog_writer.AddRecord(WriteBatchInternal::Contents(&write_batch), fp); |
|
|
|
WriteBatchInternal::ConstructKPBatch(&kp_batch, &write_batch, fp); |
|
|
|
WriteBatchInternal::InsertInto(&kp_batch, tempMem); |
|
|
|
} |
|
|
|
delete file; |
|
|
|
if(reader.Valid()) break; |
|
|
|
kvlogs_to_remove.insert(f->number); |
|
|
|
delete file; |
|
|
|
// break;//当前一次只回收一个kvlog
|
|
|
|
} |
|
|
|
|
|
|
@ -1494,7 +1495,7 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* updates) { |
|
|
|
WriteBatch* write_batch = BuildBatchGroup(&last_writer); |
|
|
|
WriteBatchInternal::SetSequence(write_batch, last_sequence + 1); |
|
|
|
last_sequence += WriteBatchInternal::Count(write_batch); |
|
|
|
versions_->SetLastSequence(last_sequence); |
|
|
|
// versions_->SetLastSequence(last_sequence);
|
|
|
|
|
|
|
|
// Add to log and apply to memtable. We can release the lock
|
|
|
|
// during this phase since &w is currently responsible for logging
|
|
|
@ -1536,7 +1537,7 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* updates) { |
|
|
|
} |
|
|
|
if (write_batch == tmp_batch_) tmp_batch_->Clear(); |
|
|
|
|
|
|
|
// versions_->SetLastSequence(last_sequence);
|
|
|
|
versions_->SetLastSequence(last_sequence); |
|
|
|
} |
|
|
|
|
|
|
|
while (true) { |
|
|
|