In a sharded cluster, when the client performs a find, mongos will open a set of cursors on the shards and pass them to RouterStageMerge. When the mongos is done with the cursors (exhausted, errored, etc.) RouterStageMerge:kill will get invoked, which will end up calling AsyncResultsMerger::kill. There, _scheduleKillCursors will attempt to invoke killCursors onto the shards.
This is a best-effort – we ignore any failures. However, in the the event of a MaxTimeMSExpired failure, because in the mongos the opCtx deadline is also expired, this best-effort killCursors won't even get scheduled because the executor will immediately timeout when attempting to get a connection from the pool. This will leak the shard cursors.
Attached repro script.