mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Fix bugs with intervals
Summary:
Fixes some bugs involving intervals, and updates RandomizedTimer to support both fixed and
randomized delays, and to better handle async callbacks.
* Fixed a bug where Throttle would queue up many pidusage calls due to the use of
setInterval, and the async nature of the calls.
* Fixed a but where RandomizedTimer (now just Interval) would not be disabled in
ActiveDoc on doc shutdown if initialization had not yet settled.
Test Plan: Tested manually.
Reviewers: jarek, dsagal
Reviewed By: jarek, dsagal
Subscribers: dsagal
Differential Revision: https://phab.getgrist.com/D3604
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
import pidusage from '@gristlabs/pidusage';
|
||||
import {Interval} from 'app/common/Interval';
|
||||
import log from 'app/server/lib/log';
|
||||
|
||||
/**
|
||||
@@ -71,8 +72,8 @@ interface MeterSample {
|
||||
* process from consuming too much cpu until stop() is called.
|
||||
*/
|
||||
export class Throttle {
|
||||
private _timing: ThrottleTiming; // overall timing parameters
|
||||
private _meteringInterval: NodeJS.Timeout | undefined; // timer for cpu measurements
|
||||
private _timing: ThrottleTiming =
|
||||
this._options.timing || defaultThrottleTiming; // overall timing parameters
|
||||
private _dutyCycleTimeout: NodeJS.Timeout | undefined; // driver for throttle duty cycle
|
||||
private _traceNudgeTimeout: NodeJS.Timeout | undefined; // schedule a nudge to a traced process
|
||||
private _throttleFactor: number = 0; // relative length of paused phase
|
||||
@@ -84,6 +85,13 @@ export class Throttle {
|
||||
private _stopped: boolean = false; // set when stop has been called
|
||||
private _active: boolean = true; // set when we are not trying to pause process
|
||||
|
||||
// Interval for CPU measurements.
|
||||
private _meteringInterval: Interval = new Interval(
|
||||
() => this._update(),
|
||||
{delayMs: this._timing.samplePeriodMs},
|
||||
{onError: (e) => this._log(`Throttle error: ${e}`, this._options.logMeta)},
|
||||
);
|
||||
|
||||
/**
|
||||
* Start monitoring the given process and throttle as needed.
|
||||
* If readPid is set, CPU usage will be read for that process.
|
||||
@@ -127,8 +135,7 @@ export class Throttle {
|
||||
logMeta: log.ILogMeta,
|
||||
timing?: ThrottleTiming
|
||||
}) {
|
||||
this._timing = this._options.timing || defaultThrottleTiming;
|
||||
this._meteringInterval = setInterval(() => this._update(), this._timing.samplePeriodMs);
|
||||
this._meteringInterval.enable();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -285,10 +292,7 @@ export class Throttle {
|
||||
* Make sure measurement of cpu is stopped.
|
||||
*/
|
||||
private _stopMetering() {
|
||||
if (this._meteringInterval) {
|
||||
clearInterval(this._meteringInterval);
|
||||
this._meteringInterval = undefined;
|
||||
}
|
||||
this._meteringInterval.disable();
|
||||
}
|
||||
|
||||
private _stopTraceNudge() {
|
||||
|
||||
Reference in New Issue
Block a user