@@ -3703,7 +3703,10 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) {
3703
3703
3704
3704
// May temporarily unlock and wait.
3705
3705
SuperVersion* superversion_to_free = nullptr ;
3706
- Status status = MakeRoomForWrite (my_batch == nullptr , &superversion_to_free);
3706
+ log ::Writer* old_log = nullptr ;
3707
+ Status status = MakeRoomForWrite (my_batch == nullptr ,
3708
+ &superversion_to_free,
3709
+ &old_log);
3707
3710
uint64_t last_sequence = versions_->LastSequence ();
3708
3711
Writer* last_writer = &w;
3709
3712
if (status.ok () && my_batch != nullptr ) { // nullptr batch is for compactions
@@ -3804,6 +3807,7 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) {
3804
3807
writers_.front ()->cv .Signal ();
3805
3808
}
3806
3809
mutex_.Unlock ();
3810
+ delete old_log;
3807
3811
delete superversion_to_free;
3808
3812
BumpPerfTime (&perf_context.write_pre_and_post_process_time ,
3809
3813
&pre_post_process_timer);
@@ -3893,7 +3897,8 @@ uint64_t DBImpl::SlowdownAmount(int n, double bottom, double top) {
3893
3897
// REQUIRES: mutex_ is held
3894
3898
// REQUIRES: this thread is currently at the front of the writer queue
3895
3899
Status DBImpl::MakeRoomForWrite (bool force,
3896
- SuperVersion** superversion_to_free) {
3900
+ SuperVersion** superversion_to_free,
3901
+ log::Writer** old_log) {
3897
3902
mutex_.AssertHeld ();
3898
3903
assert (!writers_.empty ());
3899
3904
bool allow_delay = !force;
@@ -4015,6 +4020,7 @@ Status DBImpl::MakeRoomForWrite(bool force,
4015
4020
4016
4021
} else {
4017
4022
unique_ptr<WritableFile> lfile;
4023
+ log ::Writer* new_log = nullptr ;
4018
4024
MemTable* new_mem = nullptr ;
4019
4025
4020
4026
// Attempt to switch to a new memtable and trigger flush of old.
@@ -4032,6 +4038,7 @@ Status DBImpl::MakeRoomForWrite(bool force,
4032
4038
// Our final size should be less than write_buffer_size
4033
4039
// (compression, etc) but err on the side of caution.
4034
4040
lfile->SetPreallocationBlockSize (1.1 * options_.write_buffer_size );
4041
+ new_log = new log ::Writer (std::move (lfile));
4035
4042
new_mem = new MemTable (internal_comparator_, options_);
4036
4043
new_superversion = new SuperVersion ();
4037
4044
}
@@ -4044,10 +4051,13 @@ Status DBImpl::MakeRoomForWrite(bool force,
4044
4051
// Avoid chewing through file number space in a tight loop.
4045
4052
versions_->ReuseFileNumber (new_log_number);
4046
4053
assert (!new_mem);
4054
+ assert (new_log == nullptr );
4047
4055
break ;
4048
4056
}
4049
4057
logfile_number_ = new_log_number;
4050
- log_.reset (new log ::Writer (std::move (lfile)));
4058
+ assert (new_log != nullptr );
4059
+ *old_log = log_.release ();
4060
+ log_.reset (new_log);
4051
4061
mem_->SetNextLogNumber (logfile_number_);
4052
4062
imm_.Add (mem_);
4053
4063
if (force) {
0 commit comments