Skip to content

Commit 56af85d

Browse files
committed
MB-41279: Fix data race on Stream::snap_start,snap_end,start seqnos
The following data race was observed on Stream member variables: Running [0056/0099]: test full rollback on consumer...================== WARNING: ThreadSanitizer: data race (pid=43827) Write of size 8 at 0x7b540001ef60 by thread T23: #0 PassiveStream::reconnectStream(...) ../kv_engine/engines/ep/src/dcp/passive_stream.cc:240 (libep.so+0x00000012eed6) #1 DcpConsumer::doRollback(unsigned int, Vbid, unsigned long) ../kv_engine/engines/ep/src/dcp/consumer.cc:1107 (libep.so+0x0000001116d3) #2 RollbackTask::run() ../kv_engine/engines/ep/src/dcp/consumer.cc:938 (libep.so+0x000000111871) #3 GlobalTask::execute() ../kv_engine/engines/ep/src/globaltask.cc:73 (libep.so+0x0000002363cb) #4 CB3ExecutorThread::run() ../kv_engine/engines/ep/src/cb3_executorthread.cc:174 (libep.so+0x00000009f7a1) #5 launch_executor_thread ../kv_engine/engines/ep/src/cb3_executorthread.cc:34 (libep.so+0x00000009fded) #6 CouchbaseThread::run() ../platform/src/cb_pthreads.cc:58 (libplatform_so.so.0.1.0+0x000000010e1b) #7 platform_thread_wrap ../platform/src/cb_pthreads.cc:71 (libplatform_so.so.0.1.0+0x000000010e1b) #8 <null> <null> (libtsan.so.0+0x000000024feb) Previous read of size 8 at 0x7b540001ef60 by thread T22 (mutexes: write M639646524455782464): #0 void StatCollector::addStat<...>(...) ../kv_engine/include/statistics/collector.h:343 (libep.so+0x0000000e5e03) #1 void add_casted_stat<>(...) ../kv_engine/include/statistics/collector.h:404 (libep.so+0x0000000e5e03) #2 Stream::addStats(...) ../kv_engine/engines/ep/src/dcp/stream.cc:157 (libep.so+0x00000016b1b4) #3 PassiveStream::addStats(...) ../kv_engine/engines/ep/src/dcp/passive_stream.cc:1058 (libep.so+0x000000133a98) #4 DcpConsumer::addStats(...) ../kv_engine/engines/ep/src/dcp/consumer.cc:1140 (libep.so+0x000000115415) #5 ConnStatBuilder::operator()(std::shared_ptr<ConnHandler>) ../kv_engine/engines/ep/src/ep_engine.cc:3784 (libep.so+0x0000001f3f9a) #6 void DcpConnMap::each<ConnStatBuilder&>(ConnStatBuilder&) ../kv_engine/engines/ep/src/dcp/dcpconnmap_impl.h:33 (libep.so+0x0000001f3f9a) #7 EventuallyPersistentEngine::doDcpStats(...) ../kv_engine/engines/ep/src/ep_engine.cc:3943 (libep.so+0x0000001d9cd0) #8 EventuallyPersistentEngine::getStats(...) ../kv_engine/engines/ep/src/ep_engine.cc:4675 (libep.so+0x0000001dd67b) #9 KVBucket::snapshotStats() ../kv_engine/engines/ep/src/kv_bucket.cc:1168 (libep.so+0x000000261e32) #10 StatSnap::run() ../kv_engine/engines/ep/src/tasks.cc:72 (libep.so+0x0000002b76a9) #11 GlobalTask::execute() ../kv_engine/engines/ep/src/globaltask.cc:73 (libep.so+0x0000002363cb) #12 CB3ExecutorThread::run() ../kv_engine/engines/ep/src/cb3_executorthread.cc:174 (libep.so+0x00000009f7a1) #13 launch_executor_thread ../kv_engine/engines/ep/src/cb3_executorthread.cc:34 (libep.so+0x00000009fded) #14 CouchbaseThread::run() ../platform/src/cb_pthreads.cc:58 (libplatform_so.so.0.1.0+0x000000010e1b) #15 platform_thread_wrap ../platform/src/cb_pthreads.cc:71 (libplatform_so.so.0.1.0+0x000000010e1b) #16 <null> <null> (libtsan.so.0+0x000000024feb) Fix by acquiring the stream mutex before accessing these. Change-Id: Ie14eb02e8e98c0aa5c9432c6f385766a215eca8f Reviewed-on: http://review.couchbase.org/c/kv_engine/+/135531 Tested-by: Build Bot <build@couchbase.com> Reviewed-by: James Harrison <james.harrison@couchbase.com> Reviewed-by: Paolo Cocchi <paolo.cocchi@couchbase.com>
1 parent 56c501a commit 56af85d

