From 202961e712e59426ee383a0443c1b5ca07cb4b00 Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 4 Jan 2021 21:34:42 -0600 Subject: [PATCH] Add back disableSchedulerTimeoutInWorkLoop flag (#20482) * Add back enableSchedulerTimeoutInWorkLoop flag * Nvm, keep it as disableSchedulerTimeoutInWorkLoop --- .../src/ReactFiberWorkLoop.new.js | 15 ++++++++++++++- .../src/ReactFiberWorkLoop.old.js | 15 ++++++++++++++- packages/shared/ReactFeatureFlags.js | 2 ++ .../shared/forks/ReactFeatureFlags.native-fb.js | 1 + .../shared/forks/ReactFeatureFlags.native-oss.js | 1 + .../forks/ReactFeatureFlags.test-renderer.js | 1 + .../ReactFeatureFlags.test-renderer.native.js | 1 + .../forks/ReactFeatureFlags.test-renderer.www.js | 1 + .../shared/forks/ReactFeatureFlags.testing.js | 1 + .../shared/forks/ReactFeatureFlags.testing.www.js | 1 + .../shared/forks/ReactFeatureFlags.www-dynamic.js | 1 + packages/shared/forks/ReactFeatureFlags.www.js | 1 + 12 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 3c189a73dd76d..e8d097e9ef563 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -31,6 +31,7 @@ import { enableDebugTracing, enableSchedulingProfiler, enableScopeAPI, + disableSchedulerTimeoutInWorkLoop, } from 'shared/ReactFeatureFlags'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import invariant from 'shared/invariant'; @@ -767,7 +768,7 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) { // This is the entry point for every concurrent task, i.e. anything that // goes through Scheduler. -function performConcurrentWorkOnRoot(root) { +function performConcurrentWorkOnRoot(root, didTimeout) { if (enableProfilerTimer && enableProfilerNestedUpdatePhase) { resetNestedUpdateFlag(); } @@ -811,6 +812,18 @@ function performConcurrentWorkOnRoot(root) { return null; } + // TODO: We only check `didTimeout` defensively, to account for a Scheduler + // bug we're still investigating. Once the bug in Scheduler is fixed, + // we can remove this, since we track expiration ourselves. + if (!disableSchedulerTimeoutInWorkLoop && didTimeout) { + // Something expired. Flush synchronously until there's no expired + // work left. + markRootExpired(root, lanes); + // This will schedule a synchronous callback. + ensureRootIsScheduled(root, now()); + return null; + } + let exitStatus = renderRootConcurrent(root, lanes); if ( diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js index 220b1598a10de..331fe20ee10a4 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js @@ -33,6 +33,7 @@ import { enableSchedulingProfiler, enableScopeAPI, enableDoubleInvokingEffects, + disableSchedulerTimeoutInWorkLoop, } from 'shared/ReactFeatureFlags'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import invariant from 'shared/invariant'; @@ -775,7 +776,7 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) { // This is the entry point for every concurrent task, i.e. anything that // goes through Scheduler. -function performConcurrentWorkOnRoot(root) { +function performConcurrentWorkOnRoot(root, didTimeout) { if (enableProfilerTimer && enableProfilerNestedUpdatePhase) { resetNestedUpdateFlag(); } @@ -819,6 +820,18 @@ function performConcurrentWorkOnRoot(root) { return null; } + // TODO: We only check `didTimeout` defensively, to account for a Scheduler + // bug we're still investigating. Once the bug in Scheduler is fixed, + // we can remove this, since we track expiration ourselves. + if (!disableSchedulerTimeoutInWorkLoop && didTimeout) { + // Something expired. Flush synchronously until there's no expired + // work left. + markRootExpired(root, lanes); + // This will schedule a synchronous callback. + ensureRootIsScheduled(root, now()); + return null; + } + let exitStatus = renderRootConcurrent(root, lanes); if ( diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 519ea5015d7d8..c3ffb65e96ff2 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -141,3 +141,5 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; + +export const disableSchedulerTimeoutInWorkLoop = false; diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index 32b1e3d45d0a6..23c926c65a3fb 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -56,6 +56,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index 701cfd745fe36..3ed2d7701c93f 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index fb16a242199d6..16e488409e0c4 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js index c9e64734268a6..84ea8902f60c2 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index 546784ff88ede..eb1630fc49bd7 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = true; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.testing.js b/packages/shared/forks/ReactFeatureFlags.testing.js index 1d028ee23ca40..87133385439f3 100644 --- a/packages/shared/forks/ReactFeatureFlags.testing.js +++ b/packages/shared/forks/ReactFeatureFlags.testing.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.testing.www.js b/packages/shared/forks/ReactFeatureFlags.testing.www.js index ed3c033e99fff..671f44be02952 100644 --- a/packages/shared/forks/ReactFeatureFlags.testing.www.js +++ b/packages/shared/forks/ReactFeatureFlags.testing.www.js @@ -55,6 +55,7 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; +export const disableSchedulerTimeoutInWorkLoop = false; // Flow magic to verify the exports of this file match the original version. // eslint-disable-next-line no-unused-vars diff --git a/packages/shared/forks/ReactFeatureFlags.www-dynamic.js b/packages/shared/forks/ReactFeatureFlags.www-dynamic.js index ad4ff2bab7655..cf0ca5ae54393 100644 --- a/packages/shared/forks/ReactFeatureFlags.www-dynamic.js +++ b/packages/shared/forks/ReactFeatureFlags.www-dynamic.js @@ -53,3 +53,4 @@ export const enableDoubleInvokingEffects = false; export const enableUseRefAccessWarning = __VARIANT__; export const enableProfilerNestedUpdateScheduledHook = __VARIANT__; +export const disableSchedulerTimeoutInWorkLoop = __VARIANT__; diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 8db205e184369..8b2bda551339e 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -29,6 +29,7 @@ export const { enableDoubleInvokingEffects, enableUseRefAccessWarning, disableNativeComponentFrames, + disableSchedulerTimeoutInWorkLoop, } = dynamicFeatureFlags; // On WWW, __EXPERIMENTAL__ is used for a new modern build.