@samitouri / QOS-React-2 / commits / 8a5274d8c8

Cleanup enableEagerAlternateStateNodeCleanup feature flag (#35508)

## Summary This has been fully rolled out internally and was manually merged in the RN release in https://github.com/facebook/react-native/commit/0411c43b3a239384c778baad22c7b4c501008449 ## How did you test this change? `yarn flow fabric`

Pieter De Baets committed Jun 23, 2026 at 10:55 UTC 8a5274d8c8ce8649661656003e6e54e19f6dc0c3
9 files changed +10 -23
packages/react-reconciler/src/ReactFiberCommitWork.js
+10 -13
@@ -59,7 +59,6 @@ import {
59 enableComponentPerformanceTrack,
60 enableViewTransition,
61 enableFragmentRefs,
62 - enableEagerAlternateStateNodeCleanup,
62 enableDefaultTransitionIndicator,
63 enableFragmentRefsTextNodes,
64 } from 'shared/ReactFeatureFlags';
@@ -2270,18 +2269,16 @@ function commitMutationEffectsOnFiber(
2269 }
2270 }
2271 } else {
2273 - if (enableEagerAlternateStateNodeCleanup) {
2274 - // $FlowFixMe[constant-condition]
2275 - if (supportsPersistence) {
2276 - if (finishedWork.alternate !== null) {
2277 - // `finishedWork.alternate.stateNode` is pointing to a stale shadow
2278 - // node at this point, retaining it and its subtree. To reclaim
2279 - // memory, point `alternate.stateNode` to new shadow node. This
2280 - // prevents shadow node from staying in memory longer than it
2281 - // needs to. The correct behaviour of this is checked by test in
2282 - // React Native: ShadowNodeReferenceCounter-itest.js#L150
2283 - finishedWork.alternate.stateNode = finishedWork.stateNode;
2284 - }
2272 + // $FlowFixMe[constant-condition]
2273 + if (supportsPersistence) {
2274 + if (finishedWork.alternate !== null) {
2275 + // `finishedWork.alternate.stateNode` is pointing to a stale shadow
2276 + // node at this point, retaining it and its subtree. To reclaim
2277 + // memory, point `alternate.stateNode` to new shadow node. This
2278 + // prevents shadow node from staying in memory longer than it
2279 + // needs to. The correct behaviour of this is checked by test in
2280 + // React Native: ShadowNodeReferenceCounter-itest.js#L150
2281 + finishedWork.alternate.stateNode = finishedWork.stateNode;
2282 }
2283 }
2284 }
packages/shared/ReactFeatureFlags.js
-2
@@ -129,8 +129,6 @@ export const enableEffectEventMutationPhase: boolean = false;
129
130 export const passChildrenWhenCloningPersistedNodes: boolean = false;
131
132 -export const enableEagerAlternateStateNodeCleanup: boolean = true;
133 -
132 /**
133 * Enables an expiration time for retry lanes to avoid starvation.
134 */
packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js
-1
@@ -19,7 +19,6 @@
19
20 export const alwaysThrottleRetries = __VARIANT__;
21 export const enableObjectFiber = __VARIANT__;
22 -export const enableEagerAlternateStateNodeCleanup = __VARIANT__;
22 export const passChildrenWhenCloningPersistedNodes = __VARIANT__;
23 export const enableFragmentRefs = __VARIANT__;
24 export const enableFragmentRefsScrollIntoView = __VARIANT__;
packages/shared/forks/ReactFeatureFlags.native-fb.js
-1
@@ -22,7 +22,6 @@ export const {
22 alwaysThrottleRetries,
23 enableEffectEventMutationPhase,
24 enableObjectFiber,
25 - enableEagerAlternateStateNodeCleanup,
25 passChildrenWhenCloningPersistedNodes,
26 enableFragmentRefs,
27 enableFragmentRefsScrollIntoView,
packages/shared/forks/ReactFeatureFlags.native-oss.js
-1
@@ -44,7 +44,6 @@ export const enablePerformanceIssueReporting: boolean = false;
44 export const enableSchedulingProfiler: boolean =
45 !enableComponentPerformanceTrack && __PROFILE__;
46 export const enableScopeAPI: boolean = false;
47 -export const enableEagerAlternateStateNodeCleanup: boolean = true;
47 export const enableEffectEventMutationPhase: boolean = false;
48 export const enableSuspenseAvoidThisFallback: boolean = false;
49 export const enableSuspenseCallback: boolean = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.js
-1
@@ -54,7 +54,6 @@ export const disableClientCache: boolean = true;
54 export const enableInfiniteRenderLoopDetection: boolean = false;
55 export const enableInfiniteRenderLoopDetectionForceThrow: boolean = false;
56
57 -export const enableEagerAlternateStateNodeCleanup: boolean = true;
57 export const enableEffectEventMutationPhase: boolean = false;
58
59 export const enableYieldingBeforePassive: boolean = true;
packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
-1
@@ -41,7 +41,6 @@ export const enableSchedulingProfiler = __PROFILE__;
41 export const enableComponentPerformanceTrack = false;
42 export const enablePerformanceIssueReporting = false;
43 export const enableScopeAPI = false;
44 -export const enableEagerAlternateStateNodeCleanup = true;
44 export const enableEffectEventMutationPhase = false;
45 export const enableSuspenseAvoidThisFallback = false;
46 export const enableSuspenseCallback = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
-1
@@ -60,7 +60,6 @@ export const enableReactTestRendererWarning: boolean = false;
60 export const disableLegacyMode: boolean = true;
61
62 export const enableObjectFiber: boolean = false;
63 -export const enableEagerAlternateStateNodeCleanup: boolean = true;
63 export const enableEffectEventMutationPhase: boolean = false;
64
65 export const enableYieldingBeforePassive: boolean = false;
packages/shared/forks/ReactFeatureFlags.www.js
-2
@@ -98,8 +98,6 @@ export const enableReactTestRendererWarning: boolean = false;
98
99 export const disableLegacyMode: boolean = true;
100
101 -export const enableEagerAlternateStateNodeCleanup: boolean = true;
102 -
101 export const enableViewTransitionForPersistenceMode: boolean = false;
102
103 export const enableGestureTransition: boolean = false;