internal: waitUntil should execute promises after the response is returned#62068
Closed
MaxLeiter wants to merge 5 commits intovercel:canaryfrom
Closed
internal: waitUntil should execute promises after the response is returned#62068MaxLeiter wants to merge 5 commits intovercel:canaryfrom
MaxLeiter wants to merge 5 commits intovercel:canaryfrom
Conversation
…urned Certain cloud runtimes enforce concurrency limits. If too many network requests are being executed concurrently via `internal_runWithWaitUntil` this limit can be reached and a deadlock can occur. This change switches internal_runWithWaitUntil from immediately calling the promises provided, and instead building a queue to be processed sequentially after the function returns.
X-Coauthored-by: Shu Ding <g@shud.in>
shuding
reviewed
Feb 14, 2024
Comment on lines
24
to
30
| export function internal_getCurrentFunctionWaitUntil() { | ||
| return state.waitUntilPromise | ||
| return resolveTasksSequentially() | ||
| } | ||
|
|
||
| export function internal_runWithWaitUntil<T>(fn: () => T): T { | ||
| const result = fn() | ||
| if ( | ||
| result && | ||
| typeof result === 'object' && | ||
| 'then' in result && | ||
| 'finally' in result && | ||
| typeof result.then === 'function' && | ||
| typeof result.finally === 'function' | ||
| ) { | ||
| if (!state.waitUntilCounter) { | ||
| // Create the promise for the next batch of waitUntil calls. | ||
| state.waitUntilPromise = new Promise<void>((resolve) => { | ||
| state.waitUntilResolve = resolve | ||
| }) | ||
| } | ||
| state.waitUntilCounter++ | ||
| return result.finally(() => { | ||
| resolveOnePromise() | ||
| }) | ||
| } | ||
|
|
||
| return result | ||
| export function internal_runWithWaitUntil<T>(fn: () => Promise<T>) { | ||
| tasks.push(fn) | ||
| } |
Member
There was a problem hiding this comment.
For visibility: this ensures that those tasks are not started right away - when you call internal_runWithWaitUntil, but after the route handler's execution.
shuding
approved these changes
Feb 14, 2024
Member
Failing test suitesCommit: ec899dc
Expand output● app dir - navigation › navigation between pages and app › should not continously initiate a mpa navigation to the same URL when router state changes Read more about building and testing Next.js in contributing.md. |
Member
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| buildDuration | 20.3s | 20s | N/A |
| buildDurationCached | 8.6s | 7s | N/A |
| nodeModulesSize | 196 MB | 196 MB | N/A |
| nextStartRea..uration (ms) | 428ms | 430ms | N/A |
Client Bundles (main, webpack)
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| 1068-HASH.js gzip | 30.2 kB | 30.2 kB | N/A |
| 3f784ff6-HASH.js gzip | 53.5 kB | 53.5 kB | N/A |
| 4944-HASH.js gzip | 5.04 kB | 5.03 kB | N/A |
| 8423.HASH.js gzip | 181 B | 181 B | ✓ |
| framework-HASH.js gzip | 45.2 kB | 45.2 kB | ✓ |
| main-app-HASH.js gzip | 241 B | 241 B | ✓ |
| main-HASH.js gzip | 32.1 kB | 32.1 kB | N/A |
| webpack-HASH.js gzip | 1.7 kB | 1.7 kB | ✓ |
| Overall change | 47.3 kB | 47.3 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 196 B | 196 B | ✓ |
| _error-HASH.js gzip | 184 B | 183 B | N/A |
| amp-HASH.js gzip | 503 B | 504 B | N/A |
| css-HASH.js gzip | 323 B | 324 B | N/A |
| dynamic-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| edge-ssr-HASH.js gzip | 258 B | 259 B | N/A |
| head-HASH.js gzip | 353 B | 351 B | N/A |
| hooks-HASH.js gzip | 370 B | 370 B | ✓ |
| image-HASH.js gzip | 4.21 kB | 4.2 kB | N/A |
| index-HASH.js gzip | 259 B | 259 B | ✓ |
| link-HASH.js gzip | 2.68 kB | 2.67 kB | N/A |
| routerDirect..HASH.js gzip | 313 B | 314 B | N/A |
| script-HASH.js gzip | 386 B | 385 B | N/A |
| withRouter-HASH.js gzip | 309 B | 311 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 931 B | 931 B | ✓ |
Client Build Manifests
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 485 B | 484 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| index.html gzip | 528 B | 527 B | N/A |
| link.html gzip | 540 B | 540 B | ✓ |
| withRouter.html gzip | 524 B | 522 B | N/A |
| Overall change | 540 B | 540 B | ✓ |
Edge SSR bundle Size
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 94.4 kB | 94.4 kB | N/A |
| page.js gzip | 151 kB | 151 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
Middleware size
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 623 B | 627 B | N/A |
| middleware-r..fest.js gzip | 151 B | 151 B | ✓ |
| middleware.js gzip | 44.4 kB | 44.4 kB | N/A |
| edge-runtime..pack.js gzip | 1.94 kB | 1.94 kB | ✓ |
| Overall change | 2.1 kB | 2.1 kB | ✓ |
Next Runtimes
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 166 kB | 166 kB | ✓ |
| app-page-exp..prod.js gzip | 95.5 kB | 95.5 kB | ✓ |
| app-page-tur..prod.js gzip | 97.3 kB | 97.3 kB | ✓ |
| app-page-tur..prod.js gzip | 91.7 kB | 91.7 kB | ✓ |
| app-page.run...dev.js gzip | 136 kB | 136 kB | ✓ |
| app-page.run..prod.js gzip | 90.3 kB | 90.3 kB | ✓ |
| app-route-ex...dev.js gzip | 22 kB | 22 kB | ✓ |
| app-route-ex..prod.js gzip | 14.9 kB | 14.9 kB | ✓ |
| app-route-tu..prod.js gzip | 14.9 kB | 14.9 kB | ✓ |
| app-route-tu..prod.js gzip | 14.6 kB | 14.6 kB | ✓ |
| app-route.ru...dev.js gzip | 21.7 kB | 21.7 kB | ✓ |
| app-route.ru..prod.js gzip | 14.6 kB | 14.6 kB | ✓ |
| pages-api-tu..prod.js gzip | 9.43 kB | 9.43 kB | ✓ |
| pages-api.ru...dev.js gzip | 9.7 kB | 9.7 kB | ✓ |
| pages-api.ru..prod.js gzip | 9.43 kB | 9.43 kB | ✓ |
| pages-turbo...prod.js gzip | 22 kB | 22 kB | ✓ |
| pages.runtim...dev.js gzip | 22.7 kB | 22.7 kB | ✓ |
| pages.runtim..prod.js gzip | 22 kB | 22 kB | ✓ |
| server.runti..prod.js gzip | 50 kB | 50 kB | ✓ |
| Overall change | 925 kB | 925 kB | ✓ |
build cache Overall increase ⚠️
| vercel/next.js canary | MaxLeiter/next.js max/edge-wait-until-changes | Change | |
|---|---|---|---|
| 0.pack gzip | 1.55 MB | 1.55 MB | N/A |
| index.pack gzip | 103 kB | 103 kB | |
| Overall change | 103 kB | 103 kB |
Diff details
Diff for page.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Certain cloud runtimes enforce concurrency limits. If too many network requests are being executed concurrently via
internal_runWithWaitUntilthis limit can be reached and a deadlock can occur.This change switches internal_runWithWaitUntil from immediately calling the promises provided, and instead constructs a queue to be processed sequentially after the function returns.
I recommend reviewing without whitespace: https://github.com/vercel/next.js/pull/62068/files?diff=unified&w=1