Details
-
Bug
-
Resolution: Fixed
-
Major
-
7.6.0, 7.0.0, 7.0.5, 7.1.0, 7.2.0, 7.1.6, 7.2.5
-
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.