@adonis-agora/durable 0.54.0 → 0.54.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/CHANGELOG.md +13 -0
- package/dist/src/buffered-child-signals.d.ts +20 -4
- package/dist/src/buffered-child-signals.d.ts.map +1 -1
- package/dist/src/buffered-child-signals.js +207 -63
- package/dist/src/buffered-child-signals.js.map +1 -1
- package/dist/src/commands/worker.d.ts +2 -1
- package/dist/src/commands/worker.d.ts.map +1 -1
- package/dist/src/commands/worker.js +44 -3
- package/dist/src/commands/worker.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +1 -1
- package/dist/src/dashboard/index.js +1 -1
- package/dist/src/engine.d.ts +12 -7
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +27 -8
- package/dist/src/engine.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/testing-kit/state-store-conformance.d.ts +6 -0
- package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.js +41 -0
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @adonis-agora/durable
|
|
2
2
|
|
|
3
|
+
## 0.54.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#405](https://github.com/DavideCarvalho/adonis-agora-durable/pull/405) [`d09f5fd`](https://github.com/DavideCarvalho/adonis-agora-durable/commit/d09f5fd4a5afbcd76673a1c6e0f8ac8a41d9f897) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - The buffered-signal sweep no longer costs one checkpoint read per buffered row, and no longer holds up the worker tick.
|
|
8
|
+
|
|
9
|
+
- Each page is decided set-based: one `getRuns` for every parent in it (a gone or finished parent's rows go without a checkpoint read), then one `getCheckpoints` by primary key per live parent, at the seqs the child ids name (`<p>.all.<first>.<i>` at `first + i`, its fold at `first`; wave `k` of a fan in waves folds at `first + k * W`; `<p>.child.<n>` at `n`). A read by name is left only for ids that name no seq, once per parent per page.
|
|
10
|
+
- A sweep call stops after 250 ms of wall-clock time and the next resumes where it stopped. It never runs concurrently with itself.
|
|
11
|
+
- The worker loop (`node ace durable:work` and the embedded worker) starts the sweep beside the tick instead of awaiting it inside, so a slow sweep does not delay the schedules, retention and stalled phases or the next `runPending`. Shutdown waits for a sweep in flight within the drain budget. A failure of the sweep is reported by the next tick.
|
|
12
|
+
- The write-path check of whether a child's completion needs buffering is `getRun` plus one keyed `getCheckpoints`.
|
|
13
|
+
|
|
14
|
+
On MySQL with a 40k-child parent and ~42k buffered rows, one sweep tick went from 2,012 statements to 15–20.
|
|
15
|
+
|
|
3
16
|
## 0.54.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -18,13 +18,29 @@ export declare function canonicalJson(value: unknown): string;
|
|
|
18
18
|
* parent can still be retried, and its retry consumes the buffer);
|
|
19
19
|
* - the parent already holds this outcome: a duplicate or late notification.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* It runs on every such completion of a wide fan, so it reads the parent's run row and its
|
|
22
|
+
* checkpoints by key, never by name (except for an id that names no seq). A `parent` already read by
|
|
23
|
+
* the caller can be passed to skip the run read (`null` = known missing). A completion JSON cannot
|
|
24
|
+
* hold (a BigInt, a cycle) cannot be compared, and is kept for the parent.
|
|
22
25
|
*/
|
|
23
26
|
export declare function childCompletionNeedsBuffer(store: StateStore, childId: string, completion: unknown, parent?: WorkflowRun | null): Promise<boolean>;
|
|
27
|
+
/** What {@link unneededChildSignals} decided about a page of buffered signals. */
|
|
28
|
+
export interface BufferedSignalVerdict {
|
|
29
|
+
/** The rows no parent will consume. */
|
|
30
|
+
doomed: BufferedSignalRow[];
|
|
31
|
+
/**
|
|
32
|
+
* How many leading rows of the page are decided. Less than the page when the deadline passed
|
|
33
|
+
* first; the rest are left for the next call.
|
|
34
|
+
*/
|
|
35
|
+
decided: number;
|
|
36
|
+
}
|
|
24
37
|
/**
|
|
25
38
|
* The `child:` buffered signals in `rows` no parent will ever consume (see
|
|
26
|
-
* {@link childCompletionNeedsBuffer})
|
|
27
|
-
*
|
|
39
|
+
* {@link childCompletionNeedsBuffer}), set-based: one read of every parent's run row, then for each
|
|
40
|
+
* parent still open, one keyed read of its checkpoints covering all of its rows in the page. A row
|
|
41
|
+
* whose parent or checkpoints could not be read is kept for the next pass. Once `deadline` (epoch
|
|
42
|
+
* ms) passes, no further parent's checkpoints are read; the first always are, so every call makes
|
|
43
|
+
* progress.
|
|
28
44
|
*/
|
|
29
|
-
export declare function unneededChildSignals(store: StateStore, rows: readonly BufferedSignalRow[]): Promise<
|
|
45
|
+
export declare function unneededChildSignals(store: StateStore, rows: readonly BufferedSignalRow[], deadline?: number): Promise<BufferedSignalVerdict>;
|
|
30
46
|
//# sourceMappingURL=buffered-child-signals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffered-child-signals.d.ts","sourceRoot":"","sources":["../../src/buffered-child-signals.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAGf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAGzB,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"buffered-child-signals.d.ts","sourceRoot":"","sources":["../../src/buffered-child-signals.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAGf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAGzB,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAO3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AAkOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAOlB;AAqBD,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,iBAAiB,EAAE,EAClC,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CAsDhC"}
|
|
@@ -6,8 +6,6 @@ export const CHILD_TOKEN_PREFIX = 'child:';
|
|
|
6
6
|
const CHILD_SIGNAL_NAME_PREFIX = 'signal:child:';
|
|
7
7
|
/** Terminal statuses a run can still leave (a retry), consuming its buffered completions. */
|
|
8
8
|
const RETRYABLE = new Set(['failed', 'dead']);
|
|
9
|
-
/** A `ctx.all` child id: the fan's base (`<parent>.all.<seq>.` or `….w<k>.`) and its index. */
|
|
10
|
-
const FAN_CHILD = /^(.+\.all\.\d+\.(?:w\d+\.)?)(\d+)$/;
|
|
11
9
|
/**
|
|
12
10
|
* JSON with object keys sorted, so two completions compare equal whatever order their keys came
|
|
13
11
|
* back in: MySQL's JSON type and Postgres `jsonb` do not keep insertion order. Through JSON first,
|
|
@@ -26,43 +24,165 @@ function sortedJson(value) {
|
|
|
26
24
|
}
|
|
27
25
|
return JSON.stringify(value);
|
|
28
26
|
}
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
const FAN_CHILD_PARTS = /^(.+\.all\.(\d+)\.)(?:w(\d+)\.)?(\d+)$/;
|
|
28
|
+
const SEQ_CHILD = /\.child\.(\d+)$/;
|
|
29
|
+
function slotOf(childId) {
|
|
31
30
|
const signal = `${CHILD_SIGNAL_NAME_PREFIX}${childId}`;
|
|
32
|
-
const fan =
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
const fan = FAN_CHILD_PARTS.exec(childId);
|
|
32
|
+
if (fan) {
|
|
33
|
+
const root = fan[1];
|
|
34
|
+
const wave = fan[3];
|
|
35
|
+
const firstSeq = Number(fan[2]);
|
|
36
|
+
const index = Number(fan[4]);
|
|
37
|
+
if (wave === undefined) {
|
|
38
|
+
return {
|
|
39
|
+
signal,
|
|
40
|
+
signalSeq: firstSeq + index,
|
|
41
|
+
fan: { fold: `${FOLDED_PREFIX}${root}`, firstSeq, index },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
signal,
|
|
46
|
+
signalSeq: firstSeq + index,
|
|
47
|
+
fan: {
|
|
48
|
+
fold: `${FOLDED_PREFIX}${root}w${wave}.`,
|
|
49
|
+
firstSeq,
|
|
50
|
+
index,
|
|
51
|
+
wave: Number(wave),
|
|
52
|
+
waveZeroFold: `${FOLDED_PREFIX}${root}w0.`,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const seq = SEQ_CHILD.exec(childId);
|
|
57
|
+
return seq ? { signal, signalSeq: Number(seq[1]) } : { signal };
|
|
58
|
+
}
|
|
59
|
+
/** A fold checkpoint's children, when `cp` is the completed fold `name`. */
|
|
60
|
+
function foldOf(cp, name) {
|
|
61
|
+
if (cp?.status !== 'completed' || cp.name !== name)
|
|
62
|
+
return undefined;
|
|
63
|
+
const { from, values } = (cp.output ?? {});
|
|
64
|
+
return typeof from === 'number' && Array.isArray(values) ? { from, values } : undefined;
|
|
65
|
+
}
|
|
66
|
+
function covers(fold, index) {
|
|
67
|
+
return !!fold && index >= fold.from && index < fold.from + fold.values.length;
|
|
68
|
+
}
|
|
69
|
+
/** Whether `cp` is the completed signal checkpoint `signal` holding the same completion. */
|
|
70
|
+
function holdsSignal(cp, signal, expected) {
|
|
71
|
+
return (expected !== undefined &&
|
|
72
|
+
cp.status === 'completed' &&
|
|
73
|
+
cp.name === signal &&
|
|
74
|
+
canonicalJson(cp.output) === expected);
|
|
75
|
+
}
|
|
76
|
+
/** The completion as {@link canonicalJson}, or undefined for one JSON cannot hold (a BigInt, a cycle). */
|
|
77
|
+
function comparable(completion) {
|
|
78
|
+
try {
|
|
79
|
+
return canonicalJson(completion);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** The parent's checkpoints at `seqs`, by seq: one keyed read. */
|
|
86
|
+
async function checkpointsAt(store, runId, seqs) {
|
|
87
|
+
const unique = [...new Set(seqs)];
|
|
88
|
+
const bySeq = new Map();
|
|
89
|
+
if (unique.length === 0)
|
|
90
|
+
return bySeq;
|
|
91
|
+
const rows = store.getCheckpoints
|
|
92
|
+
? await store.getCheckpoints(runId, unique)
|
|
93
|
+
: (await Promise.all(unique.map((seq) => store.getCheckpoint(runId, seq)))).filter((cp) => cp !== null);
|
|
94
|
+
for (const cp of rows)
|
|
95
|
+
bySeq.set(cp.seq, cp);
|
|
96
|
+
return bySeq;
|
|
97
|
+
}
|
|
98
|
+
/** The parent's checkpoints named exactly one of `names`: the read by name, for ids with no seq. */
|
|
99
|
+
async function checkpointsNamed(store, runId, names) {
|
|
100
|
+
const wanted = new Set(names);
|
|
101
|
+
const rows = store.listCheckpointsByNamePrefix
|
|
102
|
+
? await store.listCheckpointsByNamePrefix(runId, [...wanted])
|
|
103
|
+
: await store.listCheckpoints(runId);
|
|
104
|
+
return rows.filter((cp) => wanted.has(cp.name));
|
|
36
105
|
}
|
|
37
106
|
/**
|
|
38
|
-
*
|
|
39
|
-
* checkpoint holding the same completion, or a
|
|
40
|
-
* folds only once every child in it settled).
|
|
107
|
+
* Which of `children` (with the completion each would deliver) `parentId` already settles: a
|
|
108
|
+
* completed `signal:child:<id>` checkpoint holding the same completion, or a fold covering the child
|
|
109
|
+
* (a fan folds only once every child in it settled). A few store calls whatever the number of
|
|
110
|
+
* children: one keyed read for the seqs their ids name, one more for the folds of later waves of a
|
|
111
|
+
* fan in waves, and a read by name only for the children whose seq says nothing (an onError
|
|
112
|
+
* handler, a `ctx.startChild` child, a fan in waves whose wave 0 did not fold).
|
|
41
113
|
*/
|
|
42
|
-
function
|
|
43
|
-
const {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
114
|
+
async function parentSettles(store, parentId, children) {
|
|
115
|
+
const entries = children.map(({ childId, completion }) => ({
|
|
116
|
+
slot: slotOf(childId),
|
|
117
|
+
expected: comparable(completion),
|
|
118
|
+
}));
|
|
119
|
+
const held = entries.map(() => undefined);
|
|
120
|
+
const first = await checkpointsAt(store, parentId, entries.flatMap(({ slot }) => [
|
|
121
|
+
...(slot.signalSeq === undefined ? [] : [slot.signalSeq]),
|
|
122
|
+
...(slot.fan ? [slot.fan.firstSeq] : []),
|
|
123
|
+
]));
|
|
124
|
+
const waveFolds = [];
|
|
125
|
+
const byName = [];
|
|
126
|
+
entries.forEach(({ slot, expected }, at) => {
|
|
127
|
+
const own = slot.signalSeq === undefined ? undefined : first.get(slot.signalSeq);
|
|
128
|
+
if (own?.name === slot.signal) {
|
|
129
|
+
held[at] = holdsSignal(own, slot.signal, expected);
|
|
130
|
+
return;
|
|
56
131
|
}
|
|
57
|
-
|
|
132
|
+
const fan = slot.fan;
|
|
133
|
+
if (fan) {
|
|
134
|
+
// A fold sits at its first child's seq, so it can also be the one at the child's own seq.
|
|
135
|
+
if (covers(foldOf(own, fan.fold), fan.index)) {
|
|
136
|
+
held[at] = true;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const atFirst = first.get(fan.firstSeq);
|
|
140
|
+
if (fan.wave === undefined || fan.wave === 0) {
|
|
141
|
+
held[at] = covers(foldOf(atFirst, fan.fold), fan.index);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const waveZero = foldOf(atFirst, fan.waveZeroFold);
|
|
145
|
+
if (waveZero && waveZero.values.length > 0) {
|
|
146
|
+
waveFolds.push({ at, seq: fan.firstSeq + fan.wave * waveZero.values.length });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
byName.push(at);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// A `.child.<n>` id with nothing at `n` has not been settled; a different name at `n` (the
|
|
153
|
+
// `spawn:` of a `ctx.startChild`) means the signal is elsewhere.
|
|
154
|
+
if (slot.signalSeq !== undefined && !own) {
|
|
155
|
+
held[at] = false;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
byName.push(at);
|
|
58
159
|
});
|
|
160
|
+
if (waveFolds.length > 0) {
|
|
161
|
+
const second = await checkpointsAt(store, parentId, waveFolds.map((w) => w.seq));
|
|
162
|
+
for (const { at, seq } of waveFolds) {
|
|
163
|
+
const fan = entries[at]?.slot.fan;
|
|
164
|
+
held[at] = covers(foldOf(second.get(seq), fan.fold), fan.index);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (byName.length > 0) {
|
|
168
|
+
const names = byName.flatMap((at) => {
|
|
169
|
+
const { slot } = entries[at];
|
|
170
|
+
return slot.fan ? [slot.signal, slot.fan.fold] : [slot.signal];
|
|
171
|
+
});
|
|
172
|
+
const named = await checkpointsNamed(store, parentId, names);
|
|
173
|
+
for (const at of byName) {
|
|
174
|
+
const { slot, expected } = entries[at];
|
|
175
|
+
held[at] = named.some((cp) => holdsSignal(cp, slot.signal, expected) ||
|
|
176
|
+
(!!slot.fan && covers(foldOf(cp, slot.fan.fold), slot.fan.index)));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return held.map((h) => h === true);
|
|
59
180
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
: store.listCheckpoints(parentId);
|
|
181
|
+
/** Whether `run` is gone, or terminal for good: nothing it could buffer for will ever be consumed. */
|
|
182
|
+
function parentClosed(run) {
|
|
183
|
+
return (!run ||
|
|
184
|
+
(TERMINAL_RUN_STATUSES.includes(run.status) &&
|
|
185
|
+
!RETRYABLE.has(run.status)));
|
|
66
186
|
}
|
|
67
187
|
/**
|
|
68
188
|
* Whether a child's completion that found no waiter must be buffered for its parent to consume
|
|
@@ -75,27 +195,20 @@ async function parentCheckpoints(store, parentId, childId) {
|
|
|
75
195
|
* parent can still be retried, and its retry consumes the buffer);
|
|
76
196
|
* - the parent already holds this outcome: a duplicate or late notification.
|
|
77
197
|
*
|
|
78
|
-
*
|
|
198
|
+
* It runs on every such completion of a wide fan, so it reads the parent's run row and its
|
|
199
|
+
* checkpoints by key, never by name (except for an id that names no seq). A `parent` already read by
|
|
200
|
+
* the caller can be passed to skip the run read (`null` = known missing). A completion JSON cannot
|
|
201
|
+
* hold (a BigInt, a cycle) cannot be compared, and is kept for the parent.
|
|
79
202
|
*/
|
|
80
203
|
export async function childCompletionNeedsBuffer(store, childId, completion, parent) {
|
|
81
204
|
const parentId = parentRunIdOf(childId);
|
|
82
205
|
if (!parentId)
|
|
83
206
|
return false;
|
|
84
207
|
const run = parent === undefined ? await store.getRun(parentId) : parent;
|
|
85
|
-
if (
|
|
86
|
-
return false;
|
|
87
|
-
if (TERMINAL_RUN_STATUSES.includes(run.status) &&
|
|
88
|
-
!RETRYABLE.has(run.status)) {
|
|
208
|
+
if (parentClosed(run))
|
|
89
209
|
return false;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
|
-
return !parentHoldsChild(checkpoints, childId, completion);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// A completion JSON cannot hold (a BigInt, a cycle) cannot be compared: keep it for the parent.
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
210
|
+
const [held] = await parentSettles(store, parentId, [{ childId, completion }]);
|
|
211
|
+
return !held;
|
|
99
212
|
}
|
|
100
213
|
/** Read `ids` in batches; the ids of a batch that could not be read are reported, not guessed. */
|
|
101
214
|
async function readRuns(store, ids) {
|
|
@@ -117,33 +230,64 @@ async function readRuns(store, ids) {
|
|
|
117
230
|
}
|
|
118
231
|
/**
|
|
119
232
|
* The `child:` buffered signals in `rows` no parent will ever consume (see
|
|
120
|
-
* {@link childCompletionNeedsBuffer})
|
|
121
|
-
*
|
|
233
|
+
* {@link childCompletionNeedsBuffer}), set-based: one read of every parent's run row, then for each
|
|
234
|
+
* parent still open, one keyed read of its checkpoints covering all of its rows in the page. A row
|
|
235
|
+
* whose parent or checkpoints could not be read is kept for the next pass. Once `deadline` (epoch
|
|
236
|
+
* ms) passes, no further parent's checkpoints are read; the first always are, so every call makes
|
|
237
|
+
* progress.
|
|
122
238
|
*/
|
|
123
|
-
export async function unneededChildSignals(store, rows) {
|
|
239
|
+
export async function unneededChildSignals(store, rows, deadline = Number.POSITIVE_INFINITY) {
|
|
240
|
+
const childOf = (row) => row.token.startsWith(CHILD_TOKEN_PREFIX)
|
|
241
|
+
? row.token.slice(CHILD_TOKEN_PREFIX.length)
|
|
242
|
+
: undefined;
|
|
124
243
|
const parentIds = rows.flatMap((row) => {
|
|
125
|
-
const
|
|
244
|
+
const childId = childOf(row);
|
|
245
|
+
const parentId = childId === undefined ? undefined : parentRunIdOf(childId);
|
|
126
246
|
return parentId ? [parentId] : [];
|
|
127
247
|
});
|
|
128
248
|
const { runs, unread } = await readRuns(store, parentIds);
|
|
129
|
-
const doomed =
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const childId = row
|
|
249
|
+
const doomed = new Set();
|
|
250
|
+
/** Rows to check against their parent's checkpoints, by parent, in page order. */
|
|
251
|
+
const open = new Map();
|
|
252
|
+
rows.forEach((row, at) => {
|
|
253
|
+
const childId = childOf(row);
|
|
254
|
+
if (childId === undefined)
|
|
255
|
+
return;
|
|
134
256
|
const parentId = parentRunIdOf(childId);
|
|
135
|
-
if (parentId
|
|
136
|
-
|
|
137
|
-
|
|
257
|
+
if (!parentId) {
|
|
258
|
+
doomed.add(row);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (unread.has(parentId))
|
|
262
|
+
return;
|
|
263
|
+
if (parentClosed(runs.get(parentId))) {
|
|
264
|
+
doomed.add(row);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const group = open.get(parentId) ?? [];
|
|
268
|
+
group.push({ at, row, childId });
|
|
269
|
+
open.set(parentId, group);
|
|
270
|
+
});
|
|
271
|
+
let decided = rows.length;
|
|
272
|
+
let checked = 0;
|
|
273
|
+
for (const [parentId, group] of open) {
|
|
274
|
+
if (checked > 0 && Date.now() >= deadline) {
|
|
275
|
+
decided = group[0].at;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
checked += 1;
|
|
138
279
|
try {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
280
|
+
const held = await parentSettles(store, parentId, group.map(({ row, childId }) => ({ childId, completion: row.payload })));
|
|
281
|
+
group.forEach(({ row }, k) => {
|
|
282
|
+
if (held[k])
|
|
283
|
+
doomed.add(row);
|
|
284
|
+
});
|
|
142
285
|
}
|
|
143
286
|
catch {
|
|
144
|
-
//
|
|
287
|
+
// A failed checkpoint read keeps the rows; the next pass decides.
|
|
145
288
|
}
|
|
146
289
|
}
|
|
147
|
-
|
|
290
|
+
// Rows past the cut already doomed by their parent's run row alone go now too.
|
|
291
|
+
return { doomed: rows.filter((row) => doomed.has(row)), decided };
|
|
148
292
|
}
|
|
149
293
|
//# sourceMappingURL=buffered-child-signals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffered-child-signals.js","sourceRoot":"","sources":["../../src/buffered-child-signals.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buffered-child-signals.js","sourceRoot":"","sources":["../../src/buffered-child-signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,8 @@ export interface WorkerLogger {
|
|
|
11
11
|
* timeout, and finally fire any due `schedules` (the 5th phase — see {@link TickOptions.schedules}).
|
|
12
12
|
* Returns a per-phase count of the runs each phase touched — the unit the `durable:work` command logs
|
|
13
13
|
* and the tests assert on. Each phase is awaited independently so one phase throwing does not abort the
|
|
14
|
-
* rest of the tick (the error is collected and surfaced).
|
|
14
|
+
* rest of the tick (the error is collected and surfaced). The buffered-signal sweep is started, not
|
|
15
|
+
* awaited: it runs beside the tick, one at a time, and a failure of it is reported by the next tick.
|
|
15
16
|
*/
|
|
16
17
|
export interface TickResult {
|
|
17
18
|
pending: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/commands/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAExF,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/commands/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAExF,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,oGAAoG;IACpG,OAAO,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,CAAC;CAC3C;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,gGAAgG;IAChG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,SAAS,iBAAiB,EAAE,EAC7C,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACvC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAK7B;AAID,0GAA0G;AAC1G,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAOrB;AA8GD,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,gGAAgG;IAChG,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC1C;AAQD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAqEjB"}
|
|
@@ -56,9 +56,9 @@ async function runTickInScope(engine, options) {
|
|
|
56
56
|
await engine.sweepTimeouts(now);
|
|
57
57
|
return 0;
|
|
58
58
|
});
|
|
59
|
-
// Buffered child completions nothing will consume
|
|
60
|
-
//
|
|
61
|
-
|
|
59
|
+
// Buffered child completions nothing will consume: a bounded slice per tick, self-throttled
|
|
60
|
+
// between full passes. Housekeeping, so it runs beside the tick instead of inside it.
|
|
61
|
+
startBufferedSweep(engine, now, result);
|
|
62
62
|
// 5th phase — fire any due recurring schedules (mirrors the NestJS timer poller). Skipped entirely
|
|
63
63
|
// when none are registered; idempotent by the schedule's time-bucket run id, so racing workers
|
|
64
64
|
// start each window exactly once.
|
|
@@ -84,6 +84,34 @@ async function runTickInScope(engine, options) {
|
|
|
84
84
|
await phase('sweepEntityWakes', async () => engine.sweepEntityWakes(now));
|
|
85
85
|
return result;
|
|
86
86
|
}
|
|
87
|
+
/** Per engine: the buffered-signal sweep a tick started that has not finished, and its failure. */
|
|
88
|
+
const bufferedSweeps = new WeakMap();
|
|
89
|
+
/**
|
|
90
|
+
* Start `engine.sweepBufferedSignals` unless the one a previous tick started is still running, and
|
|
91
|
+
* report into `result` the failure of one that ended since the last tick.
|
|
92
|
+
*/
|
|
93
|
+
function startBufferedSweep(engine, now, result) {
|
|
94
|
+
let state = bufferedSweeps.get(engine);
|
|
95
|
+
if (!state) {
|
|
96
|
+
state = { running: undefined, failed: undefined };
|
|
97
|
+
bufferedSweeps.set(engine, state);
|
|
98
|
+
}
|
|
99
|
+
const sweep = state;
|
|
100
|
+
if (sweep.failed) {
|
|
101
|
+
result.errors.push({ phase: 'sweepBufferedSignals', error: sweep.failed });
|
|
102
|
+
sweep.failed = undefined;
|
|
103
|
+
}
|
|
104
|
+
if (sweep.running)
|
|
105
|
+
return;
|
|
106
|
+
sweep.running = Promise.resolve()
|
|
107
|
+
.then(() => engine.sweepBufferedSignals(now))
|
|
108
|
+
.then(() => {
|
|
109
|
+
sweep.running = undefined;
|
|
110
|
+
}, (error) => {
|
|
111
|
+
sweep.running = undefined;
|
|
112
|
+
sweep.failed = toError(error);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
87
115
|
function toError(value) {
|
|
88
116
|
return value instanceof Error ? value : new Error(String(value));
|
|
89
117
|
}
|
|
@@ -140,6 +168,19 @@ export async function runWorkerLoop(engine, options) {
|
|
|
140
168
|
// Race the interval against the stop signal so shutdown is prompt, not interval-latent.
|
|
141
169
|
await Promise.race([sleep(options.intervalMs), options.stopSignal.catch(() => undefined)]);
|
|
142
170
|
}
|
|
171
|
+
// A sweep still running beside the last tick stops at its next page (the engine is draining); wait
|
|
172
|
+
// for it within the same budget, so the store is not closed under it.
|
|
173
|
+
const sweep = bufferedSweeps.get(engine);
|
|
174
|
+
if (sweep?.running && stoppedAt > 0) {
|
|
175
|
+
if ((await Promise.race([sweep.running, outOfBudget])) === 'timeout') {
|
|
176
|
+
options.logger.error(`buffered-signal sweep still running ${drainTimeoutMs}ms after the stop request; draining without waiting for it`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// No tick follows to report a failure of the last sweep.
|
|
180
|
+
if (sweep?.failed) {
|
|
181
|
+
options.logger.error(`tick phase sweepBufferedSignals failed: ${sweep.failed.message}`);
|
|
182
|
+
sweep.failed = undefined;
|
|
183
|
+
}
|
|
143
184
|
// Charge the drain for the time already spent waiting on the in-flight tick, so the stop request
|
|
144
185
|
// to the end of the drain stays within ONE `drainTimeoutMs`.
|
|
145
186
|
if (stoppedAt > 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/commands/worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,YAAY,EAA0B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/commands/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
-
export declare const VERSION = "0.54.
|
|
2
|
+
export declare const VERSION = "0.54.1";
|
|
3
3
|
export type { AccessDeniedInfo, AccessDeniedPageOptions, AccessDeniedReason, } from './access_denied_page.js';
|
|
4
4
|
export { CONSOLE as ACCESS_DENIED_CONSOLE, escapeHtml, renderAccessDeniedPage, resolveAccessDeniedPage, } from './access_denied_page.js';
|
|
5
5
|
export type { AuthMode, DashboardAuthOptions, LoginHook, LoginOutcome, ResolvedDashboardAuth, SessionHook, SessionOutcome, } from './auth.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
-
export const VERSION = '0.54.
|
|
2
|
+
export const VERSION = '0.54.1';
|
|
3
3
|
// The built-in "access denied" page (what a browser sees on a refused page navigation).
|
|
4
4
|
export { CONSOLE as ACCESS_DENIED_CONSOLE, escapeHtml, renderAccessDeniedPage, resolveAccessDeniedPage, } from './access_denied_page.js';
|
|
5
5
|
// Built-in `dashboardAuth` login screen (optional; opt-in via `config/durable_dashboard.ts`).
|
package/dist/src/engine.d.ts
CHANGED
|
@@ -951,13 +951,18 @@ export declare class WorkflowEngine {
|
|
|
951
951
|
*
|
|
952
952
|
* Walks the buffered signals by primary key, {@link BUFFERED_SWEEP_PAGE} rows at a time and at most
|
|
953
953
|
* {@link BUFFERED_SWEEP_PAGES_PER_CALL} pages per call, so a large backlog drains over a few worker
|
|
954
|
-
* ticks without a long query or a big delete.
|
|
955
|
-
*
|
|
956
|
-
*
|
|
957
|
-
*
|
|
958
|
-
*
|
|
959
|
-
|
|
960
|
-
|
|
954
|
+
* ticks without a long query or a big delete. Each page is decided set-based (see
|
|
955
|
+
* `unneededChildSignals`): a handful of store calls per page and per open parent, none of them a
|
|
956
|
+
* read by checkpoint name for an id that names its seq. A call stops once `budgetMs` of wall-clock
|
|
957
|
+
* time is spent (default {@link BUFFERED_SWEEP_BUDGET_MS}), between pages or between two parents'
|
|
958
|
+
* reads, and the next call resumes there. A pass that reaches the end rests
|
|
959
|
+
* {@link BUFFERED_SWEEP_REST_MS} before the next. The worker loop starts it every tick without
|
|
960
|
+
* waiting for it; a call made while another is running returns 0. Skipped while draining, on a
|
|
961
|
+
* namespaced engine (a buffered signal carries no namespace, and a scoped read would report another
|
|
962
|
+
* tenant's parent as gone), and on a store without `listBufferedSignals`/`deleteBufferedSignals`.
|
|
963
|
+
* Returns how many rows it deleted.
|
|
964
|
+
*/
|
|
965
|
+
sweepBufferedSignals(now?: number, budgetMs?: number): Promise<number>;
|
|
961
966
|
/**
|
|
962
967
|
* Register a pager hook for STRANDED runs — the failure `docs/reliability/failure-modes.mdx` calls
|
|
963
968
|
* "the stranded signature": an in-flight run untouched past `stalledAfterMs` that is either
|