Shards during a resharding operation rely on a shard version refresh to be triggered after a new primary has stepped up for the DonorStateMachine and RecipientStateMachines to learn of a change to the coordinator's state. However, a shard version refresh won't be able to complete while the critical section is held. This means if the write to acquire the critical section becomes majority-committed but the write to transition to DonorStateEnum::kBlockingWrites doesn't, then the donor shard will be stuck unable to advance past DonorStateEnum::kDonatingOplogEntries. The shard version refresh won't be able to complete while the critical section is held and so the donor shard won't realize it is safe for it to complete its transition to DonorStateEnum::kBlockingWrites.
The DonorStateEnum::kPreparingToBlockWrites state had been removed as part of SERVER-55677 but could be reintroduced to solve this issue. A donor shard coming up in DonorStateEnum::kPreparingToBlockWrites would mean the donor shard doesn't need to wait for a shard version refresh to complete before it can complete its transition to DonorStateEnum::kBlockingWrites.
- is related to
-
SERVER-55677 Remove resharding's DonorStateEnum::kPreparingToBlockWrites state
- Closed
- related to
-
SERVER-57953 _flushReshardingStateChange attempts to refresh shard version while another refresh already pending, leading to invariant failure
- Closed