Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
0
void LockerImpl<IsForMMAPV1>::reacquireTicket(OperationContext* opCtx) {
    invariant(_modeForTicket != MODE_NONE);
    auto acquireTicketResult = _acquireTicket(opCtx, _modeForTicket, Date_t::max());
    invariant(acquireTicketResult == LOCK_OK);
}