Prevent late transport errors from overriding the failure that stopped cursor retries

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Major - P3
    • None
    • Affects Version/s: None
    • Component/s: None
    • None
    • Query Execution
    • ALL
    • 200
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      CursorEstablisher::_waitForResponse() currently handles all exceptions from response processing as isInterruption=true. This includes remote transport failures thrown by uassertStatusOK(swResponse).

      In BF-44699 a shard’s InterruptedDueToTimeseriesUpgradeDowngrade (485) caused stopRetrying(), but an already-dispatched retry from another shard later returned IngressRequestRateLimitExceeded (462). Because the transport-level 462 is classified as an interruption, it overrides 485 and is returned to the client without RetryableError. Credit to anja.kalaba@mongodb.com for figuring out the race.

      Split response processing so failed remote swResponse statuses are handled as ordinary remote failures (isInterruption=false). Reserve interruption precedence for genuine local interruption/unyield failures.

      Add regression coverage proving that an in-flight transport-level 462 does not override the 485 that caused retries to stop.

            Assignee:
            Unassigned
            Reporter:
            Daniel Gomez Ferro
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: