Improve DBTest.GroupCommitTest: artificially slowdown log writing to trigger group commit

Summary: In order to avoid random failure of DBTest.GroupCommitTest, artificially sleep 100 microseconds in each log writing.

Test Plan: Run the test in a machine where valgrind version of the test always fails multiple times and see it always succeed.

Reviewers: igor, yhchiang, rven, ljin

Reviewed By: ljin

Subscribers: leveldb, dhruba

Differential Revision: https://reviews.facebook.net/D28401
This commit is contained in:
sdong 2014-11-06 10:14:47 -08:00
parent b52b144c73
commit 367a3f9cb4

View File

@ -144,6 +144,9 @@ class SpecialEnv : public EnvWrapper {
// Force write to log files to fail while this pointer is non-nullptr // Force write to log files to fail while this pointer is non-nullptr
std::atomic<bool> log_write_error_; std::atomic<bool> log_write_error_;
// Slow down every log write, in micro-seconds.
std::atomic<int> log_write_slowdown_;
bool count_random_reads_; bool count_random_reads_;
anon::AtomicCounter random_read_counter_; anon::AtomicCounter random_read_counter_;
@ -172,6 +175,7 @@ class SpecialEnv : public EnvWrapper {
manifest_sync_error_.store(false, std::memory_order_release); manifest_sync_error_.store(false, std::memory_order_release);
manifest_write_error_.store(false, std::memory_order_release); manifest_write_error_.store(false, std::memory_order_release);
log_write_error_.store(false, std::memory_order_release); log_write_error_.store(false, std::memory_order_release);
log_write_slowdown_ = 0;
bytes_written_ = 0; bytes_written_ = 0;
sync_counter_ = 0; sync_counter_ = 0;
non_writeable_rate_ = 0; non_writeable_rate_ = 0;
@ -254,6 +258,11 @@ class SpecialEnv : public EnvWrapper {
if (env_->log_write_error_.load(std::memory_order_acquire)) { if (env_->log_write_error_.load(std::memory_order_acquire)) {
return Status::IOError("simulated writer error"); return Status::IOError("simulated writer error");
} else { } else {
int slowdown =
env_->log_write_slowdown_.load(std::memory_order_acquire);
if (slowdown > 0) {
env_->SleepForMicroseconds(slowdown);
}
return base_->Append(data); return base_->Append(data);
} }
} }
@ -7060,6 +7069,8 @@ static void GCThreadBody(void* arg) {
TEST(DBTest, GroupCommitTest) { TEST(DBTest, GroupCommitTest) {
do { do {
Options options = CurrentOptions(); Options options = CurrentOptions();
options.env = env_;
env_->log_write_slowdown_.store(100);
options.statistics = rocksdb::CreateDBStatistics(); options.statistics = rocksdb::CreateDBStatistics();
Reopen(options); Reopen(options);
@ -7077,6 +7088,8 @@ TEST(DBTest, GroupCommitTest) {
env_->SleepForMicroseconds(100000); env_->SleepForMicroseconds(100000);
} }
} }
env_->log_write_slowdown_.store(0);
ASSERT_GT(TestGetTickerCount(options, WRITE_DONE_BY_OTHER), 0); ASSERT_GT(TestGetTickerCount(options, WRITE_DONE_BY_OTHER), 0);
std::vector<std::string> expected_db; std::vector<std::string> expected_db;