@convex-dev/workpool 0.4.6 → 0.4.7-alpha.0

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.
Files changed (49) hide show
  1. package/dist/component/_generated/api.d.ts +2 -0
  2. package/dist/component/_generated/api.d.ts.map +1 -1
  3. package/dist/component/_generated/api.js.map +1 -1
  4. package/dist/component/complete.d.ts.map +1 -1
  5. package/dist/component/complete.js +8 -7
  6. package/dist/component/complete.js.map +1 -1
  7. package/dist/component/danger.js +7 -7
  8. package/dist/component/danger.js.map +1 -1
  9. package/dist/component/future.d.ts +11 -0
  10. package/dist/component/future.d.ts.map +1 -0
  11. package/dist/component/future.js +21 -0
  12. package/dist/component/future.js.map +1 -0
  13. package/dist/component/kick.d.ts +3 -3
  14. package/dist/component/kick.d.ts.map +1 -1
  15. package/dist/component/kick.js +14 -16
  16. package/dist/component/kick.js.map +1 -1
  17. package/dist/component/lib.d.ts.map +1 -1
  18. package/dist/component/lib.js +13 -13
  19. package/dist/component/lib.js.map +1 -1
  20. package/dist/component/loop.d.ts +44 -1
  21. package/dist/component/loop.d.ts.map +1 -1
  22. package/dist/component/loop.js +171 -217
  23. package/dist/component/loop.js.map +1 -1
  24. package/dist/component/recovery.d.ts.map +1 -1
  25. package/dist/component/recovery.js +2 -2
  26. package/dist/component/recovery.js.map +1 -1
  27. package/dist/component/schema.d.ts.map +1 -1
  28. package/dist/component/schema.js +2 -1
  29. package/dist/component/schema.js.map +1 -1
  30. package/dist/component/worker.js +1 -1
  31. package/dist/component/worker.js.map +1 -1
  32. package/package.json +8 -12
  33. package/src/component/_generated/api.ts +2 -0
  34. package/src/component/complete.test.ts +13 -13
  35. package/src/component/complete.ts +13 -7
  36. package/src/component/danger.ts +7 -7
  37. package/src/component/future.ts +38 -0
  38. package/src/component/kick.test.ts +17 -20
  39. package/src/component/kick.ts +20 -17
  40. package/src/component/lib.test.ts +7 -7
  41. package/src/component/lib.ts +12 -15
  42. package/src/component/loop.test.ts +695 -1127
  43. package/src/component/loop.ts +212 -283
  44. package/src/component/recovery.test.ts +3 -3
  45. package/src/component/recovery.ts +5 -2
  46. package/src/component/schema.ts +2 -1
  47. package/src/component/stateMachine.test.ts +1246 -0
  48. package/src/component/stats.test.ts +4 -4
  49. package/src/component/worker.ts +1 -1
@@ -1,8 +1,9 @@
1
1
  import { v } from "convex/values";
2
+ import { runSnapshotQuery } from "./future.js";
2
3
  import { internal } from "./_generated/api.js";
3
- import { internalMutation } from "./_generated/server.js";
4
+ import { internalMutation, internalQuery, } from "./_generated/server.js";
4
5
  import { createLogger, DEFAULT_LOG_LEVEL, } from "./logging.js";
5
- import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, getNextSegment, max, toSegment, } from "./shared.js";
6
+ import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, max, min, toSegment, } from "./shared.js";
6
7
  import { generateReport, recordCompleted, recordStarted } from "./stats.js";
7
8
  const CANCELLATION_BATCH_SIZE = 64; // the only queue that can get unbounded.
8
9
  const RECOVERY_BATCH_SIZE = 32;
@@ -13,7 +14,10 @@ const RECOVERY_THRESHOLD_MS = 5 * MINUTE; // attempt to recover jobs this old.
13
14
  export const RECOVERY_PERIOD_SEGMENTS = toSegment(1 * MINUTE); // how often to check.
14
15
  export const STATUS_COOLDOWN = 2 * SECOND;
