pg-boss 12.33.0 → 12.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bam.d.ts.map +1 -1
- package/dist/bam.js +10 -5
- package/dist/boss.d.ts.map +1 -1
- package/dist/boss.js +21 -5
- package/dist/claimTimer.d.ts +44 -0
- package/dist/claimTimer.d.ts.map +1 -0
- package/dist/claimTimer.js +95 -0
- package/dist/navigator.d.ts.map +1 -1
- package/dist/navigator.js +10 -5
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +17 -3
- package/dist/timekeeper.d.ts +12 -6
- package/dist/timekeeper.d.ts.map +1 -1
- package/dist/timekeeper.js +58 -14
- package/package.json +1 -1
package/dist/bam.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bam.d.ts","sourceRoot":"","sources":["../src/bam.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"bam.d.ts","sourceRoot":"","sources":["../src/bam.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAItC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAOnC,cAAM,GAAI,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAOzD,MAAM;;;MAAS;gBAGb,EAAE,EAAE,KAAK,CAAC,SAAS,EACnB,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAU1C,IAAI,OAAO,IAAK,OAAO,CAEtB;IAEK,KAAK;IAcL,IAAI;CAkIX;AAED,eAAe,GAAG,CAAA"}
|
package/dist/bam.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import EventEmitter from 'node:events';
|
|
2
|
+
import { ClaimTimer } from "./claimTimer.js";
|
|
2
3
|
import * as plans from "./plans.js";
|
|
3
4
|
import { delay } from "./tools.js";
|
|
4
5
|
import * as types from "./types.js";
|
|
@@ -9,7 +10,7 @@ const events = {
|
|
|
9
10
|
class Bam extends EventEmitter {
|
|
10
11
|
#stopped;
|
|
11
12
|
#working;
|
|
12
|
-
#
|
|
13
|
+
#pollTimer;
|
|
13
14
|
#db;
|
|
14
15
|
#config;
|
|
15
16
|
events = events;
|
|
@@ -27,16 +28,17 @@ class Bam extends EventEmitter {
|
|
|
27
28
|
if (!this.#stopped)
|
|
28
29
|
return;
|
|
29
30
|
this.#stopped = false;
|
|
31
|
+
this.#pollTimer = new ClaimTimer(this.#config.clock, this.#config.bamIntervalSeconds, () => this.#onPoll());
|
|
30
32
|
setImmediate(() => this.#onPoll());
|
|
31
|
-
this.#
|
|
33
|
+
this.#pollTimer.start();
|
|
32
34
|
}
|
|
33
35
|
async stop() {
|
|
34
36
|
if (this.#stopped)
|
|
35
37
|
return;
|
|
36
38
|
this.#stopped = true;
|
|
37
|
-
if (this.#
|
|
38
|
-
this.#
|
|
39
|
-
this.#
|
|
39
|
+
if (this.#pollTimer) {
|
|
40
|
+
this.#pollTimer.stop();
|
|
41
|
+
this.#pollTimer = undefined;
|
|
40
42
|
}
|
|
41
43
|
while (this.#working) {
|
|
42
44
|
await delay(10);
|
|
@@ -55,6 +57,9 @@ class Bam extends EventEmitter {
|
|
|
55
57
|
}
|
|
56
58
|
const sql = plans.trySetBamTime(this.#config.schema, this.#config.bamIntervalSeconds);
|
|
57
59
|
const { rows } = await this.#db.executeSql(sql);
|
|
60
|
+
// The row is stamped; the next attempt is measured from here rather than from the tick that
|
|
61
|
+
// started this one. See ClaimTimer.
|
|
62
|
+
this.#pollTimer?.anchor();
|
|
58
63
|
if (rows.length === 1) {
|
|
59
64
|
await this.#processCommands();
|
|
60
65
|
}
|
package/dist/boss.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss.d.ts","sourceRoot":"","sources":["../src/boss.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"boss.d.ts","sourceRoot":"","sources":["../src/boss.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAEtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAgHnC,cAAM,IAAK,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAsC1D,MAAM;;;MAAS;gBAGb,EAAE,EAAE,KAAK,CAAC,SAAS,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAa1C,IAAI,WAAW,IAAK,OAAO,CAE1B;IAEK,KAAK;IAaL,IAAI;IAmGJ,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,gBAAgB;IAorBvF;;;;OAIG;IACG,kBAAkB,CAAE,OAAO,CAAC,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAwB7E;AAED,eAAe,IAAI,CAAA"}
|
package/dist/boss.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import EventEmitter from 'node:events';
|
|
2
|
+
import { ClaimTimer } from "./claimTimer.js";
|
|
2
3
|
import * as plans from "./plans.js";
|
|
3
4
|
import { delay, unwrapSQLResult } from "./tools.js";
|
|
4
5
|
import * as types from "./types.js";
|
|
@@ -75,7 +76,7 @@ class Boss extends EventEmitter {
|
|
|
75
76
|
#stopped;
|
|
76
77
|
#stopping;
|
|
77
78
|
#maintaining;
|
|
78
|
-
#
|
|
79
|
+
#superviseTimer;
|
|
79
80
|
#db;
|
|
80
81
|
#config;
|
|
81
82
|
#manager;
|
|
@@ -125,15 +126,16 @@ class Boss extends EventEmitter {
|
|
|
125
126
|
async start() {
|
|
126
127
|
if (this.#stopped) {
|
|
127
128
|
this.#stopping = false;
|
|
128
|
-
this.#
|
|
129
|
+
this.#superviseTimer = new ClaimTimer(this.#config.clock, this.#config.superviseIntervalSeconds, () => this.#onSupervise());
|
|
130
|
+
this.#superviseTimer.start();
|
|
129
131
|
this.#stopped = false;
|
|
130
132
|
}
|
|
131
133
|
}
|
|
132
134
|
async stop() {
|
|
133
135
|
if (!this.#stopped) {
|
|
134
136
|
this.#stopping = true;
|
|
135
|
-
if (this.#
|
|
136
|
-
this.#
|
|
137
|
+
if (this.#superviseTimer)
|
|
138
|
+
this.#superviseTimer.stop();
|
|
137
139
|
this.#stopped = true;
|
|
138
140
|
while (this.#maintaining) {
|
|
139
141
|
await delay(10);
|
|
@@ -178,7 +180,11 @@ class Boss extends EventEmitter {
|
|
|
178
180
|
await delay(this.#config.__test__delay_maint_ms);
|
|
179
181
|
}
|
|
180
182
|
const queues = await this.#manager.getQueues();
|
|
181
|
-
|
|
183
|
+
// The timer's own pass is the only one that re-anchors it. A supervise() call from the
|
|
184
|
+
// application stamps the same claims, but it may be scoped to a single queue, and anchoring
|
|
185
|
+
// on it would push the background pass - the one that covers every other queue - out by a
|
|
186
|
+
// full interval each time. An application polling one hot queue would starve the rest.
|
|
187
|
+
!this.#stopped && (await this.#supervisePass(queues, undefined, () => this.#superviseTimer?.anchor()));
|
|
182
188
|
}
|
|
183
189
|
catch (err) {
|
|
184
190
|
this.emit(events.error, err);
|
|
@@ -208,6 +214,11 @@ class Boss extends EventEmitter {
|
|
|
208
214
|
await this.#executeQuery(sql);
|
|
209
215
|
}
|
|
210
216
|
async supervise(value, options) {
|
|
217
|
+
await this.#supervisePass(value, options);
|
|
218
|
+
}
|
|
219
|
+
// onClaimsSettled fires once every monitor and maintain claim in the pass has been stamped, which
|
|
220
|
+
// is where the background timer measures its next attempt from. Only #onSupervise passes one.
|
|
221
|
+
async #supervisePass(value, options, onClaimsSettled) {
|
|
211
222
|
let queues;
|
|
212
223
|
if (Array.isArray(value)) {
|
|
213
224
|
queues = value;
|
|
@@ -242,6 +253,11 @@ class Boss extends EventEmitter {
|
|
|
242
253
|
await this.#maintain(table, chunk);
|
|
243
254
|
}
|
|
244
255
|
}
|
|
256
|
+
// Every monitor and maintain claim in this pass has now been stamped, so the next pass is
|
|
257
|
+
// measured from here rather than from the tick that started this one. See ClaimTimer. Before
|
|
258
|
+
// the tail below and not at the end of the pass: the tail ends in a rebuild that is DDL and can
|
|
259
|
+
// run for seconds, and the claims must not be measured from the far side of it.
|
|
260
|
+
onClaimsSettled?.();
|
|
245
261
|
if (this.#stopping)
|
|
246
262
|
return;
|
|
247
263
|
// Immediately after the aggregates it measures, not at the head of the next pass. Deferring the
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Clock } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The timer behind an interval claim, anchored to the claim instead of to a fixed grid.
|
|
4
|
+
*
|
|
5
|
+
* An interval claim is a conditional UPDATE that only goes through when the row it stamps is at
|
|
6
|
+
* least `seconds` old by the server's clock, so exactly one instance in a deployment runs the pass
|
|
7
|
+
* per interval (see plans.trySetTimestamp). Every instance tries on a timer of its own.
|
|
8
|
+
*
|
|
9
|
+
* setInterval schedules the next tick from a grid fixed before the callback runs, while the row is
|
|
10
|
+
* stamped when the UPDATE reaches the server - a moment later by however long the pool wait, the
|
|
11
|
+
* round trip and the plan took. The two do not move together. When a tick's statement lands faster
|
|
12
|
+
* than the previous tick's did, the two stamps come out closer together than the period, the claim
|
|
13
|
+
* is refused, and the pass after it is a whole interval late. Measured on an idle Linux box that is
|
|
14
|
+
* 4 of 19 ticks at a 45-second period, all of them between 44.990 and 44.998 seconds old, and a
|
|
15
|
+
* quarter of the queue monitor's passes at its defaults. For the cron pass a lost claim is a
|
|
16
|
+
* 90-second gap against a 60-second due window, and the occurrences inside it are never sent.
|
|
17
|
+
*
|
|
18
|
+
* Anchoring removes the mismatch rather than tolerating it: the next attempt is scheduled once the
|
|
19
|
+
* claim has been stamped, so the gap between two stamps is the period plus one round trip rather
|
|
20
|
+
* than the period minus the difference between two of them. It can only ever come out long, never
|
|
21
|
+
* short, which is the direction that costs nothing - a pass never runs before its interval is up.
|
|
22
|
+
*
|
|
23
|
+
* Note what does not appear here: a clock. The claim compares two timestamps that the server wrote,
|
|
24
|
+
* so the client's clock is already absent from it and skew between the two cancels exactly. There
|
|
25
|
+
* is nothing for a skew correction to correct, which is why the fix is in when the attempt is made
|
|
26
|
+
* rather than in what it is measured against.
|
|
27
|
+
*
|
|
28
|
+
* `anchor()` is what a pass calls once its claim has been stamped. A pass that returns without ever
|
|
29
|
+
* reaching its claim - stopped, already working, an error on the way in - is re-armed from the end
|
|
30
|
+
* of the callback instead, so the chain cannot die on a path that never anchored it.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ClaimTimer {
|
|
33
|
+
#private;
|
|
34
|
+
constructor(clock: Clock, seconds: number, fn: () => Promise<void>);
|
|
35
|
+
start(): void;
|
|
36
|
+
stop(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Re-anchors the next attempt to now, because the claim this timer drives has just been stamped.
|
|
39
|
+
* Called whether the claim was won or lost: the winner needs its next attempt to fall after its
|
|
40
|
+
* own stamp, and a loser's phase is its own business either way.
|
|
41
|
+
*/
|
|
42
|
+
anchor(): void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=claimTimer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claimTimer.d.ts","sourceRoot":"","sources":["../src/claimTimer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,YAAY,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,UAAU;;gBASR,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAMnE,KAAK,IAAK,IAAI;IAOd,IAAI,IAAK,IAAI;IAKb;;;;OAIG;IACH,MAAM,IAAK,IAAI;CAwChB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The timer behind an interval claim, anchored to the claim instead of to a fixed grid.
|
|
3
|
+
*
|
|
4
|
+
* An interval claim is a conditional UPDATE that only goes through when the row it stamps is at
|
|
5
|
+
* least `seconds` old by the server's clock, so exactly one instance in a deployment runs the pass
|
|
6
|
+
* per interval (see plans.trySetTimestamp). Every instance tries on a timer of its own.
|
|
7
|
+
*
|
|
8
|
+
* setInterval schedules the next tick from a grid fixed before the callback runs, while the row is
|
|
9
|
+
* stamped when the UPDATE reaches the server - a moment later by however long the pool wait, the
|
|
10
|
+
* round trip and the plan took. The two do not move together. When a tick's statement lands faster
|
|
11
|
+
* than the previous tick's did, the two stamps come out closer together than the period, the claim
|
|
12
|
+
* is refused, and the pass after it is a whole interval late. Measured on an idle Linux box that is
|
|
13
|
+
* 4 of 19 ticks at a 45-second period, all of them between 44.990 and 44.998 seconds old, and a
|
|
14
|
+
* quarter of the queue monitor's passes at its defaults. For the cron pass a lost claim is a
|
|
15
|
+
* 90-second gap against a 60-second due window, and the occurrences inside it are never sent.
|
|
16
|
+
*
|
|
17
|
+
* Anchoring removes the mismatch rather than tolerating it: the next attempt is scheduled once the
|
|
18
|
+
* claim has been stamped, so the gap between two stamps is the period plus one round trip rather
|
|
19
|
+
* than the period minus the difference between two of them. It can only ever come out long, never
|
|
20
|
+
* short, which is the direction that costs nothing - a pass never runs before its interval is up.
|
|
21
|
+
*
|
|
22
|
+
* Note what does not appear here: a clock. The claim compares two timestamps that the server wrote,
|
|
23
|
+
* so the client's clock is already absent from it and skew between the two cancels exactly. There
|
|
24
|
+
* is nothing for a skew correction to correct, which is why the fix is in when the attempt is made
|
|
25
|
+
* rather than in what it is measured against.
|
|
26
|
+
*
|
|
27
|
+
* `anchor()` is what a pass calls once its claim has been stamped. A pass that returns without ever
|
|
28
|
+
* reaching its claim - stopped, already working, an error on the way in - is re-armed from the end
|
|
29
|
+
* of the callback instead, so the chain cannot die on a path that never anchored it.
|
|
30
|
+
*/
|
|
31
|
+
export class ClaimTimer {
|
|
32
|
+
#clock;
|
|
33
|
+
#ms;
|
|
34
|
+
#fn;
|
|
35
|
+
#handle;
|
|
36
|
+
#stopped = true;
|
|
37
|
+
#anchored = false;
|
|
38
|
+
constructor(clock, seconds, fn) {
|
|
39
|
+
this.#clock = clock;
|
|
40
|
+
this.#ms = seconds * 1000;
|
|
41
|
+
this.#fn = fn;
|
|
42
|
+
}
|
|
43
|
+
start() {
|
|
44
|
+
if (!this.#stopped)
|
|
45
|
+
return;
|
|
46
|
+
this.#stopped = false;
|
|
47
|
+
this.#arm();
|
|
48
|
+
}
|
|
49
|
+
stop() {
|
|
50
|
+
this.#stopped = true;
|
|
51
|
+
this.#disarm();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Re-anchors the next attempt to now, because the claim this timer drives has just been stamped.
|
|
55
|
+
* Called whether the claim was won or lost: the winner needs its next attempt to fall after its
|
|
56
|
+
* own stamp, and a loser's phase is its own business either way.
|
|
57
|
+
*/
|
|
58
|
+
anchor() {
|
|
59
|
+
if (this.#stopped)
|
|
60
|
+
return;
|
|
61
|
+
this.#anchored = true;
|
|
62
|
+
this.#arm();
|
|
63
|
+
}
|
|
64
|
+
#arm() {
|
|
65
|
+
this.#disarm();
|
|
66
|
+
if (this.#stopped)
|
|
67
|
+
return;
|
|
68
|
+
this.#handle = this.#clock.setTimeout(() => { this.#run(); }, this.#ms);
|
|
69
|
+
}
|
|
70
|
+
#disarm() {
|
|
71
|
+
if (this.#handle !== undefined) {
|
|
72
|
+
this.#clock.clearTimeout(this.#handle);
|
|
73
|
+
this.#handle = undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async #run() {
|
|
77
|
+
this.#handle = undefined;
|
|
78
|
+
this.#anchored = false;
|
|
79
|
+
// Deliberately not caught. Every pass this drives ends its own catch in an error event, so the
|
|
80
|
+
// only rejection that reaches here is one that could not be reported - an error event with
|
|
81
|
+
// nothing listening, which EventEmitter throws on. That belongs to the process, the way it did
|
|
82
|
+
// when these ran on setInterval; a timer that turned it into anything else would be inventing a
|
|
83
|
+
// failure mode for the host to handle. What the timer does owe is the chain, and finally pays
|
|
84
|
+
// that whether the pass resolved or not.
|
|
85
|
+
try {
|
|
86
|
+
await this.#fn();
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
// A pass that reached its claim already armed the next attempt through anchor(); this is the
|
|
90
|
+
// path for one that did not, including one that threw.
|
|
91
|
+
if (!this.#anchored)
|
|
92
|
+
this.#arm();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
package/dist/navigator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAEtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAiBnC,cAAM,SAAU,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAS/D,MAAM;;;MAAS;gBAGb,EAAE,EAAE,KAAK,CAAC,SAAS,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAY1C,IAAI,OAAO,IAAK,OAAO,CAEtB;IAEK,KAAK;IAeL,IAAI;IAiDJ,UAAU,IAAK,OAAO,CAAC,IAAI,CAAC;CA8DnC;AAED,eAAe,SAAS,CAAA"}
|
package/dist/navigator.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import EventEmitter from 'node:events';
|
|
2
|
+
import { ClaimTimer } from "./claimTimer.js";
|
|
2
3
|
import * as plans from "./plans.js";
|
|
3
4
|
import { delay } from "./tools.js";
|
|
4
5
|
import * as types from "./types.js";
|
|
@@ -19,7 +20,7 @@ class Navigator extends EventEmitter {
|
|
|
19
20
|
#stopped;
|
|
20
21
|
#stopping;
|
|
21
22
|
#working;
|
|
22
|
-
#
|
|
23
|
+
#pollTimer;
|
|
23
24
|
#db;
|
|
24
25
|
#manager;
|
|
25
26
|
#config;
|
|
@@ -41,17 +42,18 @@ class Navigator extends EventEmitter {
|
|
|
41
42
|
return;
|
|
42
43
|
this.#stopped = false;
|
|
43
44
|
this.#stopping = false;
|
|
45
|
+
this.#pollTimer = new ClaimTimer(this.#config.clock, this.#config.flowIntervalSeconds, () => this.#onPoll());
|
|
44
46
|
setImmediate(() => this.#onPoll());
|
|
45
|
-
this.#
|
|
47
|
+
this.#pollTimer.start();
|
|
46
48
|
}
|
|
47
49
|
async stop() {
|
|
48
50
|
if (this.#stopped)
|
|
49
51
|
return;
|
|
50
52
|
this.#stopping = true;
|
|
51
53
|
this.#stopped = true;
|
|
52
|
-
if (this.#
|
|
53
|
-
this.#
|
|
54
|
-
this.#
|
|
54
|
+
if (this.#pollTimer) {
|
|
55
|
+
this.#pollTimer.stop();
|
|
56
|
+
this.#pollTimer = undefined;
|
|
55
57
|
}
|
|
56
58
|
while (this.#working) {
|
|
57
59
|
await delay(10);
|
|
@@ -70,6 +72,9 @@ class Navigator extends EventEmitter {
|
|
|
70
72
|
}
|
|
71
73
|
const gate = plans.trySetFlowTime(this.#config.schema, this.#config.flowIntervalSeconds);
|
|
72
74
|
const { rows } = await this.#db.executeSql(gate);
|
|
75
|
+
// The row is stamped; the next attempt is measured from here rather than from the tick that
|
|
76
|
+
// started this one. See ClaimTimer.
|
|
77
|
+
this.#pollTimer?.anchor();
|
|
73
78
|
if (rows.length === 1) {
|
|
74
79
|
await this.#resolve();
|
|
75
80
|
}
|
package/dist/plans.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"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"}
|
package/dist/plans.js
CHANGED
|
@@ -919,7 +919,7 @@ export function trySetQueueMonitorTime(schema, queues, seconds) {
|
|
|
919
919
|
UPDATE ${schema}.queue
|
|
920
920
|
SET monitor_claim_on = ${schema}.job_now()
|
|
921
921
|
WHERE name = ANY($1::text[])
|
|
922
|
-
AND EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(monitor_claim_on, monitor_on, ${schema}.job_now() - interval '1 week') ) )
|
|
922
|
+
AND EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(monitor_claim_on, monitor_on, ${schema}.job_now() - interval '1 week') ) ) >= ${seconds}
|
|
923
923
|
RETURNING name, NOT EXISTS (SELECT 1 FROM ${schema}.version WHERE monitor_backoff_on > ${schema}.job_now()) as "refreshStats"
|
|
924
924
|
`,
|
|
925
925
|
values: [queues]
|
|
@@ -1024,11 +1024,25 @@ export function trySetFlowTime(schema, seconds) {
|
|
|
1024
1024
|
export function trySetReindexTime(schema, seconds) {
|
|
1025
1025
|
return trySetTimestamp(schema, 'reindex_on', seconds);
|
|
1026
1026
|
}
|
|
1027
|
+
// The claim that decides which instance in a deployment runs an interval pass: whoever moves the
|
|
1028
|
+
// timestamp owns the interval, and everyone else's UPDATE matches nothing. The COALESCE lets the
|
|
1029
|
+
// first claim through while the column is still null.
|
|
1030
|
+
//
|
|
1031
|
+
// The comparison includes the interval itself. On a real clock that is one instant out of a
|
|
1032
|
+
// microsecond-resolution range and changes nothing, but a fake clock has no jitter to hide behind:
|
|
1033
|
+
// TestClock fires each timer exactly one period after the last and moves job_now() with it, so the
|
|
1034
|
+
// elapsed time here is exactly `seconds` on every tick - the one value a strict `>` refuses every
|
|
1035
|
+
// time, which ran a pass on every other tick. Nothing is accepted early either way, so the looser
|
|
1036
|
+
// comparison costs nothing on a real clock.
|
|
1037
|
+
//
|
|
1038
|
+
// It is not what keeps a real deployment's passes on schedule. That is the timer: see ClaimTimer,
|
|
1039
|
+
// which anchors the next attempt to the moment this statement stamps the row rather than to a grid
|
|
1040
|
+
// fixed before it ran.
|
|
1027
1041
|
function trySetTimestamp(schema, column, seconds) {
|
|
1028
1042
|
return `
|
|
1029
1043
|
UPDATE ${schema}.version
|
|
1030
1044
|
SET ${column} = ${schema}.job_now()
|
|
1031
|
-
WHERE EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(${column}, ${schema}.job_now() - interval '1 week') ) )
|
|
1045
|
+
WHERE EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(${column}, ${schema}.job_now() - interval '1 week') ) ) >= ${seconds}
|
|
1032
1046
|
RETURNING true
|
|
1033
1047
|
`;
|
|
1034
1048
|
}
|
|
@@ -1038,7 +1052,7 @@ function trySetQueueTimestamp(schema, queues, column, seconds) {
|
|
|
1038
1052
|
UPDATE ${schema}.queue
|
|
1039
1053
|
SET ${column} = ${schema}.job_now()
|
|
1040
1054
|
WHERE name = ANY($1::text[])
|
|
1041
|
-
AND EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(${column}, ${schema}.job_now() - interval '1 week') ) )
|
|
1055
|
+
AND EXTRACT( EPOCH FROM (${schema}.job_now() - COALESCE(${column}, ${schema}.job_now() - interval '1 week') ) ) >= ${seconds}
|
|
1042
1056
|
RETURNING name
|
|
1043
1057
|
`,
|
|
1044
1058
|
values: [queues]
|
package/dist/timekeeper.d.ts
CHANGED
|
@@ -11,8 +11,8 @@ declare class Timekeeper extends EventEmitter implements types.EventsMixin {
|
|
|
11
11
|
config: types.ResolvedConstructorOptions;
|
|
12
12
|
manager: Manager;
|
|
13
13
|
private stopped;
|
|
14
|
-
private
|
|
15
|
-
private
|
|
14
|
+
private cronMonitorTimer;
|
|
15
|
+
private skewMonitorTimer;
|
|
16
16
|
private timekeeping;
|
|
17
17
|
private _checkingSkew;
|
|
18
18
|
private warnedSchedules;
|
|
@@ -28,6 +28,7 @@ declare class Timekeeper extends EventEmitter implements types.EventsMixin {
|
|
|
28
28
|
private get warningContext();
|
|
29
29
|
start(): Promise<void>;
|
|
30
30
|
stop(): Promise<void>;
|
|
31
|
+
private scheduleSkewMonitor;
|
|
31
32
|
cacheClockSkew(): Promise<void>;
|
|
32
33
|
onCron(): Promise<void>;
|
|
33
34
|
/**
|
|
@@ -61,10 +62,15 @@ declare class Timekeeper extends EventEmitter implements types.EventsMixin {
|
|
|
61
62
|
*
|
|
62
63
|
* The gap is (lastPass, windowStart]: older than the due window, so no pass has sent it, and
|
|
63
64
|
* newer than the moment an instance last ran a pass, so no pass has skipped it either. A pass
|
|
64
|
-
* claims
|
|
65
|
-
* configurable ceiling, against a 60-second window, so
|
|
66
|
-
* running and fills up when they stop: a deployment that is
|
|
67
|
-
* with scheduling switched off.
|
|
65
|
+
* claims `cronMonitorIntervalSeconds` after the one before it plus the round trip the claim
|
|
66
|
+
* itself cost, 45 seconds and change at the configurable ceiling, against a 60-second window, so
|
|
67
|
+
* the range is empty while passes keep running and fills up when they stop: a deployment that is
|
|
68
|
+
* down, between deploys, or running with scheduling switched off.
|
|
69
|
+
*
|
|
70
|
+
* That the spacing is an interval and not two of them is the claim timer's doing: it schedules
|
|
71
|
+
* each attempt from the moment the previous claim stamped the row rather than on a grid, so a
|
|
72
|
+
* statement that lands quickly cannot measure the row short of the interval and lose the claim
|
|
73
|
+
* for a whole one. See ClaimTimer.
|
|
68
74
|
*
|
|
69
75
|
* The most recent occurrence rather than all of them, which is the whole of what `once` promises:
|
|
70
76
|
* a job carries the schedule's `data` and nothing else, so a job per missed occurrence would be
|
package/dist/timekeeper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timekeeper.d.ts","sourceRoot":"","sources":["../src/timekeeper.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"timekeeper.d.ts","sourceRoot":"","sources":["../src/timekeeper.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,aAAa,CAAA;AAItC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAKvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAGnC,eAAO,MAAM,MAAM;;CAElB,CAAA;AAwBD,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,OAAO,CAAA;AA8JrC,cAAM,UAAW,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;IAChE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAA;IACnB,MAAM,EAAE,KAAK,CAAC,0BAA0B,CAAA;IACxC,OAAO,EAAE,OAAO,CAAA;IAEhB,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAQ;IAS7B,OAAO,CAAC,eAAe,CAAoB;IAE3C,SAAS,SAAI;IACb,MAAM;;;;MAAS;gBAEF,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAQ5F,IAAI,YAAY,IAAK,OAAO,CAE3B;IAMD,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,cAAc,GASzB;IAEK,KAAK;IA4BL,IAAI;IAmCV,OAAO,CAAC,mBAAmB;IAUrB,cAAc;IA8Cd,MAAM;IAkCZ;;;;;OAKG;IACG,IAAI,CAAE,WAAW,GAAE,OAAc;IA0IvC,YAAY,CAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,KAAK,CAAC,YAAwC;IAIlG;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,iBAAiB;YAQX,QAAQ;YAsDR,aAAa;IAerB,YAAY,CAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAiBrE,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IAe1E;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,sBAA2B,GAAG,IAAI,EAAE;IA0C5E,QAAQ,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,KAAK,CAAC,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CzG,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD;AAED,eAAe,UAAU,CAAA"}
|
package/dist/timekeeper.js
CHANGED
|
@@ -2,6 +2,7 @@ import { CronExpressionParser } from 'cron-parser';
|
|
|
2
2
|
import assert from 'node:assert';
|
|
3
3
|
import EventEmitter from 'node:events';
|
|
4
4
|
import * as Attorney from "./attorney.js";
|
|
5
|
+
import { ClaimTimer } from "./claimTimer.js";
|
|
5
6
|
import * as plans from "./plans.js";
|
|
6
7
|
import { isRrule, latestOccurrenceBefore, occurrencesInWindow, rruleWalker, assertRrule, assertRruleSends } from "./rrule.js";
|
|
7
8
|
import { assertTimezone } from "./timezone.js";
|
|
@@ -152,8 +153,8 @@ class Timekeeper extends EventEmitter {
|
|
|
152
153
|
config;
|
|
153
154
|
manager;
|
|
154
155
|
stopped = true;
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
cronMonitorTimer;
|
|
157
|
+
skewMonitorTimer;
|
|
157
158
|
timekeeping;
|
|
158
159
|
_checkingSkew = false;
|
|
159
160
|
// Rows already warned about, keyed on (name, key, cron, timezone). Unlike every other warning
|
|
@@ -193,6 +194,12 @@ class Timekeeper extends EventEmitter {
|
|
|
193
194
|
};
|
|
194
195
|
}
|
|
195
196
|
async start() {
|
|
197
|
+
// As bam and the navigator do. Without it a second start takes a second reading and arms a
|
|
198
|
+
// second cron timer and a second skew chain over the fields holding the first, which stop()
|
|
199
|
+
// then cannot reach: the orphans keep polling until the process ends. The flag is set before
|
|
200
|
+
// the first await below, so two concurrent calls cannot both get through.
|
|
201
|
+
if (!this.stopped)
|
|
202
|
+
return;
|
|
196
203
|
this.stopped = false;
|
|
197
204
|
// A restart should re-surface a row nobody has fixed yet
|
|
198
205
|
this.warnedSchedules.clear();
|
|
@@ -204,8 +211,9 @@ class Timekeeper extends EventEmitter {
|
|
|
204
211
|
};
|
|
205
212
|
await this.manager.work(QUEUES.SEND_IT, options, (jobs) => this.onSendIt(jobs));
|
|
206
213
|
setImmediate(() => this.onCron());
|
|
207
|
-
this.
|
|
208
|
-
this.
|
|
214
|
+
this.cronMonitorTimer = new ClaimTimer(this.config.clock, this.config.cronMonitorIntervalSeconds, () => this.onCron());
|
|
215
|
+
this.cronMonitorTimer.start();
|
|
216
|
+
this.scheduleSkewMonitor();
|
|
209
217
|
}
|
|
210
218
|
async stop() {
|
|
211
219
|
if (this.stopped) {
|
|
@@ -213,19 +221,46 @@ class Timekeeper extends EventEmitter {
|
|
|
213
221
|
}
|
|
214
222
|
this.stopped = true;
|
|
215
223
|
await this.manager.offWork(QUEUES.SEND_IT, { wait: true });
|
|
216
|
-
if (this.
|
|
217
|
-
this.config.clock.
|
|
218
|
-
this.
|
|
224
|
+
if (this.skewMonitorTimer) {
|
|
225
|
+
this.config.clock.clearTimeout(this.skewMonitorTimer);
|
|
226
|
+
this.skewMonitorTimer = null;
|
|
219
227
|
}
|
|
220
|
-
if (this.
|
|
221
|
-
this.
|
|
222
|
-
this.
|
|
228
|
+
if (this.cronMonitorTimer) {
|
|
229
|
+
this.cronMonitorTimer.stop();
|
|
230
|
+
this.cronMonitorTimer = null;
|
|
223
231
|
}
|
|
224
232
|
while (this.timekeeping || this._checkingSkew) {
|
|
225
233
|
await delay(10);
|
|
226
234
|
}
|
|
227
235
|
}
|
|
236
|
+
// The next check is scheduled when the last one has finished, rather than repeating on a fixed
|
|
237
|
+
// period. This is a round trip to the database on a timer nobody is waiting for, so the polite
|
|
238
|
+
// shape is a full interval of quiet between two of them: on an interval, a check that runs long -
|
|
239
|
+
// a stalled connection, a server under load, the conditions that make a skew reading worth having
|
|
240
|
+
// in the first place - has the next one fire on top of it and every one after that queue up
|
|
241
|
+
// behind, which is load arriving exactly when there is least room for it. Chained, a slow check
|
|
242
|
+
// costs its own duration and nothing else.
|
|
243
|
+
//
|
|
244
|
+
// Unlike the interval claims this is not about when the check lands. Nothing is measured against
|
|
245
|
+
// the period, the reading is local to this instance, and a check a few milliseconds either side
|
|
246
|
+
// of ten minutes is the same reading. See ClaimTimer for the timers where the landing matters.
|
|
247
|
+
scheduleSkewMonitor() {
|
|
248
|
+
this.skewMonitorTimer = this.config.clock.setTimeout(async () => {
|
|
249
|
+
try {
|
|
250
|
+
await this.cacheClockSkew();
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
if (!this.stopped)
|
|
254
|
+
this.scheduleSkewMonitor();
|
|
255
|
+
}
|
|
256
|
+
}, this.config.clockMonitorIntervalSeconds * 1000);
|
|
257
|
+
}
|
|
228
258
|
async cacheClockSkew() {
|
|
259
|
+
// One at a time. The timer above cannot overlap two of these now that it chains, but this is a
|
|
260
|
+
// public method as well, and stop() waits on the flag below: with two in flight the first to
|
|
261
|
+
// finish would clear it and let stop() return while the second still held a connection.
|
|
262
|
+
if (this._checkingSkew)
|
|
263
|
+
return;
|
|
229
264
|
let skew = 0;
|
|
230
265
|
this._checkingSkew = true;
|
|
231
266
|
try {
|
|
@@ -263,6 +298,10 @@ class Timekeeper extends EventEmitter {
|
|
|
263
298
|
const sql = plans.trySetCronTime(this.config.schema, this.config.cronMonitorIntervalSeconds);
|
|
264
299
|
if (!this.stopped) {
|
|
265
300
|
const { rows } = await this.db.executeSql(sql);
|
|
301
|
+
// cron_on is stamped; the next attempt is measured from here rather than from the tick that
|
|
302
|
+
// started this one, which is what keeps two passes an interval apart instead of letting one
|
|
303
|
+
// land a few milliseconds short and lose the claim for a whole interval. See ClaimTimer.
|
|
304
|
+
this.cronMonitorTimer?.anchor();
|
|
266
305
|
if (!this.stopped && rows.length === 1) {
|
|
267
306
|
// The claim answers with the timestamp it replaced, which is when an instance last ran a
|
|
268
307
|
// pass. Anything older than the due window between then and now is a gap no pass covered,
|
|
@@ -438,10 +477,15 @@ class Timekeeper extends EventEmitter {
|
|
|
438
477
|
*
|
|
439
478
|
* The gap is (lastPass, windowStart]: older than the due window, so no pass has sent it, and
|
|
440
479
|
* newer than the moment an instance last ran a pass, so no pass has skipped it either. A pass
|
|
441
|
-
* claims
|
|
442
|
-
* configurable ceiling, against a 60-second window, so
|
|
443
|
-
* running and fills up when they stop: a deployment that is
|
|
444
|
-
* with scheduling switched off.
|
|
480
|
+
* claims `cronMonitorIntervalSeconds` after the one before it plus the round trip the claim
|
|
481
|
+
* itself cost, 45 seconds and change at the configurable ceiling, against a 60-second window, so
|
|
482
|
+
* the range is empty while passes keep running and fills up when they stop: a deployment that is
|
|
483
|
+
* down, between deploys, or running with scheduling switched off.
|
|
484
|
+
*
|
|
485
|
+
* That the spacing is an interval and not two of them is the claim timer's doing: it schedules
|
|
486
|
+
* each attempt from the moment the previous claim stamped the row rather than on a grid, so a
|
|
487
|
+
* statement that lands quickly cannot measure the row short of the interval and lose the claim
|
|
488
|
+
* for a whole one. See ClaimTimer.
|
|
445
489
|
*
|
|
446
490
|
* The most recent occurrence rather than all of them, which is the whole of what `once` promises:
|
|
447
491
|
* a job carries the schedule's `data` and nothing else, so a job per missed occurrence would be
|