Repository navigation
Conversation
A read that arrives while effect/Cache is still stopping an abandoned lookup joins it and gets back a bare interrupt. Pull request reads now ask once more in that case, which starts a fresh lookup. A caller that was itself interrupted does not retry. Closes pingdotgg#14113.
…e-interrupt # Conflicts: # apps/server/src/pullRequest/PullRequestService.ts
…e-interrupt # Conflicts: # apps/server/src/pullRequest/PullRequestService.ts
Contributor
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — The PR fixes a narrowly scoped cache-interruption race by centralizing a one-time retry and applies it consistently across pull-request reads, with focused tests covering both recovery and cancellation behavior. It introduces no schema, deployment, security-sensitive, default, or static-analysis configuration changes. Notes:
You can add or adjust custom eligibility rules. Learn more. |
macroscopeapp
Bot
dismissed
their stale review
October 11, 2026 14:56
Dismissing prior approval to re-evaluate 36603e0
AdEx-Partners-DE
added a commit
to AdEx-Partners-DE/t3code
that referenced
this pull request
Oct 11, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #14122, which was closed because its description did not name the model and harness. That is now at the end. The branch is merged with current
main.Closes #14113.
The first time the PR panel opened after a turn, it often showed "Could not load pull requests — All fibers interrupted without error", and Retry fixed it. The client cancels its first
detailread and immediately sends the same read again. When a cached read's last caller leaves,effect/Cacheinterrupts the lookup but keeps the entry until the lookup has stopped. The resent read lands in that window, joins the dying lookup, and gets its interrupt back as the answer.As the triage suggests, the fix is in the cache read.
getCachedwrapsCache.getand asks once more when a read comes back with only an interrupt. By then the dying entry is gone, so the retry starts a fresh lookup.catchCauseIfdoes not run for a caller that was itself interrupted, so a real cancel still stops without spawningghagain. EveryCache.getinPullRequestServicenow goes through it. Detail, activity, preview, list, diff, stats, files-viewed, and viewer reads all share this shape, and the macOS reproduction on the issue sawactivityfail too.mainalready retries this way for the list and list-stats reads since #15851. This puts that retry in one helper and routes every cache read in the service through it, includingdetail, the read #14113 reports.Evidence
getCached.test.tsreproduces the race from the issue. With plainCache.get, the second read fails with a bare interrupt; withgetCachedit gets a fresh value. A second test checks that an interrupted read does not start another lookup.getCached,PullRequestService, andPullRequestReadCachetests pass on the merged branch (206 tests). Servertsc --noEmit, lint, and format are clean.detail, but the resent read no longer fails. Removing the retry made the race test fail again. Since that check the helper is unchanged. The branch has only mergedmainand routed two cachesmainadded (checks and watch fingerprint) through the helper.Model: Claude Opus 5.5 via Claude Code, in T3 Code.