Browse Source

fix all memory leak

version_3
alexfisher 8 months ago
parent
commit
0d354d286a
3 changed files with 25 additions and 21 deletions
  1. +20
    -16
      db/db_impl.cc
  2. +4
    -4
      db/unordered_iter.cc
  3. +1
    -1
      test/test.cpp

+ 20
- 16
db/db_impl.cc View File

@ -731,6 +731,10 @@ void DBImpl::MaybeScheduleGarbageCollect() {
gc_mutex_.Lock();
background_garbage_collect_scheduled_ = true;
gc_mutex_.Unlock();
if(gc_thread){
if(gc_thread->joinable())gc_thread->join();
delete gc_thread;
}
gc_thread = new std::thread(&DBImpl::BGWorkGC, this);
}
}
@ -1723,7 +1727,7 @@ std::vector> DBImpl::WriteValueLog(
valuelog_usage[valuelogfile_number_] += res.size();
valuelog_origin[valuelogfile_number_] += res.size();
}
delete buf;
delete []buf;
return res;
}
@ -1795,7 +1799,7 @@ Status DBImpl::ReadValueLog(uint64_t file_id, uint64_t offset,
uint64_t crc_offset = offset + total_len;
if (totalSize < crc_offset) {
delete buf;
delete []buf;
return Status::Corruption("get value for valuelog fail:parse fail");
}
@ -1807,16 +1811,16 @@ Status DBImpl::ReadValueLog(uint64_t file_id, uint64_t offset,
uint32_t cal_crc_value = crc32c::Value(buf, value_len);
cal_crc_value = crc32c::Extend(cal_crc_value, key_buf, key_len);
if (cal_crc_value != crc_value) {
delete key_buf;
delete buf;
delete []key_buf;
delete []buf;
return Status::Corruption("get value for valuelog fail:crc check fail");
}
delete key_buf;
delete []key_buf;
}
*value = std::string(buf, value_len);
delete buf;
delete []buf;
return Status::OK();
}
@ -1946,14 +1950,14 @@ void DBImpl::GarbageCollect() {
if (status.IsNotFound()) {
// not newest record, simply ignore
delete key_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
mutex_.Unlock();
continue;
} else if (!status.ok()) { // handle error:skip this valuelog
delete key_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
@ -1963,7 +1967,7 @@ void DBImpl::GarbageCollect() {
} else {
if (stored_value.data()[0] == (char)(0x00)) {
// not newest record, simply ignore
delete key_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
@ -1978,7 +1982,7 @@ void DBImpl::GarbageCollect() {
stored_valuelog_id, stored_offset);
if (!status.ok()) { // handle error:skip this valuelog
delete key_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
@ -1989,7 +1993,7 @@ void DBImpl::GarbageCollect() {
if (stored_valuelog_id != cur_log_number || stored_offset != tmp_offset) {
// not newest record, simply ignore
delete key_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
@ -2011,8 +2015,8 @@ void DBImpl::GarbageCollect() {
cal_crc_value = crc32c::Extend(cal_crc_value, key_buf, key_len);
if (cal_crc_value != crc_value) {
// the valuelog can't be delete (because something is wrong), so break
delete value_buf;
delete key_buf;
delete []value_buf;
delete []key_buf;
mutex_.Lock();
valuelog_finding_key = Slice();
lock_valuelog_key_mutex_cond_.SignalAll();
@ -2033,8 +2037,8 @@ void DBImpl::GarbageCollect() {
gc_bytes += key_len + val_len;
delete value_buf;
delete key_buf;
delete []value_buf;
delete []key_buf;
}
if (valuelog_wrong) {
// if something wrong with valuelog, it can't be delete
@ -2245,7 +2249,7 @@ void DBImpl::InitializeExistingLogs() {
trunc_file.write(buf, latest_valuelog_offset);
trunc_file.close();
delete buf;
delete []buf;
}
// step 4: update valuelog_origin by scan every valuelog

+ 4
- 4
db/unordered_iter.cc View File

@ -59,8 +59,8 @@ class UnorderedIter : public Iterator {
current_file->close();
delete current_file;
}
if(buf_for_now_key)delete buf_for_now_key;
if(buf_for_now_value)delete buf_for_now_value;
if(buf_for_now_key)delete []buf_for_now_key;
if(buf_for_now_value)delete []buf_for_now_value;
delete iter_;
}
bool Valid() const override { return mode!=2; }
@ -103,7 +103,7 @@ class UnorderedIter : public Iterator {
if(value_len>buf_for_now_value_size){
buf_for_now_value_size=value_len;
if(buf_for_now_value)delete buf_for_now_value;
if(buf_for_now_value)delete []buf_for_now_value;
buf_for_now_value=new char[value_len];
}
current_file->read(buf_for_now_value,value_len);
@ -112,7 +112,7 @@ class UnorderedIter : public Iterator {
if(key_len>buf_for_now_key_size){
buf_for_now_key_size=key_len;
if(buf_for_now_key)delete buf_for_now_key;
if(buf_for_now_key)delete []buf_for_now_key;
buf_for_now_key=new char[key_len];
}

+ 1
- 1
test/test.cpp View File

@ -235,7 +235,7 @@ TEST(Test, unorder_valuelog_iterator_test) {
}
TEST(Test, fields_simple_test) {
TEST(Test, fields_test) {
DB *db;
WriteOptions writeOptions;
ReadOptions readOptions;

Loading…
Cancel
Save