From f3a1d9e049e8858a6ab9d0cf627573e203109734 Mon Sep 17 00:00:00 2001 From: Zhongyi Xie Date: Mon, 9 Apr 2018 12:16:42 -0700 Subject: [PATCH] fix data race Summary: Fix a TSAN failure in `DBRangeDelTest.ValidLevelSubcompactionBoundaries`: https://gist.github.com/miasantreble/712e04b4de2ff7f193c98b1acf07e899 Closes https://github.com/facebook/rocksdb/pull/3691 Differential Revision: D7541400 Pulled By: miasantreble fbshipit-source-id: b0b4538980bce7febd0385e61d6e046580bcaefb --- db/version_set.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/db/version_set.cc b/db/version_set.cc index f31fa6792..597fcfbe2 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -2838,6 +2838,9 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data, // because &w is ensuring that all new writes get queued. { EnvOptions opt_env_opts = env_->OptimizeForManifestWrite(env_options_); + // Before releasing mutex, make a copy of mutable_cf_options and pass to + // `PrepareApply` to avoided a potential data race with backgroundflush + MutableCFOptions mutable_cf_options_copy(mutable_cf_options); mu->Unlock(); TEST_SYNC_POINT("VersionSet::LogAndApply:WriteManifest"); @@ -2876,7 +2879,7 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data, if (!w.edit_list.front()->IsColumnFamilyManipulation()) { // This is cpu-heavy operations, which should be called outside mutex. - v->PrepareApply(mutable_cf_options, true); + v->PrepareApply(mutable_cf_options_copy, true); } // Write new record to MANIFEST log