Skip to content

Commit 88cebff

Browse files
committed
VBSeqlistStats test: Fix locking ordering
The Visitor test class used to page out a key for VBSeqlistStats leaves the collection manifest locked even when the visitor has completed. This results in a lock-order inversion error later on from TSan when the test later requests vbucket-details stats (once http://review.couchbase.org/#/c/109734/ is applied): Mutex M1111398894660490488 acquired here while holding mutex M1100984080004130504 in main thread: #0 AnnotateRWLockAcquired <null> (libtsan.so.0+0x00000005b63d) ... #6 VBucket::getSyncWriteAcceptedCount() const kv_engine/engines/ep/src/vbucket.cc:304 (ep-engine_ep_unit_tests+0x000000e6891e) #7 VBucket::_addStats(bool, std::function<void (char const*, unsigned short, char const*, unsigned int, gsl::not_null<void const*>)> const&, void const*) kv_engine/engines/ep/src/vbucket.cc:2873 (ep-engine_ep_unit_tests+0x000000e6c098) ... #13 StatTest::get_stat[abi:cxx11](char const*) kv_engine/engines/ep/tests/module_tests/stats_test.cc:66 (ep-engine_ep_unit_tests+0x000000b99ea5) #14 EphemeralBucketStatTest_VBSeqlistStats_Test::TestBody() kv_engine/engines/ep/tests/module_tests/ephemeral_bucket_test.cc:92 (ep-engine_ep_unit_tests+0x0000008476d7) Mutex M1100984080004130504 previously acquired by the same thread here: #0 pthread_rwlock_rdlock <null> (libtsan.so.0+0x00000002953b) ... #7 Collections::VB::Manifest::lock() const kv_engine/engines/ep/src/collections/vbucket_manifest.h:679 (ep-engine_ep_unit_tests+0x00000084745a) #8 VBucket::lockCollections() const kv_engine/engines/ep/src/vbucket.h:756 (ep-engine_ep_unit_tests+0x00000084745a) #9 Visitor kv_engine/engines/ep/tests/module_tests/ephemeral_bucket_test.cc:73 (ep-engine_ep_unit_tests+0x00000084745a) #10 EphemeralBucketStatTest_VBSeqlistStats_Test::TestBody() kv_engine/engines/ep/tests/module_tests/ephemeral_bucket_test.cc:89 (ep-engine_ep_unit_tests+0x00000084745a) Avoid this by using the same pattern used elsewhere in production code - only acquire the collections manifest lock before/after the visit (via setUpHashBucketVisit / tearDownHashBucketVisit). Change-Id: I22039f316b5664cebe458a76f64cc863d79d25b1 Reviewed-on: http://review.couchbase.org/109932 Tested-by: Build Bot <[email protected]> Reviewed-by: Ben Huddleston <[email protected]>
1 parent 9917007 commit 88cebff

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

engines/ep/tests/module_tests/ephemeral_bucket_test.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ TEST_F(EphemeralBucketStatTest, VBSeqlistStats) {
6969

7070
// Test visitor which pages out our key
7171
struct Visitor : public HashTableVisitor {
72-
Visitor(VBucket& vb, StoredDocKey key)
73-
: vb(vb), key(key), readHandle(vb.lockCollections()) {
72+
Visitor(VBucket& vb, StoredDocKey key) : vb(vb), key(key) {
7473
}
74+
7575
bool visit(const HashTable::HashBucketLock& lh,
7676
StoredValue& v) override {
7777
if (v.getKey() == key) {
@@ -80,6 +80,16 @@ TEST_F(EphemeralBucketStatTest, VBSeqlistStats) {
8080
}
8181
return true;
8282
}
83+
84+
void setUpHashBucketVisit() override {
85+
// Need to lock collections before we visit each SV.
86+
readHandle = vb.lockCollections();
87+
}
88+
89+
void tearDownHashBucketVisit() override {
90+
readHandle.unlock();
91+
}
92+
8393
VBucket& vb;
8494
StoredDocKey key;
8595
Collections::VB::Manifest::ReadHandle readHandle;

0 commit comments

Comments
 (0)