Fix occasional failure of DBTest.DynamicCompactionOptions

Summary: DBTest.DynamicCompactionOptions ocasionally fails during valgrind run. We sent a sleeping task to block compaction thread pool but we don't wait it to run.

Test Plan: Run the test multiple times in an environment which can cause failure.

Reviewers: rven, kradhakrishnan, igor, IslamAbdelRahman, anthony, yhchiang

Reviewed By: yhchiang

Subscribers: leveldb, dhruba

Differential Revision: https://reviews.facebook.net/D51687
This commit is contained in:
sdong 2015-12-07 18:07:01 -08:00
parent f307036bde
commit 770dea9325
2 changed files with 9 additions and 1 deletions

View File

@ -7704,7 +7704,7 @@ TEST_F(DBTest, DynamicCompactionOptions) {
test::SleepingBackgroundTask sleeping_task_low; test::SleepingBackgroundTask sleeping_task_low;
env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low, env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
Env::Priority::LOW); Env::Priority::LOW);
sleeping_task_low.WaitUntilSleeping();
ASSERT_EQ(NumTableFilesAtLevel(0), 0); ASSERT_EQ(NumTableFilesAtLevel(0), 0);
int count = 0; int count = 0;
Random rnd(301); Random rnd(301);
@ -7737,6 +7737,7 @@ TEST_F(DBTest, DynamicCompactionOptions) {
sleeping_task_low.Reset(); sleeping_task_low.Reset();
env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low, env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
Env::Priority::LOW); Env::Priority::LOW);
sleeping_task_low.WaitUntilSleeping();
count = 0; count = 0;
while (count < 64) { while (count < 64) {
ASSERT_OK(Put(Key(count), RandomString(&rnd, 1024), wo)); ASSERT_OK(Put(Key(count), RandomString(&rnd, 1024), wo));

View File

@ -306,6 +306,7 @@ class SleepingBackgroundTask {
void DoSleep() { void DoSleep() {
MutexLock l(&mutex_); MutexLock l(&mutex_);
sleeping_ = true; sleeping_ = true;
bg_cv_.SignalAll();
while (should_sleep_) { while (should_sleep_) {
bg_cv_.Wait(); bg_cv_.Wait();
} }
@ -313,6 +314,12 @@ class SleepingBackgroundTask {
done_with_sleep_ = true; done_with_sleep_ = true;
bg_cv_.SignalAll(); bg_cv_.SignalAll();
} }
void WaitUntilSleeping() {
MutexLock l(&mutex_);
while (!sleeping_) {
bg_cv_.Wait();
}
}
void WakeUp() { void WakeUp() {
MutexLock l(&mutex_); MutexLock l(&mutex_);
should_sleep_ = false; should_sleep_ = false;