LockResult LockerImpl::_lockGlobalBegin(OperationContext* opCtx, LockMode mode, Date_t deadline) { dassert(isLocked() == (_modeForTicket != MODE_NONE)); if (_modeForTicket == MODE_NONE) { auto acquireTicketResult = _acquireTicket(opCtx, mode, deadline); if (acquireTicketResult != LOCK_OK) { return acquireTicketResult; } _modeForTicket = mode; } LockMode actualLockMode = mode; if (opCtx) { auto storageEngine = opCtx->getServiceContext()->getStorageEngine(); if (storageEngine && !storageEngine->supportsDBLocking()) { actualLockMode = isSharedLockMode(mode) ? MODE_S : MODE_X; } } const LockResult result = lockBegin(opCtx, resourceIdGlobal, actualLockMode); if (result == LOCK_OK) return LOCK_OK; invariant(result == LOCK_WAITING); return result; }
LockResult LockerImpl<IsForMMAPV1>::_lockGlobalBegin(OperationContext* opCtx, LockMode mode, Date_t deadline) { dassert(isLocked() == (_modeForTicket != MODE_NONE)); if (_modeForTicket == MODE_NONE) { auto acquireTicketResult = _acquireTicket(opCtx, mode, deadline); if (acquireTicketResult != LOCK_OK) { return acquireTicketResult; } _modeForTicket = mode; } const LockResult result = lockBegin(opCtx, resourceIdGlobal, mode); if (result == LOCK_OK) return LOCK_OK; // Currently, deadlock detection does not happen inline with lock acquisition so the only // unsuccessful result that the lock manager would return is LOCK_WAITING. invariant(result == LOCK_WAITING); return result; }
void LockerImpl::reacquireTicket(OperationContext* opCtx) { invariant(_modeForTicket != MODE_NONE); auto clientState = _clientState.load(); const bool reader = isSharedLockMode(_modeForTicket); // Ensure that either we don't have a ticket, or the current ticket mode matches the lock mode. invariant(clientState == kInactive || (clientState == kActiveReader && reader) || (clientState == kActiveWriter && !reader)); // If we already have a ticket, there's nothing to do. if (clientState != kInactive) return; auto acquireTicketResult = _acquireTicket(opCtx, _modeForTicket, Date_t::max()); uassert(ErrorCodes::LockTimeout, str::stream() << "Unable to acquire ticket with mode '" << _modeForTicket << "' within a max lock request timeout of '" << _maxLockTimeout.get() << "' milliseconds.", acquireTicketResult == LOCK_OK || !_maxLockTimeout); // If no deadline is specified we should always get a ticket. invariant(acquireTicketResult == LOCK_OK); }
void LockerImpl<IsForMMAPV1>::reacquireTicket(OperationContext* opCtx) { invariant(_modeForTicket != MODE_NONE); auto acquireTicketResult = _acquireTicket(opCtx, _modeForTicket, Date_t::max()); invariant(acquireTicketResult == LOCK_OK); }