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

ep-engine: Potential data race on ConnHandler::cookie

    XMLWordPrintable

Details

    • Untriaged
    • Unknown

    Description

      ThreadSanitizer flags a data race on ConnHandler::cookie - see below.

      I believe this race has the potential for an incorrect cookie to be notified when a client reconnects to a TAP stream with the same name as an existing one - i.e. when resuming a stream.

      This could happen as the call to ConnHandler::setStream() is performed in a different thread than notifyPausedConnection:

      WARNING: ThreadSanitizer: data race (pid=13556)
        Write of size 8 at 0x7d600000f038 by main thread (mutexes: write M1503):
          #0 ConnHandler::setCookie(void const*) /home/daver/repos/couchbase/server/ep-engine/src/tapconnection.h:347 (ep.so+0x00000023bb8e)
          #1 TapConnMap::newProducer(void const*, std::string const&, unsigned int, unsigned long, int, std::vector<unsigned short, std::allocator<unsigned short> > const&, std::map<unsigned short, unsigned long, std::less<unsigned short>, std::allocator<std::pair<unsigned short const, unsigned long> > > const&) /home/daver/repos/couchbase/server/ep-engine/src/connmap.cc:436 (ep.so+0x00000022fdc0)
          #2 EventuallyPersistentEngine::createTapQueue(void const*, std::string&, unsigned int, void const*, unsigned long) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:2512 (ep.so+0x00000013f8c2)
          #3 EvpGetTapIterator(engine_interface*, void const*, void const*, unsigned long, unsigned int, void const*, unsigned long) /home/daver/repos/couchbase/server/ep-engine/src/ep_engine.cc:1388 (ep.so+0x000000137c83)
          #4 mock_get_tap_iterator /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:460 (engine_testapp+0x0000004bf67c)
          #5 test_tap_ack_stream(engine_interface*, engine_interface_v1*) /home/daver/repos/couchbase/server/ep-engine/tests/ep_testsuite.cc:6279 (ep_testsuite.so+0x0000000672f1)
          #6 execute_test /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:1042 (engine_testapp+0x0000004ba8ff)
          #7 main /home/daver/repos/couchbase/server/memcached/programs/engine_testapp/engine_testapp.c:1296 (engine_testapp+0x0000004b8861)
       
        Previous read of size 8 at 0x7d600000f038 by thread T15 (mutexes: write M1502):
          #0 ConnHandler::getCookie() const /home/daver/repos/couchbase/server/ep-engine/src/tapconnection.h:343 (ep.so+0x00000020ea1e)
          #1 ConnMap::notifyPausedConnection(SingleThreadedRCPtr<ConnHandler>, bool) /home/daver/repos/couchbase/server/ep-engine/src/connmap.cc:238 (ep.so+0x00000022d4b2)
          #2 bool TapConnMap::performOp<void*>(std::string const&, TapOperation<void*>&, void*) /home/daver/repos/couchbase/server/ep-engine/src/connmap.h:392 (ep.so+0x00000007f38b)
          #3 BackfillDiskLoad::run() /home/daver/repos/couchbase/server/ep-engine/src/backfill.cc:134 (ep.so+0x00000007c4b5)
          #4 ExecutorThread::run() /home/daver/repos/couchbase/server/ep-engine/src/executorthread.cc:109 (ep.so+0x0000001e3532)
          #5 launch_executor_thread(void*) /home/daver/repos/couchbase/server/ep-engine/src/executorthread.cc:34 (ep.so+0x0000001e2b5a)
          #6 platform_thread_wrap /home/daver/repos/couchbase/server/platform/src/cb_pthreads.c:19 (libplatform.so.0.1.0+0x0000000035dc)
      

      Note: already fixed in watson - http://review.couchbase.org/55794

      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