Add a feature flag to enable expiration of retry lanes (#27694)
An attempt to see if we can bring back expiration of retry lanes to avoid cases resolving Suspense can be starved by frequent updates. In the past, this caused increase browser crashes, but a lot of time has passed since then. Just trying if we can re-enable this. Old PR that reverted adding the timeout: https://github.com/facebook/react/pull/21300
Jan Kassens committed
Nov 14, 2023 at 10:15 UTC
593ecee66a609d4a4c2b36b39b1e5e23b2456dd1
9 files changed
+16
-3
packages/react-reconciler/src/ReactFiberLane.js
+4
-3
@@ -19,11 +19,12 @@ export type Lane = number;
19
export type LaneMap<T> = Array<T>;
20
21
import {
22
- enableSchedulingProfiler,
23
- enableUpdaterTracking,
22
allowConcurrentByDefault,
23
+ enableRetryLaneExpiration,
24
+ enableSchedulingProfiler,
25
enableTransitionTracing,
26
enableUnifiedSyncLane,
27
+ enableUpdaterTracking,
28
} from 'shared/ReactFeatureFlags';
29
import {isDevToolsPresent} from './ReactFiberDevToolsHook';
30
import {ConcurrentUpdatesByDefaultMode, NoMode} from './ReactTypeOfMode';
@@ -383,7 +384,7 @@ function computeExpirationTime(lane: Lane, currentTime: number) {
384
// crashes. There must be some other underlying bug; not super urgent but
385
// ideally should figure out why and fix it. Unfortunately we don't have
386
// a repro for the crashes, only detected via production metrics.
386
- return NoTimestamp;
387
+ return enableRetryLaneExpiration ? currentTime + 5000 : NoTimestamp;
388
case SelectiveHydrationLane:
389
case IdleHydrationLane:
390
case IdleLane:
packages/shared/ReactFeatureFlags.js
+5
@@ -128,6 +128,11 @@ export const passChildrenWhenCloningPersistedNodes = false;
128
129
export const enableUseDeferredValueInitialArg = __EXPERIMENTAL__;
130
131
+/**
132
+ * Enables an expiration time for retry lanes to avoid starvation.
133
+ */
134
+export const enableRetryLaneExpiration = false;
135
+
136
// -----------------------------------------------------------------------------
137
// Chopping Block
138
//
packages/shared/forks/ReactFeatureFlags.native-fb.js
+1
@@ -66,6 +66,7 @@ export const enableComponentStackLocations = false;
66
export const enableLegacyFBSupport = false;
67
export const enableFilterEmptyStringAttributesDOM = false;
68
export const enableGetInspectorDataForInstanceInProduction = true;
69
+export const enableRetryLaneExpiration = false;
70
71
export const createRootStrictEffectsByDefault = false;
72
packages/shared/forks/ReactFeatureFlags.native-oss.js
+1
@@ -49,6 +49,7 @@ export const enableComponentStackLocations = false;
49
export const enableLegacyFBSupport = false;
50
export const enableFilterEmptyStringAttributesDOM = false;
51
export const enableGetInspectorDataForInstanceInProduction = false;
52
+export const enableRetryLaneExpiration = false;
53
54
export const createRootStrictEffectsByDefault = false;
55
export const enableUseRefAccessWarning = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.js
+1
@@ -49,6 +49,7 @@ export const enableComponentStackLocations = true;
49
export const enableLegacyFBSupport = false;
50
export const enableFilterEmptyStringAttributesDOM = false;
51
export const enableGetInspectorDataForInstanceInProduction = false;
52
+export const enableRetryLaneExpiration = false;
53
54
export const createRootStrictEffectsByDefault = false;
55
export const enableUseRefAccessWarning = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.native.js
+1
@@ -51,6 +51,7 @@ export const enableUseEffectEventHook = false;
51
export const enableClientRenderFallbackOnTextMismatch = true;
52
export const createRootStrictEffectsByDefault = false;
53
export const enableUseRefAccessWarning = false;
54
+export const enableRetryLaneExpiration = false;
55
56
export const disableSchedulerTimeoutInWorkLoop = false;
57
export const enableLazyContextPropagation = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
+1
@@ -49,6 +49,7 @@ export const enableComponentStackLocations = true;
49
export const enableLegacyFBSupport = false;
50
export const enableFilterEmptyStringAttributesDOM = true;
51
export const enableGetInspectorDataForInstanceInProduction = false;
52
+export const enableRetryLaneExpiration = false;
53
54
export const createRootStrictEffectsByDefault = false;
55
export const enableUseRefAccessWarning = false;
packages/shared/forks/ReactFeatureFlags.www-dynamic.js
+1
@@ -29,6 +29,7 @@ export const enableAsyncActions = __VARIANT__;
29
export const alwaysThrottleRetries = __VARIANT__;
30
export const enableDO_NOT_USE_disableStrictPassiveEffect = __VARIANT__;
31
export const enableUseDeferredValueInitialArg = __VARIANT__;
32
+export const enableRetryLaneExpiration = __VARIANT__;
33
34
// Enable this flag to help with concurrent mode debugging.
35
// It logs information to the console about React scheduling, rendering, and commit phases.
packages/shared/forks/ReactFeatureFlags.www.js
+1
@@ -24,6 +24,7 @@ export const {
24
enableUseRefAccessWarning,
25
enableLazyContextPropagation,
26
enableUnifiedSyncLane,
27
+ enableRetryLaneExpiration,
28
enableTransitionTracing,
29
enableCustomElementPropertySupport,
30
enableDeferRootSchedulingToMicrotask,