Uploaded image for project: 'Couchbase Server'
  1. Couchbase Server
  2. MB-19273

ep-engine: Benign data race on PassiveStream::buffer.{bytes,items}

    XMLWordPrintable

Details

    • 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

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              drigby Dave Rigby (Inactive)
              drigby Dave Rigby (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Gerrit Reviews

                  PagerDuty