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

Data race on StoredValue::datatype

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • Major
    • Morpheus
    • 7.6.0, 7.0.0, 7.0.5, 7.1.0, 7.2.0, 7.1.6, 7.2.5
    • couchbase-bucket
    • None
    • Untriaged
    • 0
    • Yes

    Description

      Data race is detected by ThreadSanitizer.

      00:49:49.474  WARNING: ThreadSanitizer: data race (pid=20603)
      00:49:49.474    Write of size 2 at 0x7b1800009c33 by thread T13 (mutexes: write M608684620615020664):
      00:49:49.474      #0 StoredValue::storeCompressedBuffer(std::basic_string_view<char, std::char_traits<char> >) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/stored-value.cc:457 (ep_testsuite+0x98f00b)
      00:49:49.474      #1 HashTable::storeCompressedBuffer(HashTable::HashBucketLock const&, std::basic_string_view<char, std::char_traits<char> >, StoredValue&) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/hash_table.cc:1265 (ep_testsuite+0xa7c6ca)
      00:49:49.474      #2 ItemCompressorVisitor::visit(HashTable::HashBucketLock const&, StoredValue&) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/item_compressor_visitor.cc:47 (ep_testsuite+0xa8144a)
      00:49:49.474      #3 HashTable::pauseResumeVisit(HashTableVisitor&, HashTable::Position&) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/hash_table.cc:1383 (ep_testsuite+0xa7cb18)
      00:49:49.474      #4 PauseResumeVBAdapter::visit(VBucket&) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/vb_visitors.cc:51 (ep_testsuite+0x954c2e)
      00:49:49.474      #5 KVBucket::pauseResumeVisit(PauseResumeVBVisitor&, KVBucketIface::Position&, VBucketFilter*) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/kv_bucket.cc:2445 (ep_testsuite+0x9dd84e)
      00:49:49.474      #6 ItemCompressorTask::run() /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/item_compressor.cc:67 (ep_testsuite+0xa808bc)
      

      00:49:49.475    Previous read of size 2 at 0x7b1800009c33 by thread T70:
      00:49:49.475      #0 StoredValue::isOrdered() const /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/stored-value.h:965 (ep_testsuite+0x7be1e6)
      00:49:49.475      #1 StoredValue::key() /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/stored-value.h:1409 (ep_testsuite+0x7be1a5)
      00:49:49.475      #2 StoredValue::getKey() const /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/stored-value.h:338 (ep_testsuite+0x7b7155)
      00:49:49.475      #3 BasicLinkedList::purgeTombstones(long, std::function<bool (DocKey const&, long)>, std::function<bool ()>) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/linked_list.cc:275 (ep_testsuite+0x99adf8)
      00:49:49.475      #4 EphemeralVBucket::purgeStaleItems(std::function<bool ()>) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/ephemeral_vb.cc:383 (ep_testsuite+0xa9b1d0)
      00:49:49.475      #5 EphemeralVBucket::StaleItemDeleter::visit(VBucket&) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/ephemeral_tombstone_purger.cc:202 (ep_testsuite+0xaa64ee)
      00:49:49.475      #6 KVBucket::pauseResumeVisit(PauseResumeVBVisitor&, KVBucketIface::Position&, VBucketFilter*) /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/kv_bucket.cc:2445 (ep_testsuite+0x9dd84e)
      00:49:49.475      #7 EphTombstoneStaleItemDeleter::run() /home/couchbase/jenkins/workspace/kv_engine.threadsanitizer_master/kv_engine/engines/ep/src/ephemeral_tombstone_purger.cc:271 (ep_testsuite+0xa994f2)
      

      This appears to be a genuine data race caused by an optimisation introduced in https://review.couchbase.org/c/kv_engine/+/147202.

      When then ItemCompressionTask runs, it will update that individual bit, however CPUs do not write memory in bits, so an update on a bit is a read-modify-write on the entire byte or word. We should probably use an AtomicBitset.

      Attachments

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

        Activity

          People

            vesko.karaganev Vesko Karaganev
            vesko.karaganev Vesko Karaganev
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes

                PagerDuty