Skip to content

Commit a1e5722

Browse files
daverigbyabhinavdangeti
authored andcommitted
Fix data race on mock_connstruct::references
Add identified by ThreadSanitizer. mock_connstruct::references is accessed concurrently from two threads; update to use std::atomic. Details: WARNING: ThreadSanitizer: data race (pid=32054) Write of size 4 at 0x7d280000eff0 by main thread: #0 mock_cookie_reserve() /memcached/programs/engine_testapp/mock_server.cc:129:5 (engine_testapp+0x0000004c77c3) #1 EventuallyPersistentEngine::reserveCookie() /ep-engine/src/ep_engine.cc:2016:28 (ep.so+0x0000000a2f05) #2 EventuallyPersistentEngine::createTapQueue() /ep-engine/src/ep_engine.cc:2574 (ep.so+0x0000000a2f05) #3 EvpGetTapIterator() /ep-engine/src/ep_engine.cc:1463:17 (ep.so+0x00000009f943) #4 mock_get_tap_iterator() /memcached/programs/engine_testapp/engine_testapp.cc:467:20 (engine_testapp+0x0000004c59ce) #5 test_tap_ack_stream() /ep-engine/tests/ep_testsuite.cc:7341:20 (ep_testsuite.so+0x00000003edf0) #6 execute_test() /memcached/programs/engine_testapp/engine_testapp.cc:1090:19 (engine_testapp+0x0000004c4142) memcached#7 main /memcached/programs/engine_testapp/engine_testapp.cc:1439 (engine_testapp+0x0000004c4142) Previous write of size 4 at 0x7d280000eff0 by thread T10 (mutexes: write M2181): #0 mock_cookie_release() /memcached/programs/engine_testapp/mock_server.cc:136:5 (engine_testapp+0x0000004c7801) #1 EventuallyPersistentEngine::releaseCookie() /ep-engine/src/ep_engine.cc:2025:28 (ep.so+0x0000000a1142) #2 ConnHandler::releaseReference() /ep-engine/src/tapconnection.cc:311:9 (ep.so+0x0000000fc5d2) #3 TapConnMap::manageConnections() /ep-engine/src/connmap.cc:532:10 (ep.so+0x00000003e972) #4 ConnManager::run() /ep-engine/src/connmap.cc:150:9 (ep.so+0x00000004a60e) #5 ExecutorThread::run() /ep-engine/src/executorthread.cc:115:26 (ep.so+0x0000000d8a9e) #6 launch_executor_thread() /ep-engine/src/executorthread.cc:33:9 (ep.so+0x0000000d8615) memcached#7 platform_thread_wrap /platform/src/cb_pthreads.c:23:5 (libplatform.so.0.1.0+0x000000003c31) Change-Id: Ib1861cf9b66e31b5f50e6b114119da72d54cde10 Reviewed-on: http://review.couchbase.org/55866 Reviewed-by: abhinav dangeti <[email protected]> Tested-by: buildbot <[email protected]>
1 parent 7085f0a commit a1e5722

File tree

2 files changed

+4
-3
lines changed

2 files changed

+4
-3
lines changed

programs/engine_testapp/mock_server.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ static ENGINE_ERROR_CODE mock_cookie_reserve(const void *cookie) {
133133
static ENGINE_ERROR_CODE mock_cookie_release(const void *cookie) {
134134
struct mock_connstruct *c = (struct mock_connstruct *)cookie;
135135

136-
c->references--;
137-
if (c->references == 0) {
136+
const int new_rc = --c->references;
137+
if (new_rc == 0) {
138138
free(c);
139139
}
140140
return ENGINE_SUCCESS;

programs/engine_testapp/mock_server.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <memcached/engine.h>
55
#include <platform/platform.h>
66

7+
#include <atomic>
78
#include <string>
89

910
struct mock_connstruct {
@@ -23,7 +24,7 @@ struct mock_connstruct {
2324
bool handle_datatype_support;
2425
cb_mutex_t mutex;
2526
cb_cond_t cond;
26-
int references;
27+
std::atomic<int> references;
2728
};
2829

2930
struct mock_callbacks {

0 commit comments

Comments
 (0)