@samitouri / QOS-React-2 / commits / 593ecee66a

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,