-
Type:
Task
-
Resolution: Fixed
-
Priority:
Major - P3
-
Affects Version/s: None
-
Component/s: None
-
None
-
Query Execution
-
Fully Compatible
-
QE 2026-07-06, QE 2026-07-20
-
None
-
None
-
None
-
None
-
None
-
None
-
None
Summary
internalQueryEnableWriteConflictBackoffWithoutTicket is set_at: [startup]. Change it to [startup, runtime] so the release-ticket write-conflict backoff behavior can be toggled without restarting the server.
Background
The knob gates whether the plan executor and Express executor release the ticket and resources before sleeping on a write conflict (added in SERVER-116168, plan-executor analog SERVER-65418). It is an AtomicWord read fresh on every write-conflict cycle via .load()/.loadRelaxed() in plan_executor_impl.cpp and plan_executor_express.cpp. There is no startup snapshot or derived state. The two sibling tuning knobs, internalQueryWriteConflictBackoffMaxReleaseTicketCycles and internalQueryWriteConflictRetryLimitMax, are already [startup, runtime].
Change
Add runtime to set_at in query_execution_knobs.idl.
Risk
Low. Both the release-ticket and hold-ticket paths are already reachable within a single operation: once consecutive conflicts exceed internalQueryWriteConflictBackoffMaxReleaseTicketCycles, the op falls back from release to hold-ticket mid-flight. Toggling the enable bit between cycles reaches the same paths and adds no new combination. A runtime disable path already exists by setting the cycles knob to 0, which forces hold-ticket on the first conflict; this change also allows runtime enable.
Testing
Extend jstests/noPassthrough/query/write_query_does_not_sleep_with_locks.js to flip the knob with setParameter mid-test and assert the backoff path switches.