From 1f1a3e5a3b9e85c4f4b8d6ff8f2afc879d985d29 Mon Sep 17 00:00:00 2001 From: Matthew V Date: Tue, 28 Feb 2017 16:25:47 -0500 Subject: [PATCH 1/3] add logic for disable_recovery_log in destructor, Write, MakeRoomForWrite, and NewRecoveryLog --- db/db_impl.cc | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 1b534325..560da74d 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -224,6 +224,10 @@ DBImpl::DBImpl(const Options& options, const std::string& dbname) DBImpl::~DBImpl() { DBList()->ReleaseDB(this, options_.is_internal_db); + // maybe push memory buffer(s) to disk if recovery log disabled + if (options_.disable_recovery_log) + CompactMemTableSynchronous(); + // Wait for background work to finish mutex_.Lock(); shutting_down_.Release_Store(this); // Any non-NULL value is ok @@ -1830,10 +1834,13 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) { // into mem_. { mutex_.Unlock(); - status = log_->AddRecord(WriteBatchInternal::Contents(updates)); - if (status.ok() && options.sync) { - status = logfile_->Sync(); - } + if (!options_.disable_recovery_log) + { + status = log_->AddRecord(WriteBatchInternal::Contents(updates)); + if (status.ok() && options.sync) { + status = logfile_->Sync(); + } // if + } // if if (status.ok()) { status = WriteBatchInternal::InsertInto(updates, mem_, &options_); } @@ -2017,7 +2024,8 @@ Status DBImpl::MakeRoomForWrite(bool force) { Log(options_.info_log, "waiting 2...\n"); gPerfCounters->Inc(ePerfWriteWaitImm); MaybeScheduleCompaction(); - if (!shutting_down_.Acquire_Load()) + while (imm_ != NULL && bg_error_.ok() + && !shutting_down_.Acquire_Load()) bg_cv_.Wait(); Log(options_.info_log, "running 2...\n"); } else if (versions_->NumLevelFiles(0) >= config::kL0_StopWritesTrigger) { @@ -2070,19 +2078,29 @@ Status DBImpl::NewRecoveryLog( Status s; WritableFile * lfile(NULL); - s = env_->NewWriteOnlyFile(LogFileName(dbname_, NewLogNumber), &lfile, - options_.env->RecoveryMmapSize(&options_)); - if (s.ok()) + if (!options_.disable_recovery_log) { - // close any existing - delete log_; - delete logfile_; + s = env_->NewWriteOnlyFile(LogFileName(dbname_, NewLogNumber), &lfile, + options_.env->RecoveryMmapSize(&options_)); + if (s.ok()) + { + // close any existing + delete log_; + delete logfile_; - logfile_ = lfile; - logfile_number_ = NewLogNumber; - log_ = new log::Writer(lfile); + logfile_ = lfile; + logfile_number_ = NewLogNumber; + log_ = new log::Writer(lfile); + } // if } // if + // keep asserts valid + else + { + logfile_number_ = NewLogNumber; + } // else + + return(s); } // DBImpl::NewRecoveryLog From 61f55e93e275ffdcdda7c428e9fb485a4db93005 Mon Sep 17 00:00:00 2001 From: Matthew V Date: Tue, 28 Feb 2017 16:26:36 -0500 Subject: [PATCH 2/3] add fourth test scenario for disable_recovery_log flag. fix up one test due to that change. --- db/db_test.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/db/db_test.cc b/db/db_test.cc index 92cc816d..e49ffb49 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -153,6 +153,7 @@ class DBTest { kDefault, kFilter, kUncompressed, + kDisableRecovery, kEnd }; int option_config_; @@ -202,6 +203,9 @@ class DBTest { case kUncompressed: options.compression = kNoCompression; break; + case kDisableRecovery: + options.disable_recovery_log = true; + break; default: break; } @@ -1073,7 +1077,10 @@ TEST(DBTest, ApproximateSizes) { } ASSERT_EQ(NumTableFilesAtLevel(0), 0); - ASSERT_GT(NumTableFilesAtLevel(1), 0); + if (!CurrentOptions().disable_recovery_log) + ASSERT_GT(NumTableFilesAtLevel(1), 0); + else + ASSERT_GT(NumTableFilesAtLevel(3), 0); // code path uses move } } while (ChangeOptions()); } From 9ef1514b16c392e68b8c6d96e79bc11bee137d1c Mon Sep 17 00:00:00 2001 From: Matthew V Date: Tue, 28 Feb 2017 16:26:56 -0500 Subject: [PATCH 3/3] add disable_recovery_flag option. --- include/leveldb/options.h | 6 ++++++ util/options.cc | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/leveldb/options.h b/include/leveldb/options.h index 4032129c..8115c7a7 100644 --- a/include/leveldb/options.h +++ b/include/leveldb/options.h @@ -249,6 +249,12 @@ struct Options { // upon restart. bool cache_object_warming; + // Riak specific option to disable writing of recovery log + // during DB::Write() / Put() calls. This speeds performance + // but can lead to loss of tens of megabytes of data if + // system crashes. Used in Riak for temporary tables only. + bool disable_recovery_log; + // Riak specific object that defines expiry policy for data // written to leveldb. ExpiryPtr_t expiry_module; diff --git a/util/options.cc b/util/options.cc index c02635f2..13a2dc2c 100644 --- a/util/options.cc +++ b/util/options.cc @@ -50,7 +50,8 @@ Options::Options() delete_threshold(1000), fadvise_willneed(false), tiered_slow_level(0), - cache_object_warming(true) + cache_object_warming(true), + disable_recovery_log(false) { } @@ -89,6 +90,7 @@ Options::Dump( Log(log," Options.tiered_slow_prefix: %s", tiered_slow_prefix.c_str()); Log(log," crc32c: %s", crc32c::IsHardwareCRC() ? "hardware" : "software"); Log(log," Options.cache_object_warming: %s", cache_object_warming ? "true" : "false"); + Log(log," Options.disable_recovery_log: %s", disable_recovery_log ? "true" : "false"); Log(log," Options.ExpiryActivated: %s", ExpiryActivated() ? "true" : "false"); if (NULL!=expiry_module.get())