15
16
  export const COOLDOWN_CHECK_INTERVAL = 200 * MS;
16
- const CURSOR_BUFFER_SEGMENTS = toSegment(30 * SECOND); // buffer for cursor updates.
17
+ // Buffer applied when querying with cursors. Transactions that started
18
+ // before ours may still be running and commit inserts at segments behind
19
+ // a previously advanced cursor — the buffer lets us pick those up.
20
+ const CURSOR_BUFFER_SEGMENTS = toSegment(30 * SECOND);
17
21
  export const INITIAL_STATE = {
18
22
  generation: 0n,
19
23
  segmentCursors: { incoming: 0n, completion: 0n, cancelation: 0n },
@@ -28,10 +32,50 @@ export const INITIAL_STATE = {
28
32
  },
29
33
  running: [],
30
34
  };
35
+ /**
36
+ * Single query that returns everything the main loop needs to process.
37
+ */
38
+ export const getPending = internalQuery({
39
+ args: {
40
+ completionCursor: v.int64(),
41
+ cancelationCursor: v.int64(),
42
+ incomingCursor: v.int64(),
43
+ maxParallelism: v.number(),
44
+ runningCount: v.number(),
45
+ },
46
+ handler: async (ctx, { completionCursor, cancelationCursor, incomingCursor, maxParallelism, runningCount, }) => {
47
+ const completions = await ctx.db
48
+ .query("pendingCompletion")
49
+ .withIndex("segment", (q) => q.gte("segment", completionCursor))
50
+ .take(maxParallelism);
51
+ const cancelations = await ctx.db
52
+ .query("pendingCancelation")
53
+ .withIndex("segment", (q) => q.gte("segment", cancelationCursor))
54
+ .take(CANCELLATION_BATCH_SIZE);
55
+ // Available slots after we process this batch's completions, plus 1
56
+ // for the +1 trick (detect overflow vs. a future-scheduled retry).
57
+ const startLimit = Math.max(0, maxParallelism - runningCount + completions.length);
58
+ const excludedIds = [
59
+ ...completions.map((c) => c.workId),
60
+ ...cancelations.map((c) => c.workId),
61
+ ];
62
+ const allStarts = startLimit === 0
63
+ ? []
64
+ : await ctx.db
65
+ .query("pendingStart")
66
+ .withIndex("segment", (q) => q.gte("segment", incomingCursor))
67
+ // eslint-disable-next-line @convex-dev/no-filter-in-query
68
+ .filter((q) => q.and(...excludedIds.map((id) => q.neq(q.field("workId"), id))))
69
+ .take(startLimit + 1);
70
+ return { completions, cancelations, allStarts };
71
+ },
72
+ });
31
73
  // There should only ever be at most one of these scheduled or running.
