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
This commit is contained in:
parent
b2785472c8
commit
7647df8f9e
@ -1736,6 +1736,9 @@ Status DBImpl::ReFitLevel(ColumnFamilyData* cfd, int level, int target_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;
|
||||
auto* vstorage = cfd->current()->storage_info();
|
||||
if (to_level > level) {
|
||||
|
@ -13238,6 +13238,57 @@ TEST_F(DBTest, FlushesInParallelWithCompactRange) {
|
||||
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
|
||||
|
||||
|
@ -29,9 +29,6 @@ void CompactionJobStats::Reset() {
|
||||
num_records_replaced = 0;
|
||||
|
||||
is_manual_compaction = 0;
|
||||
|
||||
smallest_output_key_prefix[0] = 0;
|
||||
largest_output_key_prefix[0] = 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user