From: Zhongyi Xie Date: Mon, 9 Apr 2018 19:16:42 +0000 (-0700) Subject: fix data race X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f3a1d9e049e8858a6ab9d0cf627573e203109734;p=rocksdb.git 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 --- 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