summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/concurrency/lock_state.cpp')
-rw-r--r--src/mongo/db/concurrency/lock_state.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp
index 69ea7d13bfd..9a49e3aa462 100644
--- a/src/mongo/db/concurrency/lock_state.cpp
+++ b/src/mongo/db/concurrency/lock_state.cpp
@@ -368,10 +368,15 @@ void LockerImpl::reacquireTicket(OperationContext* opCtx) {
bool LockerImpl::_acquireTicket(OperationContext* opCtx, LockMode mode, Date_t deadline) {
_admCtx.setLockMode(mode);
+
+ // Upon startup, the holder is not guaranteed to be initialized.
+ auto holder = _ticketHolder;
const bool reader = isSharedLockMode(mode);
- auto holder = shouldAcquireTicket() ? _ticketHolder : nullptr;
- // MODE_X is exclusive of all other locks, thus acquiring a ticket is unnecessary.
- if (mode != MODE_X && mode != MODE_NONE && holder) {
+
+ if (!shouldWaitForTicket() && holder) {
+ _ticket = holder->acquireImmediateTicket(&_admCtx);
+ } else if (mode != MODE_X && mode != MODE_NONE && holder) {
+ // MODE_X is exclusive of all other locks, thus acquiring a ticket is unnecessary.
_clientState.store(reader ? kQueuedReader : kQueuedWriter);
// If the ticket wait is interrupted, restore the state of the client.
ScopeGuard restoreStateOnErrorGuard([&] {
@@ -396,6 +401,7 @@ bool LockerImpl::_acquireTicket(OperationContext* opCtx, LockMode mode, Date_t d
}
restoreStateOnErrorGuard.dismiss();
}
+
_clientState.store(reader ? kActiveReader : kActiveWriter);
return true;
}