If an on-going index build yields its locks after initiating a bulk insert (which is initialized here), it still holds onto the write lock on the index table at the WiredTiger level. If a dbStats command comes in, it will take collection level MODE_IS lock and attempt to acquire a read_lock for the ident the index build is currently writing to (but cannot since IndexBuild_1 holds the exclusive lock on that ident). (In (collection_impl.cpp) we iterate through the unfinished indexes and that is how we can see the in-progress index table).
The problem arises when another operation comes in and prevents IndexBuild_1 from re-acquiring its lock, like another index build that enqueues a collection MODE_X lock. These events can produce a deadlock in the system represented by:
dbStats | IndexBuild_0 | IndexBuild_1 |
---|---|---|
[Global, DB, Coll]- MODE_IS | [Global, DB] - MODE_IX | [Global, DB, Coll] - MODE_IX |
yields MDB level locks - holds write lock on table:index-X |
||
blocks IndexBuild_1 - waiting on read lock of table:index-X - holds coll lock - MODE_IS |
||
|
||
|
- is related to
-
WT-11085 Make cursors consistently return EBUSY when there's a bulk cursor
- Closed
-
SERVER-76991 Create a "kitchen sink" suite
- Open