Details
-
Bug
-
Resolution: Fixed
-
Major
-
3.1.4
-
Untriaged
-
Unknown
Description
As reported by ThreadSanitizer (see below), there is a dirty read on buffer.items & buffer.bytes during stat writing, due to PassiveStream::addStats not acquiring the bufMutex lock before reading.
This appears benign as the stat is only user sent to users, not used by ns_server etc for any calculation.
WARNING: ThreadSanitizer: data race (pid=28418)
|
Read of size 8 at 0x7d5000018128 by main thread (mutexes: write M23810, write M969):
|
#0 void STATWRITER_NAMESPACE::add_casted_stat<unsigned long>(char const*, unsigned long const&, void (*)(char const*, unsigned short, char const*, unsigned int, void const*), void const*) /home/daver/repos/couchbase/server/ep-engine/src/statwriter.h:47 (ep.so+0x0000000afe89)
|
#1 PassiveStream::addStats(void (*)(char const*, unsigned short, char const*, unsigned int, void const*), void const*) /home/daver/repos/couchbase/server/ep-engine/src/dcp-stream.cc:1512 (ep.so+0x0000002a04ba)
|
#2 DcpConsumer::addStats(void (*)(char const*, unsigned short, char const*, unsigned int, void const*), void const*) /home/daver/repos/couchbase/server/ep-engine/src/dcp-consumer.cc:555 (ep.so+0x00000026e867)
|
#3 ConnStatBuilder::operator()(SingleThreadedRCPtr<ConnHandler>&) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:3696 (ep.so+0x0000001837c4)
|
#4 ConnStatBuilder std::for_each<std::_List_iterator<SingleThreadedRCPtr<ConnHandler> >, ConnStatBuilder>(std::_List_iterator<SingleThreadedRCPtr<ConnHandler> >, std::_List_iterator<SingleThreadedRCPtr<ConnHandler> >, ConnStatBuilder) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.3.0/../../../../include/c++/5.3.0/bits/stl_algo.h:3767 (ep.so+0x0
|
00000183425)
|
#5 void ConnMap::each_UNLOCKED<ConnStatBuilder>(ConnStatBuilder) /home/daver/repos/couchbase/server/ep-engine/src/connmap.h:148 (ep.so+0x000000183388)
|
#6 void ConnMap::each<ConnStatBuilder>(ConnStatBuilder) /home/daver/repos/couchbase/server/ep-engine/src/connmap.h:140 (ep.so+0x000000176dce)
|
#7 EventuallyPersistentEngine::doDcpStats(void const*, void (*)(char const*, unsigned short, char const*, unsigned int, void const*)) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:3949 (ep.so+0x00000014c5dd)
|
#8 EventuallyPersistentEngine::getStats(void const*, char const*, int, void (*)(char const*, unsigned short, char const*, unsigned int, void const*)) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:4359 (ep.so+0x000000150fe1)
|
#9 EvpGetStats(engine_interface*, void const*, char const*, int, void (*)(char const*, unsigned short, char const*, unsigned int, void const*)) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:214 (ep.so+0x000000137342)
|
#10 mock_get_stats /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:194 (engine_testapp+0x0000004bde63)
|
#11 get_int_stat(engine_interface*, engine_interface_v1*, char const*, char const*) /home/daver/repos/couchbase/server/ep-engine/tests/ep_test_apis.cc:771 (ep_testsuite.so+0x0000000e3c8a)
|
#12 wait_for_stat_to_be(engine_interface*, engine_interface_v1*, char const*, int, char const*) /home/daver/repos/couchbase/server/ep-engine/tests/ep_test_apis.cc:860 (ep_testsuite.so+0x0000000ea7cb)
|
#13 test_dcp_consumer_mutate(engine_interface*, engine_interface_v1*) /home/daver/repos/couchbase/server/ep-engine/tests/ep_testsuite.cc:5146 (ep_testsuite.so+0x0000000a1df1)
|
#14 execute_test /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:1042 (engine_testapp+0x0000004ba8ff)
|
#15 main /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:1296 (engine_testapp+0x0000004b8861)
|
|
Previous write of size 8 at 0x7d5000018128 by thread T18 (mutexes: write M23762):
|
#0 PassiveStream::processBufferedMessages(unsigned int&) /home/daver/repos/couchbase/server/ep-engine/src/dcp-stream.cc:1311 (ep.so+0x00000029e196)
|
#1 DcpConsumer::processBufferedItems() /home/daver/repos/couchbase/server/ep-engine/src/dcp-consumer.cc:599 (ep.so+0x0000002647e9)
|
#2 Processer::run() /home/daver/repos/couchbase/server/ep-engine/src/dcp-consumer.cc:48 (ep.so+0x0000002643ef)
|
#3 ExecutorThread::run() /home/daver/repos/couchbase/server/ep-engine/src/executorthread.cc:109 (ep.so+0x0000001e3742)
|
#4 launch_executor_thread(void*) /home/daver/repos/couchbase/server/ep-engine/src/executorthread.cc:34 (ep.so+0x0000001e2d6a)
|
#5 platform_thread_wrap /home/daver/repos/couchbase/server/platform/src/cb_pthreads.c:19 (libplatform.so.0.1.0+0x0000000035dc)
|
Note: While watson would appear to have the same code, no such data race is reported by ThreadSanitizer on the watson branch.
Attachments
Issue Links
- blocks
-
MB-19323 3.1.6 release
- Closed