From 7647df8f9ea71d0cf06334b3177c8ffbafeffc9e Mon Sep 17 00:00:00 2001 From: Yueh-Hsuan Chiang Date: Fri, 5 Jun 2015 11:05:35 -0700 Subject: [PATCH] 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 --- db/db_impl.cc | 3 ++ db/db_test.cc | 51 +++++++++++++++++++++++++++++++ util/compaction_job_stats_impl.cc | 3 -- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 9b91baf0c..747175c0f 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -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) { diff --git a/db/db_test.cc b/db/db_test.cc index f5b55fe97..d5613b397 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -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 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 diff --git a/util/compaction_job_stats_impl.cc b/util/compaction_job_stats_impl.cc index 4933a15cc..b55b112a0 100644 --- a/util/compaction_job_stats_impl.cc +++ b/util/compaction_job_stats_impl.cc @@ -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 -- GitLab