Skip to content

Commit ea01575

Browse files
abhinavdangetichiyoung
authored andcommitted
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) couchbase#1 ExecutorThread::run() /home/abhinav/couchbase/ep-engine/src/executorthread.cc:112 (ep.so+0x0000000f87f6) couchbase#2 launch_executor_thread(void*) /home/abhinav/couchbase/ep-engine/src/executorthread.cc:33 (ep.so+0x0000000f8395) couchbase#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) couchbase#1 DcpConnMap::newConsumer(void const*, std::string const&) /home/abhinav/couchbase/ep-engine/src/connmap.cc:969 (ep.so+0x000000048384) couchbase#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) couchbase#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) couchbase#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) couchbase#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/55784 Tested-by: buildbot <[email protected]> Reviewed-by: Sundararaman Sridharan <[email protected]> Reviewed-by: Chiyoung Seo <[email protected]>
1 parent 4bfdc4f commit ea01575

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
@@ -266,11 +266,11 @@ class ConnHandler : public RCValue {
266266
void releaseReference(bool force = false);
267267

268268
void setSupportAck(bool ack) {
269-
supportAck = ack;
269+
supportAck.store(ack);
270270
}
271271

272272
bool supportsAck() const {
273-
return supportAck;
273+
return supportAck.load();
274274
}
275275

276276
void setSupportCheckpointSync(bool checkpointSync) {
@@ -299,10 +299,10 @@ class ConnHandler : public RCValue {
299299

300300
virtual void addStats(ADD_STAT add_stat, const void *c) {
301301
addStat("type", getType(), add_stat, c);
302-
addStat("created", created, add_stat, c);
303-
addStat("connected", connected, add_stat, c);
304-
addStat("pending_disconnect", disconnect, add_stat, c);
305-
addStat("supports_ack", supportAck, add_stat, c);
302+
addStat("created", created.load(), add_stat, c);
303+
addStat("connected", connected.load(), add_stat, c);
304+
addStat("pending_disconnect", disconnect.load(), add_stat, c);
305+
addStat("supports_ack", supportAck.load(), add_stat, c);
306306
addStat("reserved", reserved.load(), add_stat, c);
307307

308308
if (numDisconnects > 0) {
@@ -364,19 +364,19 @@ class ConnHandler : public RCValue {
364364
if (!s) {
365365
++numDisconnects;
366366
}
367-
connected = s;
367+
connected.store(s);
368368
}
369369

370370
bool isConnected() {
371-
return connected;
371+
return connected.load();
372372
}
373373

374374
bool doDisconnect() {
375-
return disconnect;
375+
return disconnect.load();
376376
}
377377

378378
virtual void setDisconnect(bool val) {
379-
disconnect = val;
379+
disconnect.store(val);
380380
}
381381

382382
static std::string getAnonName() {
@@ -414,16 +414,16 @@ class ConnHandler : public RCValue {
414414
hrtime_t connToken;
415415

416416
//! Connection creation time
417-
rel_time_t created;
417+
AtomicValue<rel_time_t> created;
418418

419419
//! The last time this connection's step function was called
420420
AtomicValue<rel_time_t> lastWalkTime;
421421

422422
//! Should we disconnect as soon as possible?
423-
bool disconnect;
423+
AtomicValue<bool> disconnect;
424424

425425
//! Is this tap conenction connected?
426-
bool connected;
426+
AtomicValue<bool> connected;
427427

428428
//! Number of times this connection was disconnected
429429
AtomicValue<size_t> numDisconnects;
@@ -432,7 +432,7 @@ class ConnHandler : public RCValue {
432432
rel_time_t expiryTime;
433433

434434
//! Whether or not this connection supports acking
435-
bool supportAck;
435+
AtomicValue<bool> supportAck;
436436

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

0 commit comments

Comments
 (0)