Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-57432

Prevent MODE_X and MODE_S locks from being yielded and reacquired

    • Type: Icon: Improvement Improvement
    • Resolution: Fixed
    • Priority: Icon: Major - P3 Major - P3
    • 6.0.0-rc0
    • Affects Version/s: None
    • Component/s: Concurrency
    • Labels:
    • Fully Compatible
    • Execution Team 2022-02-21, Execution Team 2022-03-07
    • 161

      Callers typically acquire a MODE_X lock to exclude all readers and writers and a MODE_S lock to exclude all writers. Allowing query yielding, hybrid index building, etc. to release and later reacquire these locks can invalidate assumptions about what these internal callers thought acquiring a strong lock meant within the system because it enables other readers and writers to act on the collection.

      We should consider making it a programmer error to use Locker::saveLockStateAndUnlock() and/or Locker::restoreLockState() to yield and reacquire MODE_X and MODE_S locks, or consider making it a programmer error to use PlanYieldPolicy::YieldPolicy::YIELD_AUTO while holding a MODE_X or MODE_S lock. Note: The caller could instead set PlanYieldPolicy::YieldPolicy::NO_YIELD or similar with an intent lock to reflect their intention to not see the effects of other writers if they actually wanted the effects of what yielding and reacquiring strong locks would imply for some reason.

            jordi.olivares-provencio@mongodb.com Jordi Olivares Provencio
            max.hirschhorn@mongodb.com Max Hirschhorn
            1 Vote for this issue
            15 Start watching this issue