Skip to content

Commit aaa13b1

Browse files
abhinavdangetichiyoung
authored andcommitted
MB-19249: Address possible data races in ConnHandler context
WARNING: ThreadSanitizer: data race (pid=2443) Read of size 1 at 0x7d5000016a58 by thread T10: #0 ConnHandler::doDisconnect() /home/abhinav/couchbase/ep-engine/src/tapconnection.h:375 (ep.so+0x000000058416) #1 ExecutorThread::run() /home/abhinav/couchbase/ep-engine/src/executorthread.cc:112 (ep.so+0x0000000f87f6) #2 launch_executor_thread(void*) /home/abhinav/couchbase/ep-engine/src/executorthread.cc:33 (ep.so+0x0000000f8395) #3 platform_thread_wrap /home/abhinav/couchbase/platform/src/cb_pthreads.c:23 (libplatform.so.0.1.0+0x000000003d31) Previous write of size 1 at 0x7d5000016a58 by main thread: [failed to restore the stack] Location is heap block of size 480 at 0x7d5000016a00 allocated by main thread: #0 operator new(unsigned long) <null>:0 (engine_testapp+0x00000005084d) #1 DcpConnMap::newConsumer(void const*, std::string const&) /home/abhinav/couchbase/ep-engine/src/connmap.cc:969 (ep.so+0x000000048384) #2 EventuallyPersistentEngine::dcpOpen(void const*, unsigned int, unsigned int, unsigned int, void*, unsigned short) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:6189 (ep.so+0x0000000d3668) #3 EvpDcpOpen(engine_interface*, void const*, unsigned int, unsigned int, unsigned int, void*, unsigned short) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1494 (ep.so+0x0000000b4e5f) #4 mock_dcp_open(engine_interface*, void const*, unsigned int, unsigned int, unsigned int, void*, unsigned short) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:488 (engine_testapp+0x0000000bb015) #5 test_dcp_consumer_flow_control_aggressive(engine_interface*, engine_interface_v1*) /home/abhinav/couchbase/ep-engine/tests/ep_testsuite.cc:3826 (ep_testsuite.so+0x00000006ecfd) #6 execute_test(test, char const*, char const*) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:1090 (engine_testapp+0x0000000b946c) #7 __libc_start_main /build/buildd/eglibc-2.19/csu/libc-start.c:287 (libc.so.6+0x000000021ec4) Change-Id: Id5223e93c416e5e5287c137d561aea1e453cbd41 Reviewed-on: http://review.couchbase.org/62970 Well-Formed: buildbot <[email protected]> Reviewed-by: Will Gardner <[email protected]> Tested-by: buildbot <[email protected]>
1 parent c8b050e commit aaa13b1

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

src/tapconnection.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,11 @@ class ConnHandler : public RCValue {
269269
void releaseReference(bool force = false);
270270

271271
void setSupportAck(bool ack) {
272-
supportAck = ack;
272+
supportAck.store(ack);
273273
}
274274

275275
bool supportsAck() const {
276-
return supportAck;
276+
return supportAck.load();
277277
}
278278

279279
void setSupportCheckpointSync(bool checkpointSync) {
@@ -302,10 +302,10 @@ class ConnHandler : public RCValue {
302302

303303
virtual void addStats(ADD_STAT add_stat, const void *c) {
304304
addStat("type", getType(), add_stat, c);
305-
addStat("created", created, add_stat, c);
306-
addStat("connected", connected, add_stat, c);
307-
addStat("pending_disconnect", disconnect, add_stat, c);
308-
addStat("supports_ack", supportAck, add_stat, c);
305+
addStat("created", created.load(), add_stat, c);
306+
addStat("connected", connected.load(), add_stat, c);
307+
addStat("pending_disconnect", disconnect.load(), add_stat, c);
308+
addStat("supports_ack", supportAck.load(), add_stat, c);
309309
addStat("reserved", reserved.load(), add_stat, c);
310310

311311
if (numDisconnects > 0) {
@@ -367,19 +367,19 @@ class ConnHandler : public RCValue {
367367
if (!s) {
368368
++numDisconnects;
369369
}
370-
connected = s;
370+
connected.store(s);
371371
}
372372

373373
bool isConnected() {
374-
return connected;
374+
return connected.load();
375375
}
376376

377377
bool doDisconnect() {
378-
return disconnect;
378+
return disconnect.load();
379379
}
380380

381381
virtual void setDisconnect(bool val) {
382-
disconnect = val;
382+
disconnect.store(val);
383383
}
384384

385385
static std::string getAnonName() {
@@ -417,16 +417,16 @@ class ConnHandler : public RCValue {
417417
hrtime_t connToken;
418418

419419
//! Connection creation time
420-
rel_time_t created;
420+
AtomicValue<rel_time_t> created;
421421

422422
//! The last time this connection's step function was called
423423
AtomicValue<rel_time_t> lastWalkTime;
424424

425425
//! Should we disconnect as soon as possible?
426-
bool disconnect;
426+
AtomicValue<bool> disconnect;
427427

428428
//! Is this tap conenction connected?
429-
bool connected;
429+
AtomicValue<bool> connected;
430430

431431
//! Number of times this connection was disconnected
432432
AtomicValue<size_t> numDisconnects;
@@ -435,7 +435,7 @@ class ConnHandler : public RCValue {
435435
rel_time_t expiryTime;
436436

437437
//! Whether or not this connection supports acking
438-
bool supportAck;
438+
AtomicValue<bool> supportAck;
439439

440440
//! A counter used to generate unique names
441441
static AtomicValue<uint64_t> counter_;

0 commit comments

Comments
 (0)