Skip to content

Commit a32ee62

Browse files
Address data race in ep_test_apis/testsuite
WARNING: ThreadSanitizer: data race (pid=18824) Write of size 4 at 0x7fcc31350244 by thread T12 (mutexes: write M44413): #0 add_response /home/abhinav/couchbase/ep-engine/tests/ep_test_apis.cc:75 (ep_testsuite.so+0x0000000acbcc) couchbase#1 sendResponse(bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*), void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:92 (ep.so+0x0000000d004c) couchbase#2 processUnknownCommand(EventuallyPersistentEngine*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1266 (ep.so+0x0000000d603c) couchbase#3 EvpUnknownCommand(engine_interface*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1387 (ep.so+0x0000000b3f58) couchbase#4 mock_unknown_command(engine_interface*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:380 (engine_testapp+0x0000000bab29) couchbase#5 del_with_meta(engine_interface*, engine_interface_v1*, char const*, unsigned long, unsigned int, ItemMetaData*, unsigned long, bool, bool, long, unsigned char, void const*) /home/abhinav/couchbase/ep-engine/tests/ep_test_apis.cc:360 (ep_testsuite.so+0x0000000ae69f) #6 multi_del_with_meta(void*) /home/abhinav/couchbase/ep-engine/tests/ep_testsuite.cc:13299 (ep_testsuite.so+0x00000009572e) #7 platform_thread_wrap /home/abhinav/couchbase/platform/src/cb_pthreads.c:23 (libplatform.so.0.1.0+0x000000003d31) Previous write of size 4 at 0x7fcc31350244 by thread T11 (mutexes: write M1638603450185076640): #0 add_response /home/abhinav/couchbase/ep-engine/tests/ep_test_apis.cc:75 (ep_testsuite.so+0x0000000acbcc) couchbase#1 sendResponse(bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*), void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:92 (ep.so+0x0000000ced72) couchbase#2 processUnknownCommand(EventuallyPersistentEngine*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1258 (ep.so+0x0000000d5718) couchbase#3 EvpUnknownCommand(engine_interface*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1387 (ep.so+0x0000000b3f58) couchbase#4 mock_unknown_command(engine_interface*, void const*, protocol_binary_request_header*, bool (*)(void const*, unsigned short, void const*, unsigned char, void const*, unsigned int, unsigned char, unsigned short, unsigned long, void const*)) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:380 (engine_testapp+0x0000000bab29) couchbase#5 set_with_meta(engine_interface*, engine_interface_v1*, char const*, unsigned long, char const*, unsigned long, unsigned int, ItemMetaData*, unsigned long, bool, unsigned char, bool, long, unsigned char, void const*) /home/abhinav/couchbase/ep-engine/tests/ep_test_apis.cc:702 (ep_testsuite.so+0x0000000b24db) #6 multi_set_with_meta(void*) /home/abhinav/couchbase/ep-engine/tests/ep_testsuite.cc:13279 (ep_testsuite.so+0x000000094e33) #7 platform_thread_wrap /home/abhinav/couchbase/platform/src/cb_pthreads.c:23 (libplatform.so.0.1.0+0x000000003d31) Change-Id: Ic53d401fb674dbe161aa73381e2c08c5995f262a Reviewed-on: http://review.couchbase.org/55849 Reviewed-by: Chiyoung Seo <[email protected]> Tested-by: buildbot <[email protected]>
1 parent a479e1a commit a32ee62

File tree

3 files changed

+20
-20
lines changed

3 files changed

+20
-20
lines changed

tests/ep_test_apis.cc

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,17 @@
3131

3232
std::map<std::string, std::string> vals;
3333
bool dump_stats = false;
34-
protocol_binary_response_status last_status =
35-
static_cast<protocol_binary_response_status>(0);
34+
AtomicValue<protocol_binary_response_status> last_status(
35+
static_cast<protocol_binary_response_status>(0));
3636
std::string last_key;
3737
std::string last_body;
38-
bool last_deleted_flag = false;
39-
uint8_t last_conflict_resolution_mode = static_cast<uint8_t>(-1);
40-
uint64_t last_cas = 0;
41-
uint8_t last_datatype = 0x00;
38+
bool last_deleted_flag(false);
39+
uint8_t last_conflict_resolution_mode(static_cast<uint8_t>(-1));
40+
AtomicValue<uint64_t> last_cas(0);
41+
AtomicValue<uint8_t> last_datatype(0x00);
4242
ItemMetaData last_meta;
43-
uint64_t last_uuid = 0;
44-
uint64_t last_seqno = 0;
43+
AtomicValue<uint64_t> last_uuid(0);
44+
AtomicValue<uint64_t> last_seqno(0);
4545

