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

          For Gerrit Dashboard: MB-19273
          # Subject Branch Project Status CR V

          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