File tree

2 files changed

+19
-21
lines changed

2 files changed

+19
-21
lines changed

engines/ep/src/dcp/passive_stream.cc

+16-15
Original file line numberDiff line numberDiff line change
@@ -237,27 +237,28 @@ void PassiveStream::reconnectStream(VBucketPtr& vb,
237237
info.range.setStart(info.start);
238238
}
239239

240-
snap_start_seqno_ = info.range.getStart();
241-
start_seqno_ = info.start;
242-
snap_end_seqno_ = info.range.getEnd();
243-
244240
auto stream_req_value = createStreamReqValue();
245241

246-
log(spdlog::level::level_enum::info,
247-
"({}) Attempting to reconnect stream with opaque {}, start seq "
248-
"no {}, end seq no {}, snap start seqno {}, snap end seqno {}, and vb"
249-
" manifest uid {}",
250-
vb_,
251-
new_opaque,
252-
start_seqno,
253-
end_seqno_,
254-
snap_start_seqno_,
255-
snap_end_seqno_,
256-
stream_req_value.empty() ? "none" : stream_req_value);
257242
{
258243
LockHolder lh(streamMutex);
244+
245+
snap_start_seqno_ = info.range.getStart();
246+
start_seqno_ = info.start;
247+
snap_end_seqno_ = info.range.getEnd();
259248
last_seqno.store(start_seqno);
260249

250+
log(spdlog::level::level_enum::info,
251+
"({}) Attempting to reconnect stream with opaque {}, start seq "
252+
"no {}, end seq no {}, snap start seqno {}, snap end seqno {}, and "
253+
"vb manifest uid {}",
254+
vb_,
255+
new_opaque,
256+
start_seqno,
257+
end_seqno_,
258+
snap_start_seqno_,
259+
snap_end_seqno_,
260+
stream_req_value.empty() ? "none" : stream_req_value);
261+
261262
pushToReadyQ(std::make_unique<StreamRequest>(vb_,
262263
new_opaque,
263264
flags_,

engines/ep/src/dcp/stream.cc

+3-6
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ uint64_t Stream::getReadyQueueMemory() {
123123

124124
void Stream::addStats(const AddStatFn& add_stat, const void* c) {
125125
try {
126+
LockHolder lh(streamMutex);
127+
126128
const int bsize = 1024;
127129
char buffer[bsize];
128130
checked_snprintf(
@@ -173,17 +175,12 @@ void Stream::addStats(const AddStatFn& add_stat, const void* c) {
173175
vb_.get());
174176
add_casted_stat(buffer, itemsReady.load(), add_stat, c);
175177

176-
size_t readyQsize;
177-
{
178-
std::lock_guard<std::mutex> lh(streamMutex);
179-
readyQsize = readyQ.size();
180-
}
181178
checked_snprintf(buffer,
182179
bsize,
183180
"%s:stream_%d_readyQ_items",
184181
name_.c_str(),
185182
vb_.get());
186-
add_casted_stat(buffer, readyQsize, add_stat, c);
183+
add_casted_stat(buffer, readyQ.size(), add_stat, c);
187184
} catch (std::exception& error) {
188185
EP_LOG_WARN("Stream::addStats: Failed to build stats: {}",
189186
error.what());

0 commit comments

Comments
 (0)