32
74
  export const main = internalMutation({
33
- args: { generation: v.int64(), segment: v.int64() },
34
- handler: async (ctx, { generation, segment }) => {
75
+ // `segment` is kept for backwards compatibility with in-flight scheduled
76
+ // calls from before the upgrade it's no longer used internally.
77
+ args: { generation: v.int64(), segment: v.optional(v.int64()) },
78
+ handler: async (ctx, { generation }) => {
35
79
  // State will be modified and patched at the end of the function.
36
80
  const state = await getOrCreateState(ctx);
37
81
  if (generation !== state.generation) {
@@ -40,21 +84,34 @@ export const main = internalMutation({
40
84
  state.generation++;
41
85
  const runStatus = await getOrCreateRunningStatus(ctx);
42
86
  if (runStatus.state.kind !== "running") {
43
- await ctx.db.patch(runStatus._id, {
87
+ await ctx.db.patch("runStatus", runStatus._id, {
44
88
  state: { kind: "running" },
45
89
  });
46
90
  }
47
91
  const globals = await getGlobals(ctx);
48
92
  const console = createLogger(globals.logLevel);
49
- const delayMs = Date.now() - fromSegment(segment);
50
- console.debug(`[main] generation ${generation} behind: ${delayMs}ms`);
51
- // Read pendingCompletions, including retry handling.
93
+ const segment = getCurrentSegment();
94
+ // Pass maxParallelism + runningCount so the query bounds each batch to
95
+ // what we can actually consume this iteration. Apply CURSOR_BUFFER_SEGMENTS
96
+ // so we still pick up out-of-order inserts that landed behind the cursor
97
+ // since our last scan.
98
+ const queryArgs = {
99
+ completionCursor: state.segmentCursors.completion - CURSOR_BUFFER_SEGMENTS,
100
+ cancelationCursor: state.segmentCursors.cancelation - CURSOR_BUFFER_SEGMENTS,
101
+ incomingCursor: state.segmentCursors.incoming - CURSOR_BUFFER_SEGMENTS,
102
+ maxParallelism: globals.maxParallelism,
103
+ runningCount: state.running.length,
104
+ };
105
+ // Snapshot read — no read dependency, no OCC conflicts.
106
+ console.time("[main] getPending");
107
+ const { allStarts, cancelations, completions } = await runSnapshotQuery(internal.loop.getPending, queryArgs);
108
+ const toStart = allStarts.filter((s) => s.segment <= segment);
109
+ console.timeEnd("[main] getPending");
52
110
  console.time("[main] pendingCompletion");
53
- const toCancel = await handleCompletions(ctx, state, segment, console);
111
+ const toCancel = await handleCompletions(ctx, state, completions, console);
54
112
  console.timeEnd("[main] pendingCompletion");
55
- // Read pendingCancelation, deleting from pendingStart. If it's still running, queue to cancel.
56
113
  console.time("[main] pendingCancelation");
57
- await handleCancelation(ctx, state, segment, console, toCancel);
114
+ await handleCancelation(ctx, state, cancelations, console, toCancel);
58
115
  console.timeEnd("[main] pendingCancelation");
59
116
  if (state.running.length === 0) {
60
117
  // If there's nothing active, reset lastRecovery.
@@ -65,9 +122,13 @@ export const main = internalMutation({
65
122
  await handleRecovery(ctx, state, console);
66
123
  state.lastRecovery = segment;
67
124
  }
68
- // Read pendingStart up to max capacity. Update the config, and incomingSegmentCursor.
125
+ // ── Start new work ──
126
+ // Slice to actual available capacity (completions may have freed slots).
127
+ // Guard against negative numbers in case running.length > maxParallelism.
128
+ const actualCapacity = globals.maxParallelism - state.running.length;
129
+ const pending = actualCapacity > 0 ? toStart.slice(0, actualCapacity) : [];
69
130
  console.time("[main] pendingStart");
70
- await handleStart(ctx, state, segment, console, globals);
131
+ await handleStart(ctx, state, pending, console, globals);
71
132
  console.timeEnd("[main] pendingStart");
72
133
  if (Date.now() - state.report.lastReportTs >= MINUTE) {
73
134
  // If minute rollover since last report, log report.
@@ -87,197 +148,100 @@ export const main = internalMutation({
87
148
  lastReportTs,
88
149
  };
89
150
  }
90
- await ctx.db.replace(state._id, state);
91
- await ctx.scheduler.runAfter(0, internal.loop.updateRunStatus, {
92
- generation: state.generation,
93
- segment,
94
- });
95
- // TODO: if there were more cancellations, schedule main directly.
96
- },
97
- });
98
- export const updateRunStatus = internalMutation({
99
- args: { generation: v.int64(), segment: v.int64() },
100
- handler: async (ctx, { generation, segment }) => {
101
- const globals = await getGlobals(ctx);
102
- const console = createLogger(globals.logLevel);
103
- const maxParallelism = globals.maxParallelism;
104
- const state = await getOrCreateState(ctx);
105
- if (generation !== state.generation) {
106
- throw new Error(`generation mismatch: ${generation} !== ${state.generation}`);
151
+ // Advance cursors to skip tombstones on next scan. Only do this when
152
+ // we actually did work — the cursor doubles as the cooldown signal
153
+ // ("how long since we last processed something").
154
+ const didWork = completions.length > 0 || cancelations.length > 0 || pending.length > 0;
155
+ if (didWork) {
156
+ state.segmentCursors.completion = completions.at(-1)?.segment ?? segment;
157
+ state.segmentCursors.cancelation =
158
+ cancelations.at(-1)?.segment ?? segment;
159
+ if (pending.length > 0) {
160
+ state.segmentCursors.incoming = pending.at(-1).segment;
161
+ }
162
+ else if (actualCapacity > 0) {
163
+ // We have no more pending work, update to now
164
+ state.segmentCursors.incoming = segment;
165
+ }
107
166
  }
108
- console.time("[updateRunStatus] outstandingCancelations");
109
- const outstandingCancelations = await getNextUp(ctx, "pendingCancelation", {
110
- start: state.segmentCursors.cancelation,
111
- end: segment,
112
- });
113
- console.timeEnd("[updateRunStatus] outstandingCancelations");
114
- if (outstandingCancelations) {
167
+ await ctx.db.replace("internalState", state._id, state);
168
+ // ── Schedule next iteration ──
169
+ if (didWork) {
170
+ // More work might have arrived while we were processing. Check again.
115
171
  await ctx.scheduler.runAfter(0, internal.loop.main, {
116
- generation,
117
- segment,
172
+ generation: state.generation,
118
173
  });
119
174
  return;
120
175
  }
121
- // TODO: check for current segment (or from args) first, to avoid OCCs.
122
- console.time("[updateRunStatus] nextSegmentIsActionable");
123
- const nextSegment = max(segment + 1n, getCurrentSegment());
124
- const nextIsActionable = await nextSegmentIsActionable(ctx, state, maxParallelism, nextSegment);
125
- console.timeEnd("[updateRunStatus] nextSegmentIsActionable");
126
- if (nextIsActionable) {
127
- await ctx.scheduler.runAt(boundScheduledTime(fromSegment(nextSegment), console), internal.loop.main, {
128
- generation,
129
- segment: nextSegment,
130
- });
131
- return;
132
- }
133
- console.time("[updateRunStatus] oldSegmentIsActionable");
134
- const [oldIsActionable, cursors] = await oldSegmentIsActionable(ctx, state, maxParallelism);
135
- console.timeEnd("[updateRunStatus] oldSegmentIsActionable");
136
- if (oldIsActionable) {
137
- await ctx.db.patch(state._id, {
138
- segmentCursors: {
139
- ...state.segmentCursors,
140
- ...cursors,
141
- },
142
- });
176
+ // Nothing found in snapshot. Re-read with a real dependency (same args
177
+ // for cache-hit efficiency) so a concurrent insert forces an OCC retry.
178
+ console.debug("[main] no work confirming with read dependency");
179
+ const confirm = await ctx.runQuery(internal.loop.getPending, queryArgs);
180
+ const confirmStarts = confirm.allStarts;
181
+ const confirmStartsNow = confirmStarts.filter((s) => s.segment <= segment);
182
+ const confirmFuture = confirmStarts.find((s) => s.segment > segment);
183
+ if (confirm.completions.length > 0 ||
184
+ confirm.cancelations.length > 0 ||
185
+ confirmStartsNow.length > 0) {
143
186
  await ctx.scheduler.runAfter(0, internal.loop.main, {
144
- generation,
145
- segment: getCurrentSegment(),
187
+ generation: state.generation,
146
188
  });
147
189
  return;
148
190
  }
149
- // Cooldown: if any cursor was active within 5 seconds, stay running.
191
+ // Cooldown: if any cursor was active within STATUS_COOLDOWN, stay running.
150
192
  const { incoming, completion, cancelation } = state.segmentCursors;
151
193
  const latestCursor = fromSegment(max(incoming, max(completion, cancelation)));
152
194
  if (Date.now() - latestCursor < STATUS_COOLDOWN) {
153
195
  const remaining = STATUS_COOLDOWN - (Date.now() - latestCursor);
154
- console.debug(`[updateRunStatus] cooldown: ${remaining}ms remaining, checking again in ${COOLDOWN_CHECK_INTERVAL}ms`);
155
- const checkAt = Date.now() + COOLDOWN_CHECK_INTERVAL;
156
- const checkSegment = toSegment(checkAt);
157
- await ctx.scheduler.runAt(boundScheduledTime(checkAt, console), internal.loop.updateRunStatus, { generation, segment: checkSegment });
196
+ console.debug(`[main] cooldown: ${remaining}ms remaining, checking again in ${COOLDOWN_CHECK_INTERVAL}ms`);
197
+ await ctx.scheduler.runAt(Date.now() + COOLDOWN_CHECK_INTERVAL, internal.loop.main, { generation: state.generation });
158
198
  return;
159
199
  }
160
- // Find next actionable segment (min next segment).
161
- console.time("[updateRunStatus] findNextSegment");
162
- const actionableTables = ["pendingCompletion", "pendingCancelation"];
163
- if (state.running.length < maxParallelism) {
164
- actionableTables.push("pendingStart");
165
- }
166
- const docs = await Promise.all(actionableTables.map(async (tableName) => getNextUp(ctx, tableName, { start: nextSegment })));
167
- console.timeEnd("[updateRunStatus] findNextSegment");
168
- let targetSegment = docs.map((d) => d?.segment).sort()[0];
169
- const runStatus = await getOrCreateRunningStatus(ctx);
170
- const saturated = state.running.length >= maxParallelism;
171
- if (targetSegment !== undefined || state.running.length > 0) {
172
- // If there's something to do, schedule for next actionable segment.
173
- // Or the next recovery, whichever comes first.
200
+ if (state.running.length > 0 || confirmFuture) {
201
+ // Jobs are running and/or there's future-scheduled work.
202
+ // Schedule for the future start or next recovery, whichever is sooner.
174
203
  const nextRecoverySegment = state.lastRecovery + RECOVERY_PERIOD_SEGMENTS;
175
- if (!targetSegment || targetSegment > nextRecoverySegment) {
176
- targetSegment = nextRecoverySegment;
177
- }
178
- const scheduledId = await ctx.scheduler.runAt(boundScheduledTime(fromSegment(targetSegment), console), internal.loop.main, { generation, segment: targetSegment });
179
- if (targetSegment > getNextSegment()) {
180
- await ctx.db.patch(runStatus._id, {
181
- state: {
182
- kind: "scheduled",
183
- scheduledId,
184
- saturated,
185
- generation,
186
- segment: targetSegment,
187
- },
188
- });
189
- }
190
- else {
191
- console.debug(`[updateRunStatus] staying running because it's the next segment`);
192
- }
204
+ const target = confirmFuture
205
+ ? min(confirmFuture.segment, nextRecoverySegment)
206
+ : nextRecoverySegment;
207
+ const scheduledId = await ctx.scheduler.runAt(boundScheduledTime(fromSegment(target), console), internal.loop.main, { generation: state.generation });
208
+ await ctx.db.patch("runStatus", runStatus._id, {
209
+ state: {
210
+ kind: "scheduled",
211
+ scheduledId,
212
+ saturated: state.running.length >= globals.maxParallelism,
213
+ generation: state.generation,
214
+ segment: target,
215
+ },
216
+ });
193
217
  return;
194
218
  }
195
- // There seems to be nothing in the future to do, so go idle.
196
- await ctx.db.patch(runStatus._id, {
197
- state: { kind: "idle", generation },
219
+ // Nothing to do go idle.
220
+ await ctx.db.patch("runStatus", runStatus._id, {
221
+ state: { kind: "idle", generation: state.generation },
198
222
  });
199
223
  },
200
224
  });
201
- async function nextSegmentIsActionable(ctx, state, maxParallelism, end) {
202
- // First, try with our cursor range, up to end.
203
- if (await getNextUp(ctx, "pendingCancelation", {
204
- start: state.segmentCursors.cancelation,
205
- end,
206
- })) {
207
- return true;
208
- }
209
- if (await getNextUp(ctx, "pendingCompletion", {
210
- start: state.segmentCursors.completion,
211
- end,
212
- })) {
213
- return true;
214
- }
215
- if (state.running.length < maxParallelism) {
216
- if (await getNextUp(ctx, "pendingStart", {
217
- start: state.segmentCursors.incoming,
218
- end,
219
- })) {
220
- return true;
221
- }
222
- }
223
- return false;
224
- }
225
- async function oldSegmentIsActionable(ctx, state, maxParallelism) {
226
- // Next, we look for out-of-order additions we may have missed.
227
- const oldCompletion = await getNextUp(ctx, "pendingCompletion", {
228
- end: state.segmentCursors.completion,
229
- });
230
- if (oldCompletion) {
231
- return [true, { completion: oldCompletion.segment }];
232
- }
233
- const oldCancelation = await getNextUp(ctx, "pendingCancelation", {
234
- end: state.segmentCursors.cancelation,
235
- });
236
- if (oldCancelation) {
237
- return [true, { cancelation: oldCancelation.segment }];
238
- }
239
- if (state.running.length < maxParallelism) {
240
- const oldStart = await getNextUp(ctx, "pendingStart", {
241
- end: state.segmentCursors.incoming,
242
- });
243
- if (oldStart) {
244
- return [true, { incoming: oldStart.segment }];
245
- }
246
- }
247
- return [false, {}];
248
- }
249
- // Fetch the next item. If only one of start & end are provided, it's exclusive.
250
- async function getNextUp(ctx, table, range) {
251
- return ctx.db
252
- .query(table)
253
- .withIndex("segment", (q) => range.start !== undefined
254
- ? range.end !== undefined
255
- ? q
256
- .gte("segment", range.start - CURSOR_BUFFER_SEGMENTS)
257
- .lte("segment", range.end)
258
- : q.gt("segment", range.start - CURSOR_BUFFER_SEGMENTS)
259
- : range.end !== undefined
260
- ? q.lt("segment", range.end)
261
- : q)
262
- .first();
263
- }
225
+ /**
226
+ * @deprecated Forwarder for in-flight scheduled calls from before the
227
+ * upgrade. The scheduling logic has been merged into `main`.
228
+ */
229
+ export const updateRunStatus = internalMutation({
230
+ args: { generation: v.int64(), segment: v.int64() },
231
+ handler: async (ctx, { generation }) => {
232
+ await ctx.scheduler.runAfter(0, internal.loop.main, { generation });
233
+ },
234
+ });
264
235
  /**
265
236
  * Handles the completion of pending completions.
266
237
  * This only processes work that succeeded or failed, not canceled.
238
+ * Accepts pre-fetched completion docs (from snapshot query).
267
239
  */
268
- async function handleCompletions(ctx, state, segment, console) {
269
- const startSegment = state.segmentCursors.completion - CURSOR_BUFFER_SEGMENTS;
270
- // This won't be too many because the jobs all correspond to being scheduled
271
- // by a single main (the previous one), so they're limited by MAX_PARALLELISM.
272
- const completed = await ctx.db
273
- .query("pendingCompletion")
274
- .withIndex("segment", (q) => q.gte("segment", startSegment).lte("segment", segment))
275
- .collect();
276
- state.segmentCursors.completion = segment;
240
+ async function handleCompletions(ctx, state, completed, console) {
277
241
  // Completions that were going to be retried but have since been canceled.
278
242
  const toCancel = [];
279
243
  await Promise.all(completed.map(async (c) => {
280
- await ctx.db.delete(c._id);
244
+ await ctx.db.delete("pendingCompletion", c._id);
281
245
  const running = state.running.find((r) => r.workId === c.workId);
282
246
  if (!running) {
283
247
  console.error(`[main] completing ${c.workId} but it's not in "running"`);
@@ -285,7 +249,7 @@ async function handleCompletions(ctx, state, segment, console) {
285
249
  }
286
250
  if (c.retry) {
287
251
  // Only check for work if it's going to be retried.
288
- const work = await ctx.db.get(c.workId);
252
+ const work = await ctx.db.get("work", c.workId);
289
253
  if (!work) {
290
254
  console.warn(`[main] ${c.workId} is gone, but trying to complete`);
291
255
  return;
@@ -322,32 +286,29 @@ async function handleCompletions(ctx, state, segment, console) {
322
286
  console.debug(`[main] completed ${numCompleted} work`);
323
287
  return toCancel;
324
288
  }
325
- async function handleCancelation(ctx, state, segment, console, toCancel) {
326
- const start = state.segmentCursors.cancelation - CURSOR_BUFFER_SEGMENTS;
327
- const canceled = await ctx.db
328
- .query("pendingCancelation")
329
- .withIndex("segment", (q) => q.gte("segment", start).lte("segment", segment))
330
- .take(CANCELLATION_BATCH_SIZE);
331
- state.segmentCursors.cancelation = canceled.at(-1)?.segment ?? segment;
289
+ /**
290
+ * Handles cancelation. Accepts pre-fetched cancelation docs.
291
+ */
292
+ async function handleCancelation(ctx, state, canceled, console, toCancel) {
332
293
  if (canceled.length) {
333
294
  console.debug(`[main] attempting to cancel ${canceled.length}`);
334
295
  }
335
296
  const canceledWork = new Set();
336
297
  const runResult = { kind: "canceled" };
337
- const jobs = toCancel.concat(...(await Promise.all(canceled.map(async ({ _id, _creationTime, workId }) => {
338
- await ctx.db.delete(_id);
298
+ const jobs = toCancel.concat(...(await Promise.all(canceled.map(async ({ _id, workId }) => {
299
+ await ctx.db.delete("pendingCancelation", _id);
339
300
  if (canceledWork.has(workId)) {
340
301
  // We shouldn't have multiple pending cancelations for the same work.
341
302
  console.error(`[main] ${workId} already canceled`);
342
303
  return null;
343
304
  }
344
- const work = await ctx.db.get(workId);
305
+ const work = await ctx.db.get("work", workId);
345
306
  if (!work) {
346
307
  console.warn(`[main] ${workId} is gone, but trying to cancel`);
347
308
  return null;
348
309
  }
349
310
  // Ensure it doesn't retry.
350
- await ctx.db.patch(workId, { canceled: true });
311
+ await ctx.db.patch("work", workId, { canceled: true });
351
312
  // Ensure it doesn't start.
352
313
  const pendingStart = await ctx.db
353
314
  .query("pendingStart")
@@ -355,7 +316,7 @@ async function handleCancelation(ctx, state, segment, console, toCancel) {
355
316
  .unique();
356
317
  if (pendingStart && !canceledWork.has(workId)) {
357
318
  state.report.canceled++;
358
- await ctx.db.delete(pendingStart._id);
319
+ await ctx.db.delete("pendingStart", pendingStart._id);
359
320
  canceledWork.add(workId);
360
321
  return { workId, runResult, attempt: work.attempts };
361
322
  }
@@ -372,10 +333,19 @@ async function handleRecovery(ctx, state, console) {
372
333
  if (r.started >= oldEnoughToConsider) {
373
334
  return null;
374
335
  }
375
- const work = await ctx.db.get(r.workId);
336
+ const work = await ctx.db.get("work", r.workId);
376
337
  if (!work) {
377
- missing.add(r.workId);
378
- console.error(`[main] ${r.workId} already gone (skipping recovery)`);
338
+ const pendingCompletion = await ctx.db
339
+ .query("pendingCompletion")
340
+ .withIndex("workId", (q) => q.eq("workId", r.workId))
341
+ .first();
342
+ if (!pendingCompletion) {
343
+ missing.add(r.workId);
344
+ console.error(`[main] ${r.workId} already gone (skipping recovery)`);
345
+ }
346
+ else {
347
+ console.debug(`[main] ${r.workId} already gone but has pendingCompletion`);
348
+ }
379
349
  return null;
380
350
  }
381
351
  return { ...r, attempt: work.attempts };
@@ -386,26 +356,10 @@ async function handleRecovery(ctx, state, console) {
386
356
  await ctx.scheduler.runAfter(0, internal.recovery.recover, { jobs: batch });
387
357
  }
388
358
  }
389
- async function handleStart(ctx, state, segment, console, { maxParallelism, logLevel }) {
390
- // Schedule as many as needed to reach maxParallelism.
391
- const toSchedule = maxParallelism - state.running.length;
392
- const pending = toSchedule > 0
393
- ? await ctx.db
394
- .query("pendingStart")
395
- .withIndex("segment", (q) => q
396
- .gte("segment", state.segmentCursors.incoming - CURSOR_BUFFER_SEGMENTS)
397
- .lte("segment", segment))
398
- .take(toSchedule)
399
- : [];
400
- if (pending) {
401
- if (pending.length > 0) {
402
- state.segmentCursors.incoming = pending.at(-1).segment;
403
- }
404
- else if (toSchedule > 0) {
405
- // We have no more pending work, update to now
406
- state.segmentCursors.incoming = segment;
407
- }
408
- }
359
+ /**
360
+ * Starts pending work. Accepts pre-fetched pendingStart docs.
361
+ */
362
+ async function handleStart(ctx, state, pending, console, { logLevel }) {
409
363
  console.debug(`[main] scheduling ${pending.length} pending work`);
410
364
  // Start new work.
411
365
  state.running.push(...(await Promise.all(pending.map(async ({ _id, workId, segment }) => {
@@ -415,7 +369,7 @@ async function handleStart(ctx, state, segment, console, { maxParallelism, logLe
415
369
  }
416
370
  const lagMs = Date.now() - fromSegment(segment);
417
371
  const scheduledId = await beginWork(ctx, workId, logLevel, lagMs);
418
- await ctx.db.delete(_id);
372
+ await ctx.db.delete("pendingStart", _id);
419
373
  if (!scheduledId)
420
374
  return null;
421
375
  return { scheduledId, workId, started: Date.now() };
@@ -423,7 +377,7 @@ async function handleStart(ctx, state, segment, console, { maxParallelism, logLe
423
377
  }
424
378
  async function beginWork(ctx, workId, logLevel, lagMs) {
425
379
  const console = createLogger(logLevel);
426
- const work = await ctx.db.get(workId);
380
+ const work = await ctx.db.get("work", workId);
427
381
  if (!work) {
428
382
  console.error(`Trying to start, but work not found: ${workId}`);
429
383
  return null;
@@ -508,7 +462,7 @@ async function getOrCreateState(ctx) {
508
462
  const globals = await getGlobals(ctx);
509
463
  const console = createLogger(globals.logLevel);
510
464
  console.error("No internalState in running loop! Re-creating empty one...");
511
- return (await ctx.db.get(await ctx.db.insert("internalState", INITIAL_STATE)));
465
+ return (await ctx.db.get("internalState", await ctx.db.insert("internalState", INITIAL_STATE)));
512
466
  }
513
467
  async function getOrCreateRunningStatus(ctx) {
514
468
  const runStatus = await ctx.db.query("runStatus").unique();
@@ -517,7 +471,7 @@ async function getOrCreateRunningStatus(ctx) {
517
471
  const globals = await getGlobals(ctx);
518
472
  const console = createLogger(globals.logLevel);
519
473
  console.error("No runStatus in running loop! Re-creating one...");
520
- return (await ctx.db.get(await ctx.db.insert("runStatus", { state: { kind: "running" } })));
474
+ return (await ctx.db.get("runStatus", await ctx.db.insert("runStatus", { state: { kind: "running" } })));
521
475
  }
522
476
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
523
477
  const console = "THIS IS A REMINDER TO USE createLogger";
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/component/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/component/loop.ts"],"names":[],"mappings":"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"}