4646
extern "C" bool add_response_get_meta(const void *key, uint16_t keylen,
4747
const void *ext, uint8_t extlen,
@@ -72,11 +72,11 @@ bool add_response(const void *key, uint16_t keylen, const void *ext,
7272
(void)ext;
7373
(void)extlen;
7474
(void)cookie;
75-
last_status = static_cast<protocol_binary_response_status>(status);
75+
last_status.store(static_cast<protocol_binary_response_status>(status));
7676
last_body.assign(static_cast<const char*>(body), bodylen);
7777
last_key.assign(static_cast<const char*>(key), keylen);
78-
last_cas = cas;
79-
last_datatype = datatype;
78+
last_cas.store(cas);
79+
last_datatype.store(datatype);
8080
return true;
8181
}
8282

@@ -115,8 +115,8 @@ bool add_response_set_del_meta(const void *key, uint16_t keylen, const void *ext
115115
uint64_t seqno;
116116
memcpy(&vb_uuid, ext_bytes, 8);
117117
memcpy(&seqno, ext_bytes + 8, 8);
118-
last_uuid = ntohll(vb_uuid);
119-
last_seqno = ntohll(seqno);
118+
last_uuid.store(ntohll(vb_uuid));
119+
last_seqno.store(ntohll(seqno));
120120
}
121121

122122
return add_response(key, keylen, ext, extlen, body, bodylen, datatype,
@@ -959,7 +959,7 @@ bool verify_vbucket_state(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *h1, uint16_t vb,
959959
if (last_status != PROTOCOL_BINARY_RESPONSE_SUCCESS) {
960960
if (!mute) {
961961
fprintf(stderr, "Last protocol status was %d (%s)\n",
962-
last_status,
962+
last_status.load(),
963963
last_body.size() > 0 ? last_body.c_str() : "unknown");
964964
}
965965
return false;

tests/ep_test_apis.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,16 @@ ENGINE_ERROR_CODE vb_map_response(const void *cookie, const void *map,
5555
}
5656
#endif
5757

58-
extern protocol_binary_response_status last_status;
58+
extern AtomicValue<protocol_binary_response_status> last_status;
5959
extern std::string last_key;
6060
extern std::string last_body;
6161
extern bool dump_stats;
6262
extern std::map<std::string, std::string> vals;
6363
extern uint32_t last_bodylen;
64-
extern uint64_t last_cas;
65-
extern uint8_t last_datatype;
66-
extern uint64_t last_uuid;
67-
extern uint64_t last_seqno;
64+
extern AtomicValue<uint64_t> last_cas;
65+
extern AtomicValue<uint8_t> last_datatype;
66+
extern AtomicValue<uint64_t> last_uuid;
67+
extern AtomicValue<uint64_t> last_seqno;
6868
extern bool last_deleted_flag;
6969
extern uint8_t last_conflict_resolution_mode;
7070
extern ItemMetaData last_meta;

tests/ep_testsuite.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ static enum test_result test_getl(ENGINE_HANDLE *h, ENGINE_HANDLE_V1 *h1) {
226226
getl(h, h1, key, vbucketId, expiration);
227227
check(last_status == PROTOCOL_BINARY_RESPONSE_SUCCESS,
228228
"Aquire lock should have succeeded");
229-
auto locked_cas = last_cas;
229+
auto locked_cas = last_cas.load();
230230
/* append should fail */
231231
check(storeCasVb11(h, h1, NULL, OPERATION_APPEND, key,
232232
binaryData2, sizeof(binaryData2) - 1, 82758, &i, 0, 0)

0 commit comments

Comments
 (0)