Skip to content

Commit 51425aa

Browse files
kassensAndyPengc12
authored andcommitted
Add feature flags for expiration times (facebook#27821)
It seems worthwhile to me to run a test to experiment with different expiration times. This moves the expiration times for scheduler and reconciler into FeatureFlags for the facebook build. Non-facebook should not be affected by these changes.
1 parent 82fa9ea commit 51425aa

13 files changed

+68
-20
lines changed

packages/react-reconciler/src/ReactFiberLane.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import {
2525
enableTransitionTracing,
2626
enableUnifiedSyncLane,
2727
enableUpdaterTracking,
28+
syncLaneExpirationMs,
29+
transitionLaneExpirationMs,
30+
retryLaneExpirationMs,
2831
} from 'shared/ReactFeatureFlags';
2932
import {isDevToolsPresent} from './ReactFiberDevToolsHook';
3033
import {ConcurrentUpdatesByDefaultMode, NoMode} from './ReactTypeOfMode';
@@ -355,7 +358,7 @@ function computeExpirationTime(lane: Lane, currentTime: number) {
355358
// to fix the starvation. However, this scenario supports the idea that
356359
// expiration times are an important safeguard when starvation
357360
// does happen.
358-
return currentTime + 250;
361+
return currentTime + syncLaneExpirationMs;
359362
case DefaultHydrationLane:
360363
case DefaultLane:
361364
case TransitionHydrationLane:
@@ -374,7 +377,7 @@ function computeExpirationTime(lane: Lane, currentTime: number) {
374377
case TransitionLane13:
375378
case TransitionLane14:
376379
case TransitionLane15:
377-
return currentTime + 5000;
380+
return currentTime + transitionLaneExpirationMs;
378381
case RetryLane1:
379382
case RetryLane2:
380383
case RetryLane3:
@@ -384,7 +387,9 @@ function computeExpirationTime(lane: Lane, currentTime: number) {
384387
// crashes. There must be some other underlying bug; not super urgent but
385388
// ideally should figure out why and fix it. Unfortunately we don't have
386389
// a repro for the crashes, only detected via production metrics.
387-
return enableRetryLaneExpiration ? currentTime + 5000 : NoTimestamp;
390+
return enableRetryLaneExpiration
391+
? currentTime + retryLaneExpirationMs
392+
: NoTimestamp;
388393
case SelectiveHydrationLane:
389394
case IdleHydrationLane:
390395
case IdleLane:

packages/scheduler/src/SchedulerFeatureFlags.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ export const enableIsInputPendingContinuous = false;
1414
export const frameYieldMs = 5;
1515
export const continuousYieldMs = 50;
1616
export const maxYieldMs = 300;
17+
18+
export const userBlockingPriorityTimeout = 250;
19+
export const normalPriorityTimeout = 5000;
20+
export const lowPriorityTimeout = 10000;

packages/scheduler/src/forks/Scheduler.js

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import {
1919
frameYieldMs,
2020
continuousYieldMs,
2121
maxYieldMs,
22+
userBlockingPriorityTimeout,
23+
lowPriorityTimeout,
24+
normalPriorityTimeout,
2225
} from '../SchedulerFeatureFlags';
2326

2427
import {push, pop, peek} from '../SchedulerMinHeap';
@@ -75,15 +78,6 @@ if (hasPerformanceNow) {
7578
// 0b111111111111111111111111111111
7679
var maxSigned31BitInt = 1073741823;
7780

78-
// Times out immediately
79-
var IMMEDIATE_PRIORITY_TIMEOUT = -1;
80-
// Eventually times out
81-
var USER_BLOCKING_PRIORITY_TIMEOUT = 250;
82-
var NORMAL_PRIORITY_TIMEOUT = 5000;
83-
var LOW_PRIORITY_TIMEOUT = 10000;
84-
// Never times out
85-
var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;
86-
8781
// Tasks are stored on a min heap
8882
var taskQueue: Array<Task> = [];
8983
var timerQueue: Array<Task> = [];
@@ -362,20 +356,25 @@ function unstable_scheduleCallback(
362356
var timeout;
363357
switch (priorityLevel) {
364358
case ImmediatePriority:
365-
timeout = IMMEDIATE_PRIORITY_TIMEOUT;
359+
// Times out immediately
360+
timeout = -1;
366361
break;
367362
case UserBlockingPriority:
368-
timeout = USER_BLOCKING_PRIORITY_TIMEOUT;
363+
// Eventually times out
364+
timeout = userBlockingPriorityTimeout;
369365
break;
370366
case IdlePriority:
371-
timeout = IDLE_PRIORITY_TIMEOUT;
367+
// Never times out
368+
timeout = maxSigned31BitInt;
372369
break;
373370
case LowPriority:
374-
timeout = LOW_PRIORITY_TIMEOUT;
371+
// Eventually times out
372+
timeout = lowPriorityTimeout;
375373
break;
376374
case NormalPriority:
377375
default:
378-
timeout = NORMAL_PRIORITY_TIMEOUT;
376+
// Eventually times out
377+
timeout = normalPriorityTimeout;
379378
break;
380379
}
381380

packages/scheduler/src/forks/SchedulerFeatureFlags.www-dynamic.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@
1212
// with the __VARIANT__ set to `true`, and once set to `false`.
1313

1414
export const enableProfiling = __VARIANT__;
15+
16+
export const userBlockingPriorityTimeout = 250;
17+
export const normalPriorityTimeout = 5000;
18+
export const lowPriorityTimeout = 10000;

packages/scheduler/src/forks/SchedulerFeatureFlags.www.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@
77
* @flow
88
*/
99

10-
const {enableProfiling: enableProfilingFeatureFlag} =
11-
// $FlowFixMe[cannot-resolve-module]
12-
require('SchedulerFeatureFlags');
10+
// $FlowFixMe[cannot-resolve-module]
11+
const dynamicFeatureFlags = require('SchedulerFeatureFlags');
1312

13+
const {enableProfiling: enableProfilingFeatureFlag} = dynamicFeatureFlags;
14+
15+
export const {
16+
userBlockingPriorityTimeout,
17+
normalPriorityTimeout,
18+
lowPriorityTimeout,
19+
} = dynamicFeatureFlags;
1420
export const enableSchedulerDebugging = true;
1521
export const enableProfiling: boolean =
1622
__PROFILE__ && enableProfilingFeatureFlag;

packages/shared/ReactFeatureFlags.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ export const enableUseDeferredValueInitialArg = __EXPERIMENTAL__;
130130
* Enables an expiration time for retry lanes to avoid starvation.
131131
*/
132132
export const enableRetryLaneExpiration = false;
133+
export const retryLaneExpirationMs = 5000;
134+
export const syncLaneExpirationMs = 250;
135+
export const transitionLaneExpirationMs = 5000;
133136

134137
// -----------------------------------------------------------------------------
135138
// Chopping Block

packages/shared/forks/ReactFeatureFlags.native-fb.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ export const enableComponentStackLocations = false;
6666
export const enableLegacyFBSupport = false;
6767
export const enableFilterEmptyStringAttributesDOM = false;
6868
export const enableGetInspectorDataForInstanceInProduction = true;
69+
6970
export const enableRetryLaneExpiration = false;
71+
export const retryLaneExpirationMs = 5000;
72+
export const syncLaneExpirationMs = 250;
73+
export const transitionLaneExpirationMs = 5000;
7074

7175
export const createRootStrictEffectsByDefault = false;
7276

packages/shared/forks/ReactFeatureFlags.native-oss.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ export const enableComponentStackLocations = false;
4949
export const enableLegacyFBSupport = false;
5050
export const enableFilterEmptyStringAttributesDOM = false;
5151
export const enableGetInspectorDataForInstanceInProduction = false;
52+
5253
export const enableRetryLaneExpiration = false;
54+
export const retryLaneExpirationMs = 5000;
55+
export const syncLaneExpirationMs = 250;
56+
export const transitionLaneExpirationMs = 5000;
5357

5458
export const createRootStrictEffectsByDefault = false;
5559
export const enableUseRefAccessWarning = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ export const enableComponentStackLocations = true;
4949
export const enableLegacyFBSupport = false;
5050
export const enableFilterEmptyStringAttributesDOM = false;
5151
export const enableGetInspectorDataForInstanceInProduction = false;
52+
5253
export const enableRetryLaneExpiration = false;
54+
export const retryLaneExpirationMs = 5000;
55+
export const syncLaneExpirationMs = 250;
56+
export const transitionLaneExpirationMs = 5000;
5357

5458
export const createRootStrictEffectsByDefault = false;
5559
export const enableUseRefAccessWarning = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.native.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ export const enableUseEffectEventHook = false;
5151
export const enableClientRenderFallbackOnTextMismatch = true;
5252
export const createRootStrictEffectsByDefault = false;
5353
export const enableUseRefAccessWarning = false;
54+
5455
export const enableRetryLaneExpiration = false;
56+
export const retryLaneExpirationMs = 5000;
57+
export const syncLaneExpirationMs = 250;
58+
export const transitionLaneExpirationMs = 5000;
5559

5660
export const disableSchedulerTimeoutInWorkLoop = false;
5761
export const enableLazyContextPropagation = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.www.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ export const enableComponentStackLocations = true;
4949
export const enableLegacyFBSupport = false;
5050
export const enableFilterEmptyStringAttributesDOM = true;
5151
export const enableGetInspectorDataForInstanceInProduction = false;
52+
5253
export const enableRetryLaneExpiration = false;
54+
export const retryLaneExpirationMs = 5000;
55+
export const syncLaneExpirationMs = 250;
56+
export const transitionLaneExpirationMs = 5000;
5357

5458
export const createRootStrictEffectsByDefault = false;
5559
export const enableUseRefAccessWarning = false;

packages/shared/forks/ReactFeatureFlags.www-dynamic.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ export const enableAsyncActions = __VARIANT__;
2929
export const alwaysThrottleRetries = __VARIANT__;
3030
export const enableDO_NOT_USE_disableStrictPassiveEffect = __VARIANT__;
3131
export const enableUseDeferredValueInitialArg = __VARIANT__;
32+
3233
export const enableRetryLaneExpiration = __VARIANT__;
34+
export const retryLaneExpirationMs = 5000;
35+
export const syncLaneExpirationMs = 250;
36+
export const transitionLaneExpirationMs = 5000;
3337

3438
// Enable this flag to help with concurrent mode debugging.
3539
// It logs information to the console about React scheduling, rendering, and commit phases.

packages/shared/forks/ReactFeatureFlags.www.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ export const {
3333
enableDO_NOT_USE_disableStrictPassiveEffect,
3434
disableSchedulerTimeoutInWorkLoop,
3535
enableUseDeferredValueInitialArg,
36+
retryLaneExpirationMs,
37+
syncLaneExpirationMs,
38+
transitionLaneExpirationMs,
3639
} = dynamicFeatureFlags;
3740

3841
// On WWW, __EXPERIMENTAL__ is used for a new modern build.

0 commit comments

Comments
 (0)