Fixed the tsan failure in util/compaction_job_stats_impl.cc

Summary:
The type of smallest_output_key_prefix and largest_output_key_prefix
have been changed to std::string in https://reviews.facebook.net/D39537.
As a result, we shouldn't do smallest_output_key_prefix[0] = 0 in the
initialization.

Test Plan: compile db_test with tsan enabled and repeat DBTest.CompactionDeletionTrigger test to verify the tsan issue has been gone.

Reviewers: igor, sdong

Reviewed By: sdong

Subscribers: dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D39645
main
Yueh-Hsuan Chiang 10 years ago
parent b2785472c8
commit 7647df8f9e
  1. 3
      db/db_impl.cc
  2. 51
      db/db_test.cc
  3. 3
      util/compaction_job_stats_impl.cc

@ -1736,6 +1736,9 @@ Status DBImpl::ReFitLevel(ColumnFamilyData* cfd, int level, int target_level) {
to_level = FindMinimumEmptyLevelFitting(cfd, mutable_cf_options, level); to_level = FindMinimumEmptyLevelFitting(cfd, mutable_cf_options, level);
} }
printf("level %d, to_level %d\n", level, to_level);
assert(to_level <= level);
Status status; Status status;
auto* vstorage = cfd->current()->storage_info(); auto* vstorage = cfd->current()->storage_info();
if (to_level > level) { if (to_level > level) {

@ -13238,6 +13238,57 @@ TEST_F(DBTest, FlushesInParallelWithCompactRange) {
rocksdb::SyncPoint::GetInstance()->DisableProcessing(); rocksdb::SyncPoint::GetInstance()->DisableProcessing();
} }
} }
TEST_F(DBTest, TrivialMoveTargetLevel) {
int32_t trivial_move = 0;
int32_t non_trivial_move = 0;
/*
rocksdb::SyncPoint::GetInstance()->SetCallBack(
"DBImpl::BackgroundCompaction:TrivialMove",
[&](void* arg) { trivial_move++;printf("trivial\n"); });
rocksdb::SyncPoint::GetInstance()->SetCallBack(
"DBImpl::BackgroundCompaction:NonTrivial",
[&](void* arg) { non_trivial_move++;printf("non-trivial\n"); });
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
*/
Options options = CurrentOptions();
options.disable_auto_compactions = true;
options.write_buffer_size = 10 * 1024 * 1024;
options.num_levels = 5;
DestroyAndReopen(options);
int32_t value_size = 10 * 1024; // 10 KB
// Add 2 non-overlapping files
Random rnd(301);
std::map<int32_t, std::string> values;
for (int32_t i = 0; i <= 100; i++) {
values[i] = RandomString(&rnd, value_size);
ASSERT_OK(Put(Key(i), values[i]));
}
ASSERT_OK(Flush());
for (int32_t i = 300; i <= 700; i++) {
values[i] = RandomString(&rnd, value_size);
ASSERT_OK(Put(Key(i), values[i]));
}
ASSERT_OK(Flush());
ASSERT_EQ("2", FilesPerLevel(0));
printf("Compact\n");
db_->CompactRange(db_->DefaultColumnFamily(), nullptr, nullptr, true, 1, 0);
printf("Done\n");
ASSERT_EQ("0,0,0,2", FilesPerLevel(0));
ASSERT_EQ(trivial_move, 3);
ASSERT_EQ(non_trivial_move, 0);
for (int32_t i = 0; i <= 100; i++) {
ASSERT_EQ(Get(Key(i)), values[i]);
}
for (int32_t i = 300; i <= 700; i++) {
ASSERT_EQ(Get(Key(i)), values[i]);
}
}
} // namespace rocksdb } // namespace rocksdb

@ -29,9 +29,6 @@ void CompactionJobStats::Reset() {
num_records_replaced = 0; num_records_replaced = 0;
is_manual_compaction = 0; is_manual_compaction = 0;
smallest_output_key_prefix[0] = 0;
largest_output_key_prefix[0] = 0;
} }
#else #else

Loading…
Cancel
Save