Details
-
Task
-
Resolution: Done
-
Major - P3
-
None
-
None
-
2
Description
In-progress index builds are no longer accounted for 'indexFreeStorageSize' when running dbStats.
Description of Linked Ticket
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 |
||
|
||
|
Attachments
Issue Links
- documents
-
SERVER-77018 Deadlock between dbStats and 2 index builds
-
- Closed
-
- is related to
-
DOCS-16162 [BACKPORT] [v6.3] Deadlock between dbStats and 2 index builds
-
- Closed
-
- related to
-
DOCS-16152 [BACKPORT] [v7.0] Deadlock between dbStats and 2 index builds
-
- Closed
-