Skip to content

Commit a479e1a

Browse files
Address possible data race with loggerApi
WARNING: ThreadSanitizer: data race (pid=16718) Write of size 8 at 0x7f6a616aad60 by main thread: #0 create_instance /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1809:9 (ep.so+0x0000000b2c9c) couchbase#1 create_engine_instance /home/abhinav/couchbase/memcached/utilities/engine_loader.c:121:31 (libmcd_util.so.1.0.0+0x0000000056fd) couchbase#2 create_bucket(bool, char const*) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:924:9 (engine_testapp+0x0000000b99ed) couchbase#3 create_buckets(char const*, int, std::vector<BucketHolder, std::allocator<BucketHolder> >&) /home/abhinav/couchbase/ep-engine/tests/ep_testsuite_common.cc:316:36 (ep_testsuite.so+0x0000000ab215) couchbase#4 test_multi_bucket_set_get(test*) /home/abhinav/couchbase/ep-engine/tests/ep_testsuite.cc:14174:9 (ep_testsuite.so+0x000000093011) couchbase#5 execute_test(test, char const*, char const*) /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:1103:19 (engine_testapp+0x0000000b937d) #6 main /home/abhinav/couchbase/memcached/programs/engine_testapp/engine_testapp.cc:1439 (engine_testapp+0x0000000b937d) Previous read of size 8 at 0x7f6a616aad60 by thread T2 (mutexes: write M11526, write M11540): #0 LOG(EXTENSION_LOG_LEVEL, char const*, ...) /home/abhinav/couchbase/ep-engine/src/ep_engine.cc:1916:9 (ep.so+0x0000000b2eb4) couchbase#1 TaskQueue::_schedule(SingleThreadedRCPtr<GlobalTask>&) /home/abhinav/couchbase/ep-engine/src/taskqueue.cc:225:5 (ep.so+0x000000141957) couchbase#2 TaskQueue::schedule(SingleThreadedRCPtr<GlobalTask>&) /home/abhinav/couchbase/ep-engine/src/taskqueue.cc:239:5 (ep.so+0x000000141bde) couchbase#3 ExecutorPool::_schedule(SingleThreadedRCPtr<GlobalTask>, task_type_t) /home/abhinav/couchbase/ep-engine/src/executorpool.cc:430:5 (ep.so+0x0000000ef2f5) couchbase#4 ExecutorPool::schedule(SingleThreadedRCPtr<GlobalTask>, task_type_t) /home/abhinav/couchbase/ep-engine/src/executorpool.cc:437:17 (ep.so+0x0000000ef44f) couchbase#5 Warmup::scheduleEstimateDatabaseItemCount() /home/abhinav/couchbase/ep-engine/src/warmup.cc:538:9 (ep.so+0x000000158b7a) #6 Warmup::step() /home/abhinav/couchbase/ep-engine/src/warmup.cc:883:13 (ep.so+0x000000155510) #7 Warmup::transition(int, bool) /home/abhinav/couchbase/ep-engine/src/warmup.cc:920:9 (ep.so+0x00000015856e) #8 Warmup::createVBuckets(unsigned short) /home/abhinav/couchbase/ep-engine/src/warmup.cc:525 (ep.so+0x00000015856e) #9 WarmupCreateVBuckets::run() /home/abhinav/couchbase/ep-engine/src/warmup.h:249:9 (ep.so+0x000000165236) #10 ExecutorThread::run() /home/abhinav/couchbase/ep-engine/src/executorthread.cc:112:26 (ep.so+0x0000000f8296) #11 launch_executor_thread(void*) /home/abhinav/couchbase/ep-engine/src/executorthread.cc:33:9 (ep.so+0x0000000f7e35) #12 platform_thread_wrap /home/abhinav/couchbase/platform/src/cb_pthreads.c:23:5 (libplatform.so.0.1.0+0x000000003d31) Location is global 'loggerApi' of size 8 at 0x7f6a616aad60 (ep.so+0x00000042ad60) Change-Id: I3ec917106a9684dfc8ce26664a6926135b6cb299 Reviewed-on: http://review.couchbase.org/55840 Reviewed-by: Chiyoung Seo <[email protected]> Tested-by: buildbot <[email protected]>
1 parent e06c9f8 commit a479e1a

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

src/ep_engine.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
#include "dcp/producer.h"
5151
#include "warmup.h"
5252

53-
static ALLOCATOR_HOOKS_API *hooksApi;
54-
static SERVER_LOG_API *loggerApi;
53+
static AtomicValue<ALLOCATOR_HOOKS_API*> hooksApi;
54+
static AtomicValue<SERVER_LOG_API*> loggerApi;
5555

5656
static size_t percentOf(size_t val, double percent) {
5757
return static_cast<size_t>(static_cast<double>(val) * percent);
@@ -1805,8 +1805,8 @@ extern "C" {
18051805
return ENGINE_ENOTSUP;
18061806
}
18071807

1808-
hooksApi = api->alloc_hooks;
1809-
loggerApi = api->log;
1808+
hooksApi.store(api->alloc_hooks, std::memory_order_relaxed);
1809+
loggerApi.store(api->log, std::memory_order_relaxed);
18101810
MemoryTracker::getInstance();
18111811
ObjectRegistry::initialize(api->alloc_hooks->get_allocation_size);
18121812

@@ -1913,18 +1913,18 @@ extern "C" {
19131913
void LOG(EXTENSION_LOG_LEVEL severity, const char *fmt, ...) {
19141914
char buffer[2048];
19151915

1916-
if (loggerApi != nullptr) {
1916+
if (loggerApi.load(std::memory_order_relaxed) != nullptr) {
19171917
static EXTENSION_LOGGER_DESCRIPTOR* logger;
19181918
if (logger == nullptr) {
19191919
// This locking isn't really needed because get_logger will
19201920
// always return the same address, but it'll keep thread sanitizer
19211921
// and other tools from complaining ;-)
19221922
static std::mutex mutex;
19231923
std::lock_guard<std::mutex> guard(mutex);
1924-
logger = loggerApi->get_logger();
1924+
logger = loggerApi.load(std::memory_order_relaxed)->get_logger();
19251925
}
19261926

1927-
if (loggerApi->get_level() <= severity) {
1927+
if (loggerApi.load(std::memory_order_relaxed)->get_level() <= severity) {
19281928
EventuallyPersistentEngine *engine = ObjectRegistry::onSwitchThread(NULL, true);
19291929
va_list va;
19301930
va_start(va, fmt);
@@ -1942,7 +1942,7 @@ void LOG(EXTENSION_LOG_LEVEL severity, const char *fmt, ...) {
19421942
}
19431943

19441944
ALLOCATOR_HOOKS_API *getHooksApi(void) {
1945-
return hooksApi;
1945+
return hooksApi.load(std::memory_order_relaxed);
19461946
}
19471947

19481948
EventuallyPersistentEngine::EventuallyPersistentEngine(

0 commit comments

Comments
 (0)