Skip to content

Commit ee44636

Browse files
abhinavdangetichiyoung
authored andcommitted
Address data race in DCP-Producer seen while making a stats request
WARNING: ThreadSanitizer: data race (pid=82258) Read of size 1 at 0x7d4c0000a208 by thread T11 (mutexes: write M2483, write M19044): #0 DcpProducer::addStats(void (*)(char const*, unsigned short, char const*, unsigned int, void const*), void const*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/dcp/producer.cc:601 (ep.so+0x000000063e2d) couchbase#1 ConnStatBuilder::operator()(SingleThreadedRCPtr<ConnHandler>&) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/ep_engine.cc:3903 (ep.so+0x0000000d6931) couchbase#2 EventuallyPersistentEngine::doDcpStats(void const*, void (*)(char const*, unsigned short, char const*, unsigned int, void const*)) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/ep_engine.cc:4160 (ep.so+0x0000000b904a) couchbase#3 EventuallyPersistentEngine::getStats(void const*, char const*, int, void (*)(char const*, unsigned short, char const*, unsigned int, void const*)) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/ep_engine.cc:4580 (ep.so+0x0000000bcba4) couchbase#4 EventuallyPersistentStore::snapshotStats() /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/ep.cc:1700 (ep.so+0x000000088386) couchbase#5 StatSnap::run() /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/tasks.cc:98 (ep.so+0x00000012ba26) #6 ExecutorThread::run() /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/executorthread.cc:115 (ep.so+0x0000000eaeed) #7 launch_executor_thread(void*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/executorthread.cc:33 (ep.so+0x0000000eaab5) #8 platform_thread_wrap(void*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/platform/src/cb_pthreads.cc:53 (libplatform.so.0.1.0+0x0000000048bb) Previous write of size 1 at 0x7d4c0000a208 by main thread: #0 DcpProducer::handleResponse(protocol_binary_response_header*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/dcp/producer.cc:547 (ep.so+0x000000063231) couchbase#1 EvpDcpResponseHandler(engine_interface*, void const*, protocol_binary_response_header*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/src/ep_engine.cc:1765 (ep.so+0x0000000ae08b) couchbase#2 mock_dcp_response_handler(engine_interface*, void const*, protocol_binary_response_header*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/memcached/programs/engine_testapp/engine_testapp.cc:796 (engine_testapp+0x0000004c68e5) couchbase#3 sendDcpAck(engine_interface*, engine_interface_v1*, void const*, protocol_binary_command, protocol_binary_response_status, unsigned int) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/tests/ep_test_apis.cc:983 (ep_testsuite.so+0x0000000a6a22) couchbase#4 test_dcp_noop(engine_interface*, engine_interface_v1*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/ep-engine/tests/ep_testsuite.cc:3975 (ep_testsuite.so+0x000000068deb) couchbase#5 execute_test(test, char const*, char const*) /home/couchbase/jenkins/workspace/ep-engine-threadsanitizer-master/memcached/programs/engine_testapp/engine_testapp.cc:1090 (engine_testapp+0x0000004c4192) #6 __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226 (libc.so.6+0x00000002176c) Change-Id: Ice7236da5cc885d9e7612894ba3d37e357e13b4a Reviewed-on: http://review.couchbase.org/56306 Tested-by: abhinav dangeti <abhinav@couchbase.com> Tested-by: buildbot <build@couchbase.com> Reviewed-by: Chiyoung Seo <chiyoung@couchbase.com>
1 parent 49500c9 commit ee44636

2 files changed

Lines changed: 8 additions & 10 deletions

File tree

src/dcp/producer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ class DcpProducer : public Producer {
165165
rel_time_t sendTime;
166166
uint32_t opaque;
167167
uint32_t noopInterval;
168-
bool pendingRecv;
169-
bool enabled;
168+
Couchbase::RelaxedAtomic<bool> pendingRecv;
169+
Couchbase::RelaxedAtomic<bool> enabled;
170170
} noopCtx;
171171

172172
std::string priority;

tests/ep_testsuite.cc

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3967,15 +3967,14 @@ static enum test_result test_dcp_noop(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *h1) {
39673967
if (err == ENGINE_DISCONNECT) {
39683968
done = true;
39693969
} else {
3970-
std::string stat;
39713970
if (dcp_last_op == PROTOCOL_BINARY_CMD_DCP_NOOP) {
39723971
done = true;
3973-
stat = get_str_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp");
3974-
check(stat.compare("true") == 0, "Didn't send noop");
3972+
checkeq(1, get_int_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp"),
3973+
"Didn't send noop");
39753974
sendDcpAck(h, h1, cookie, PROTOCOL_BINARY_CMD_DCP_NOOP,
39763975
PROTOCOL_BINARY_RESPONSE_SUCCESS, dcp_last_opaque);
3977-
stat = get_str_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp");
3978-
check(stat.compare("false") == 0, "Didn't ack noop");
3976+
checkeq(0, get_int_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp"),
3977+
"Didn't ack noop");
39793978
} else if (dcp_last_op != 0) {
39803979
abort();
39813980
}
@@ -4018,10 +4017,9 @@ static enum test_result test_dcp_noop_fail(ENGINE_HANDLE *h,
40184017
done = true;
40194018
disconnected = true;
40204019
} else {
4021-
std::string stat;
40224020
if (dcp_last_op == PROTOCOL_BINARY_CMD_DCP_NOOP) {
4023-
stat = get_str_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp");
4024-
check(stat.compare("true") == 0, "Didn't send noop");
4021+
checkeq(1, get_int_stat(h, h1, "eq_dcpq:unittest:noop_wait", "dcp"),
4022+
"Didn't send noop");
40254023
testHarness.time_travel(201);
40264024
} else if (dcp_last_op != 0) {
40274025
abort();

0 commit comments

Comments
 (0)