From 02f6ebb7d4ee835a4571652a0ed1bc4c17092785 Mon Sep 17 00:00:00 2001 From: Yanqin Jin Date: Tue, 15 Mar 2022 12:16:40 -0700 Subject: [PATCH] Fix TSAN caused by calling `rend()` and `pop_front()`. (#9698) Summary: PR9686 makes `WriteToWAL()` call `assert(...!=rend())` while not holding db mutex or log mutex. Another thread may concurrently call `pop_front()`, causing race condition. To fix, assert only if mutex is held. Pull Request resolved: https://github.com/facebook/rocksdb/pull/9698 Test Plan: COMPILE_WITH_TSAN=1 make check Reviewed By: jay-zhuang Differential Revision: D34898535 Pulled By: riversand963 fbshipit-source-id: 1ddfa5bf1b6ae8d409cab6ff6e1b5321c6803da9 --- db/db_impl/db_impl_write.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/db/db_impl/db_impl_write.cc b/db/db_impl/db_impl_write.cc index 2cc4da472..e2dc3323b 100644 --- a/db/db_impl/db_impl_write.cc +++ b/db/db_impl/db_impl_write.cc @@ -1097,10 +1097,6 @@ IOStatus DBImpl::WriteToWAL(const WriteBatch& merged_batch, assert(with_log_mutex); } -#ifdef NDEBUG - (void)with_log_mutex; -#endif - Slice log_entry = WriteBatchInternal::Contents(&merged_batch); *log_size = log_entry.size(); // When two_write_queues_ WriteToWAL has to be protected from concurretn calls @@ -1128,13 +1124,15 @@ IOStatus DBImpl::WriteToWAL(const WriteBatch& merged_batch, if (with_db_mutex || with_log_mutex) { #endif // __has_feature(thread_sanitizer) #endif // defined(__has_feature) - assert(alive_log_files_tail_ != alive_log_files_.rend()); assert(alive_log_files_tail_ == alive_log_files_.rbegin()); #if defined(__has_feature) #if __has_feature(thread_sanitizer) } #endif // __has_feature(thread_sanitizer) #endif // defined(__has_feature) + if (with_db_mutex || with_log_mutex) { + assert(alive_log_files_tail_ != alive_log_files_.rend()); + } LogFileNumberSize& last_alive_log = *alive_log_files_tail_; last_alive_log.AddSize(*log_size); log_empty_ = false;