@convex-dev/workpool 0.2.0-beta.0 → 0.2.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/README.md +87 -18
- package/dist/commonjs/client/index.d.ts +33 -8
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +37 -7
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/component/complete.d.ts +89 -0
- package/dist/commonjs/component/complete.d.ts.map +1 -0
- package/dist/commonjs/component/complete.js +82 -0
- package/dist/commonjs/component/complete.js.map +1 -0
- package/dist/commonjs/component/kick.d.ts +3 -3
- package/dist/commonjs/component/kick.d.ts.map +1 -1
- package/dist/commonjs/component/kick.js +17 -12
- package/dist/commonjs/component/kick.js.map +1 -1
- package/dist/commonjs/component/lib.d.ts +6 -6
- package/dist/commonjs/component/lib.d.ts.map +1 -1
- package/dist/commonjs/component/lib.js +53 -24
- package/dist/commonjs/component/lib.js.map +1 -1
- package/dist/commonjs/component/logging.d.ts +3 -2
- package/dist/commonjs/component/logging.d.ts.map +1 -1
- package/dist/commonjs/component/logging.js +34 -16
- package/dist/commonjs/component/logging.js.map +1 -1
- package/dist/commonjs/component/loop.d.ts +1 -14
- package/dist/commonjs/component/loop.d.ts.map +1 -1
- package/dist/commonjs/component/loop.js +216 -179
- package/dist/commonjs/component/loop.js.map +1 -1
- package/dist/commonjs/component/recovery.d.ts +45 -0
- package/dist/commonjs/component/recovery.d.ts.map +1 -1
- package/dist/commonjs/component/recovery.js +88 -65
- package/dist/commonjs/component/recovery.js.map +1 -1
- package/dist/commonjs/component/schema.d.ts +17 -13
- package/dist/commonjs/component/schema.d.ts.map +1 -1
- package/dist/commonjs/component/schema.js +5 -3
- package/dist/commonjs/component/schema.js.map +1 -1
- package/dist/commonjs/component/shared.d.ts +24 -15
- package/dist/commonjs/component/shared.d.ts.map +1 -1
- package/dist/commonjs/component/shared.js +20 -7
- package/dist/commonjs/component/shared.js.map +1 -1
- package/dist/commonjs/component/stats.d.ts +36 -29
- package/dist/commonjs/component/stats.d.ts.map +1 -1
- package/dist/commonjs/component/stats.js +110 -52
- package/dist/commonjs/component/stats.js.map +1 -1
- package/dist/commonjs/component/worker.d.ts +4 -14
- package/dist/commonjs/component/worker.d.ts.map +1 -1
- package/dist/commonjs/component/worker.js +23 -36
- package/dist/commonjs/component/worker.js.map +1 -1
- package/dist/esm/client/index.d.ts +33 -8
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +37 -7
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/component/complete.d.ts +89 -0
- package/dist/esm/component/complete.d.ts.map +1 -0
- package/dist/esm/component/complete.js +82 -0
- package/dist/esm/component/complete.js.map +1 -0
- package/dist/esm/component/kick.d.ts +3 -3
- package/dist/esm/component/kick.d.ts.map +1 -1
- package/dist/esm/component/kick.js +17 -12
- package/dist/esm/component/kick.js.map +1 -1
- package/dist/esm/component/lib.d.ts +6 -6
- package/dist/esm/component/lib.d.ts.map +1 -1
- package/dist/esm/component/lib.js +53 -24
- package/dist/esm/component/lib.js.map +1 -1
- package/dist/esm/component/logging.d.ts +3 -2
- package/dist/esm/component/logging.d.ts.map +1 -1
- package/dist/esm/component/logging.js +34 -16
- package/dist/esm/component/logging.js.map +1 -1
- package/dist/esm/component/loop.d.ts +1 -14
- package/dist/esm/component/loop.d.ts.map +1 -1
- package/dist/esm/component/loop.js +216 -179
- package/dist/esm/component/loop.js.map +1 -1
- package/dist/esm/component/recovery.d.ts +45 -0
- package/dist/esm/component/recovery.d.ts.map +1 -1
- package/dist/esm/component/recovery.js +88 -65
- package/dist/esm/component/recovery.js.map +1 -1
- package/dist/esm/component/schema.d.ts +17 -13
- package/dist/esm/component/schema.d.ts.map +1 -1
- package/dist/esm/component/schema.js +5 -3
- package/dist/esm/component/schema.js.map +1 -1
- package/dist/esm/component/shared.d.ts +24 -15
- package/dist/esm/component/shared.d.ts.map +1 -1
- package/dist/esm/component/shared.js +20 -7
- package/dist/esm/component/shared.js.map +1 -1
- package/dist/esm/component/stats.d.ts +36 -29
- package/dist/esm/component/stats.d.ts.map +1 -1
- package/dist/esm/component/stats.js +110 -52
- package/dist/esm/component/stats.js.map +1 -1
- package/dist/esm/component/worker.d.ts +4 -14
- package/dist/esm/component/worker.d.ts.map +1 -1
- package/dist/esm/component/worker.js +23 -36
- package/dist/esm/component/worker.js.map +1 -1
- package/package.json +12 -12
- package/src/client/index.ts +82 -43
- package/src/component/README.md +15 -15
- package/src/component/_generated/api.d.ts +10 -5
- package/src/component/complete.test.ts +508 -0
- package/src/component/complete.ts +109 -0
- package/src/component/kick.test.ts +29 -19
- package/src/component/kick.ts +25 -17
- package/src/component/lib.test.ts +262 -17
- package/src/component/lib.ts +68 -30
- package/src/component/logging.test.ts +16 -0
- package/src/component/logging.ts +45 -24
- package/src/component/loop.test.ts +1158 -0
- package/src/component/loop.ts +292 -224
- package/src/component/recovery.test.ts +536 -0
- package/src/component/recovery.ts +100 -75
- package/src/component/schema.ts +6 -4
- package/src/component/shared.ts +23 -8
- package/src/component/stats.test.ts +345 -0
- package/src/component/stats.ts +149 -56
- package/src/component/worker.ts +25 -38
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
2
|
import { logLevel } from "./logging.js";
|
|
3
|
-
const
|
|
3
|
+
export const DEFAULT_MAX_PARALLELISM = 10;
|
|
4
|
+
const SEGMENT_MS = 100;
|
|
4
5
|
export const SECOND = 1000;
|
|
5
6
|
export const MINUTE = 60 * SECOND;
|
|
6
7
|
export const HOUR = 60 * MINUTE;
|
|
@@ -9,10 +10,10 @@ export const YEAR = 365 * DAY;
|
|
|
9
10
|
export function toSegment(ms) {
|
|
10
11
|
return BigInt(Math.floor(ms / SEGMENT_MS));
|
|
11
12
|
}
|
|
12
|
-
export function
|
|
13
|
+
export function getCurrentSegment() {
|
|
13
14
|
return toSegment(Date.now());
|
|
14
15
|
}
|
|
15
|
-
export function
|
|
16
|
+
export function getNextSegment() {
|
|
16
17
|
return toSegment(Date.now()) + 1n;
|
|
17
18
|
}
|
|
18
19
|
export function fromSegment(segment) {
|
|
@@ -44,22 +45,34 @@ export const onComplete = v.object({
|
|
|
44
45
|
});
|
|
45
46
|
export const status = v.union(v.union(v.object({
|
|
46
47
|
state: v.literal("pending"),
|
|
47
|
-
|
|
48
|
+
previousAttempts: v.number(),
|
|
48
49
|
}), v.object({
|
|
49
50
|
state: v.literal("running"),
|
|
50
|
-
|
|
51
|
+
previousAttempts: v.number(),
|
|
51
52
|
}), v.object({
|
|
52
53
|
state: v.literal("finished"),
|
|
53
54
|
})));
|
|
54
55
|
export function boundScheduledTime(ms, console) {
|
|
55
56
|
if (ms < Date.now() - YEAR) {
|
|
56
|
-
console.
|
|
57
|
+
console.error("scheduled time is too old, defaulting to now", ms);
|
|
57
58
|
return Date.now();
|
|
58
59
|
}
|
|
59
60
|
if (ms > Date.now() + 4 * YEAR) {
|
|
60
|
-
console.
|
|
61
|
+
console.error("scheduled time is too far in the future, defaulting to 1 year from now", ms);
|
|
61
62
|
return Date.now() + YEAR;
|
|
62
63
|
}
|
|
63
64
|
return ms;
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns the smaller of two bigint values.
|
|
68
|
+
*/
|
|
69
|
+
export function min(a, b) {
|
|
70
|
+
return a > b ? b : a;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns the larger of two bigint values.
|
|
74
|
+
*/
|
|
75
|
+
export function max(a, b) {
|
|
76
|
+
return a < b ? b : a;
|
|
77
|
+
}
|
|
65
78
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/component/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAU,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC;AAChC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/component/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,45 @@
|
|
|
1
|
-
import { Doc } from "./_generated/dataModel.js";
|
|
1
|
+
import { Doc, Id } from "./_generated/dataModel.js";
|
|
2
|
+
import { MutationCtx } from "./_generated/server.js";
|
|
3
|
+
import { Config } from "./shared.js";
|
|
4
|
+
import { Logger } from "./logging.js";
|
|
2
5
|
/**
|
|
3
6
|
* Record stats about work execution. Intended to be queried by Axiom or Datadog.
|
|
7
|
+
* See the [README](https://github.com/get-convex/workpool) for example queries.
|
|
4
8
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
9
|
+
export declare function recordEnqueued(console: Logger, data: {
|
|
10
|
+
workId: Id<"work">;
|
|
11
|
+
fnName: string;
|
|
12
|
+
runAt: number;
|
|
13
|
+
}): void;
|
|
14
|
+
export declare function recordStarted(console: Logger, work: Doc<"work">, lagMs: number): void;
|
|
15
|
+
export declare function recordCompleted(console: Logger, work: Doc<"work">, status: "success" | "failed" | "canceled" | "retrying"): void;
|
|
16
|
+
export declare function generateReport(ctx: MutationCtx, console: Logger, state: Doc<"internalState">, { maxParallelism, logLevel }: Config): Promise<void>;
|
|
17
|
+
export declare const calculateBacklogAndReport: import("convex/server").RegisteredMutation<"internal", {
|
|
18
|
+
report: {
|
|
19
|
+
failed: number;
|
|
20
|
+
canceled: number;
|
|
21
|
+
completed: number;
|
|
22
|
+
succeeded: number;
|
|
23
|
+
retries: number;
|
|
24
|
+
lastReportTs: number;
|
|
25
|
+
};
|
|
26
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
27
|
+
running: number;
|
|
28
|
+
startSegment: bigint;
|
|
29
|
+
endSegment: bigint;
|
|
30
|
+
cursor: string;
|
|
31
|
+
}, Promise<void>>;
|
|
27
32
|
/**
|
|
28
33
|
* Warning: this should not be used from a mutation, as it will cause conflicts.
|
|
29
34
|
* Use this while developing to see the state of the queue.
|
|
30
35
|
*/
|
|
31
|
-
export declare const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
export declare const diagnostics: import("convex/server").RegisteredQuery<"internal", {}, Promise<{
|
|
37
|
+
canceling: any;
|
|
38
|
+
waiting: any;
|
|
39
|
+
running: number;
|
|
40
|
+
completing: any;
|
|
41
|
+
spareCapacity: number;
|
|
42
|
+
runStatus: "running" | "scheduled" | "idle" | undefined;
|
|
43
|
+
generation: bigint | undefined;
|
|
37
44
|
}>>;
|
|
38
45
|
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EAGP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,MAAM,EAAuB,MAAM,cAAc,CAAC;AAOzE;;;GAGG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,QAMF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,KAAK,EAAE,MAAM,QASd;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,QASvD;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,GAAG,CAAC,eAAe,CAAC,EAC3B,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,MAAM,iBAkCrC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAyCpC,CAAC;AAiBH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;GA4BtB,CAAC"}
|
|
@@ -1,88 +1,146 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
|
-
import { internalQuery } from "./_generated/server.js";
|
|
2
|
+
import { internalMutation, internalQuery, } from "./_generated/server.js";
|
|
3
|
+
import { DEFAULT_MAX_PARALLELISM, getCurrentSegment, } from "./shared.js";
|
|
4
|
+
import { createLogger, logLevel, shouldLog } from "./logging.js";
|
|
5
|
+
import { internal } from "./_generated/api.js";
|
|
6
|
+
import schema from "./schema.js";
|
|
7
|
+
import { paginator } from "convex-helpers/server/pagination";
|
|
8
|
+
const BACKLOG_BATCH_SIZE = 100;
|
|
3
9
|
/**
|
|
4
10
|
* Record stats about work execution. Intended to be queried by Axiom or Datadog.
|
|
11
|
+
* See the [README](https://github.com/get-convex/workpool) for example queries.
|
|
5
12
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
)
|
|
15
|
-
| extend lagSinceEnqueued = parsed_message["lagSinceEnqueued"]
|
|
16
|
-
| extend fnName = parsed_message["fnName"]
|
|
17
|
-
| summarize avg(todouble(lagSinceEnqueued)) by bin_auto(_time), tostring(fnName)
|
|
18
|
-
|
|
19
|
-
*/
|
|
20
|
-
export function recordStarted(work) {
|
|
21
|
-
return JSON.stringify({
|
|
13
|
+
export function recordEnqueued(console, data) {
|
|
14
|
+
console.event("enqueued", {
|
|
15
|
+
...data,
|
|
16
|
+
enqueuedAt: Date.now(),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function recordStarted(console, work, lagMs) {
|
|
20
|
+
console.event("started", {
|
|
22
21
|
workId: work._id,
|
|
23
|
-
event: "started",
|
|
24
22
|
fnName: work.fnName,
|
|
25
23
|
enqueuedAt: work._creationTime,
|
|
26
24
|
startedAt: Date.now(),
|
|
27
|
-
|
|
25
|
+
startLag: lagMs,
|
|
28
26
|
});
|
|
29
27
|
}
|
|
30
|
-
export function recordCompleted(work, status) {
|
|
31
|
-
|
|
28
|
+
export function recordCompleted(console, work, status) {
|
|
29
|
+
console.event("completed", {
|
|
32
30
|
workId: work._id,
|
|
33
|
-
event: "completed",
|
|
34
31
|
fnName: work.fnName,
|
|
35
32
|
completedAt: Date.now(),
|
|
33
|
+
attempts: work.attempts,
|
|
36
34
|
status,
|
|
37
|
-
lagSinceEnqueued: Date.now() - work._creationTime,
|
|
38
35
|
});
|
|
39
36
|
}
|
|
40
|
-
export function
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
export async function generateReport(ctx, console, state, { maxParallelism, logLevel }) {
|
|
38
|
+
if (!shouldLog(logLevel, "REPORT")) {
|
|
39
|
+
// Don't waste time if we're not going to log.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const currentSegment = getCurrentSegment();
|
|
43
|
+
const pendingStart = await paginator(ctx.db, schema)
|
|
44
|
+
.query("pendingStart")
|
|
45
|
+
.withIndex("segment", (q) => q
|
|
46
|
+
.gte("segment", state.segmentCursors.incoming)
|
|
47
|
+
.lt("segment", currentSegment))
|
|
48
|
+
.paginate({
|
|
49
|
+
numItems: maxParallelism,
|
|
50
|
+
cursor: null,
|
|
52
51
|
});
|
|
52
|
+
if (pendingStart.isDone) {
|
|
53
|
+
recordReport(console, {
|
|
54
|
+
...state.report,
|
|
55
|
+
running: state.running.length,
|
|
56
|
+
backlog: pendingStart.page.length,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await ctx.scheduler.runAfter(0, internal.stats.calculateBacklogAndReport, {
|
|
61
|
+
startSegment: state.segmentCursors.incoming,
|
|
62
|
+
endSegment: currentSegment,
|
|
63
|
+
cursor: pendingStart.continueCursor,
|
|
64
|
+
report: state.report,
|
|
65
|
+
running: state.running.length,
|
|
66
|
+
logLevel,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
53
69
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
export const calculateBacklogAndReport = internalMutation({
|
|
71
|
+
args: {
|
|
72
|
+
startSegment: v.int64(),
|
|
73
|
+
endSegment: v.int64(),
|
|
74
|
+
cursor: v.string(),
|
|
75
|
+
report: schema.tables.internalState.validator.fields.report,
|
|
76
|
+
running: v.number(),
|
|
77
|
+
logLevel,
|
|
78
|
+
},
|
|
79
|
+
handler: async (ctx, args) => {
|
|
80
|
+
const pendingStart = await paginator(ctx.db, schema)
|
|
81
|
+
.query("pendingStart")
|
|
82
|
+
.withIndex("segment", (q) => q.gte("segment", args.startSegment).lt("segment", args.endSegment))
|
|
83
|
+
.paginate({
|
|
84
|
+
numItems: BACKLOG_BATCH_SIZE,
|
|
85
|
+
cursor: args.cursor,
|
|
86
|
+
});
|
|
87
|
+
const console = createLogger(args.logLevel);
|
|
88
|
+
if (pendingStart.isDone) {
|
|
89
|
+
recordReport(console, {
|
|
90
|
+
...args.report,
|
|
91
|
+
running: args.running,
|
|
92
|
+
backlog: pendingStart.page.length,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
await ctx.scheduler.runAfter(0, internal.stats.calculateBacklogAndReport, {
|
|
97
|
+
startSegment: args.startSegment,
|
|
98
|
+
endSegment: args.endSegment,
|
|
99
|
+
cursor: pendingStart.continueCursor,
|
|
100
|
+
report: args.report,
|
|
101
|
+
running: args.running,
|
|
102
|
+
logLevel: args.logLevel,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
64
105
|
},
|
|
65
106
|
});
|
|
107
|
+
function recordReport(console, report) {
|
|
108
|
+
const { completed, failed, retries } = report;
|
|
109
|
+
const withoutRetries = completed - retries;
|
|
110
|
+
const failureRate = completed ? (failed + retries) / completed : 0;
|
|
111
|
+
const permanentFailureRate = withoutRetries ? failed / withoutRetries : 0;
|
|
112
|
+
console.event("report", {
|
|
113
|
+
...report,
|
|
114
|
+
failureRate: Number(failureRate.toFixed(4)),
|
|
115
|
+
permanentFailureRate: Number(permanentFailureRate.toFixed(4)),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
66
118
|
/**
|
|
67
119
|
* Warning: this should not be used from a mutation, as it will cause conflicts.
|
|
68
120
|
* Use this while developing to see the state of the queue.
|
|
69
121
|
*/
|
|
70
|
-
export const
|
|
122
|
+
export const diagnostics = internalQuery({
|
|
71
123
|
args: {},
|
|
72
124
|
returns: v.any(),
|
|
73
125
|
handler: async (ctx) => {
|
|
74
|
-
const
|
|
126
|
+
const global = await ctx.db.query("globals").unique();
|
|
127
|
+
const internalState = await ctx.db.query("internalState").unique();
|
|
128
|
+
const inProgressWork = internalState?.running.length ?? 0;
|
|
129
|
+
const maxParallelism = global?.maxParallelism ?? DEFAULT_MAX_PARALLELISM;
|
|
75
130
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
76
131
|
const pendingStart = await ctx.db.query("pendingStart").count();
|
|
77
132
|
const pendingCompletion = await ctx.db.query("pendingCompletion").count();
|
|
78
133
|
const pendingCancelation = await ctx.db.query("pendingCancelation").count();
|
|
134
|
+
const runStatus = await ctx.db.query("runStatus").unique();
|
|
79
135
|
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
80
136
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
pendingCompletion,
|
|
84
|
-
|
|
85
|
-
|
|
137
|
+
canceling: pendingCancelation,
|
|
138
|
+
waiting: pendingStart,
|
|
139
|
+
running: inProgressWork - pendingCompletion,
|
|
140
|
+
completing: pendingCompletion,
|
|
141
|
+
spareCapacity: maxParallelism - inProgressWork,
|
|
142
|
+
runStatus: runStatus?.state.kind,
|
|
143
|
+
generation: internalState?.generation,
|
|
86
144
|
};
|
|
87
145
|
},
|
|
88
146
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
export declare const runMutationWrapper: import("convex/server").RegisteredMutation<"internal", {
|
|
2
|
-
logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
2
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
3
3
|
fnHandle: string;
|
|
4
4
|
workId: import("convex/values").GenericId<"work">;
|
|
5
5
|
fnArgs: any;
|
|
6
|
+
attempt: number;
|
|
6
7
|
}, Promise<void>>;
|
|
7
8
|
export declare const runActionWrapper: import("convex/server").RegisteredAction<"internal", {
|
|
8
|
-
logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
9
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
9
10
|
fnHandle: string;
|
|
10
11
|
workId: import("convex/values").GenericId<"work">;
|
|
11
12
|
fnArgs: any;
|
|
12
|
-
|
|
13
|
-
export declare const saveResult: import("convex/server").RegisteredMutation<"internal", {
|
|
14
|
-
workId: import("convex/values").GenericId<"work">;
|
|
15
|
-
runResult: {
|
|
16
|
-
kind: "success";
|
|
17
|
-
returnValue: any;
|
|
18
|
-
} | {
|
|
19
|
-
kind: "failed";
|
|
20
|
-
error: string;
|
|
21
|
-
} | {
|
|
22
|
-
kind: "canceled";
|
|
23
|
-
};
|
|
13
|
+
attempt: number;
|
|
24
14
|
}, Promise<void>>;
|
|
25
15
|
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,kBAAkB;;;;;;iBA4B7B,CAAC;AASH,eAAO,MAAM,gBAAgB;;;;;;iBA4B3B,CAAC"}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
2
|
import { internal } from "./_generated/api.js";
|
|
3
3
|
import { internalAction, internalMutation } from "./_generated/server.js";
|
|
4
|
-
import { kickMainLoop } from "./kick.js";
|
|
5
4
|
import { createLogger, logLevel } from "./logging.js";
|
|
6
|
-
import { nextSegment, runResult } from "./shared.js";
|
|
7
5
|
export const runMutationWrapper = internalMutation({
|
|
8
6
|
args: {
|
|
9
7
|
workId: v.id("work"),
|
|
10
8
|
fnHandle: v.string(),
|
|
11
9
|
fnArgs: v.any(),
|
|
12
10
|
logLevel,
|
|
11
|
+
attempt: v.number(),
|
|
13
12
|
},
|
|
14
|
-
handler: async (ctx, { workId,
|
|
15
|
-
const console = createLogger(logLevel);
|
|
16
|
-
const fnHandle =
|
|
13
|
+
handler: async (ctx, { workId, attempt, ...args }) => {
|
|
14
|
+
const console = createLogger(args.logLevel);
|
|
15
|
+
const fnHandle = args.fnHandle;
|
|
17
16
|
try {
|
|
18
|
-
const returnValue = await ctx.runMutation(fnHandle, fnArgs);
|
|
17
|
+
const returnValue = await ctx.runMutation(fnHandle, args.fnArgs);
|
|
19
18
|
// NOTE: we could run the `saveResult` handler here, or call `ctx.runMutation`,
|
|
20
19
|
// but we want the mutation to be a separate transaction to reduce the window for OCCs.
|
|
21
|
-
await ctx.scheduler.runAfter(0, internal.
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
await ctx.scheduler.runAfter(0, internal.complete.complete, {
|
|
21
|
+
jobs: [
|
|
22
|
+
{ workId, runResult: { kind: "success", returnValue }, attempt },
|
|
23
|
+
],
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
catch (e) {
|
|
27
27
|
console.error(e);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const runResult = { kind: "failed", error: formatError(e) };
|
|
29
|
+
await ctx.scheduler.runAfter(0, internal.complete.complete, {
|
|
30
|
+
jobs: [{ workId, runResult, attempt }],
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
},
|
|
@@ -44,43 +44,30 @@ export const runActionWrapper = internalAction({
|
|
|
44
44
|
fnHandle: v.string(),
|
|
45
45
|
fnArgs: v.any(),
|
|
46
46
|
logLevel,
|
|
47
|
+
attempt: v.number(),
|
|
47
48
|
},
|
|
48
|
-
handler: async (ctx, { workId,
|
|
49
|
-
const console = createLogger(logLevel);
|
|
50
|
-
const fnHandle =
|
|
49
|
+
handler: async (ctx, { workId, attempt, ...args }) => {
|
|
50
|
+
const console = createLogger(args.logLevel);
|
|
51
|
+
const fnHandle = args.fnHandle;
|
|
51
52
|
try {
|
|
52
|
-
const returnValue = await ctx.runAction(fnHandle, fnArgs);
|
|
53
|
+
const returnValue = await ctx.runAction(fnHandle, args.fnArgs);
|
|
53
54
|
// NOTE: we could run `ctx.runMutation`, but we want to guarantee execution,
|
|
54
55
|
// and `ctx.scheduler.runAfter` won't OCC.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
const runResult = { kind: "success", returnValue };
|
|
57
|
+
await ctx.scheduler.runAfter(0, internal.complete.complete, {
|
|
58
|
+
jobs: [{ workId, runResult, attempt }],
|
|
58
59
|
});
|
|
59
60
|
}
|
|
60
61
|
catch (e) {
|
|
61
62
|
console.error(e);
|
|
62
63
|
// We let the main loop handle the retries.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
const runResult = { kind: "failed", error: formatError(e) };
|
|
65
|
+
await ctx.scheduler.runAfter(0, internal.complete.complete, {
|
|
66
|
+
jobs: [{ workId, runResult, attempt }],
|
|
66
67
|
});
|
|
67
68
|
}
|
|
68
69
|
},
|
|
69
70
|
});
|
|
70
|
-
export const saveResult = internalMutation({
|
|
71
|
-
args: {
|
|
72
|
-
workId: v.id("work"),
|
|
73
|
-
runResult,
|
|
74
|
-
},
|
|
75
|
-
handler: async (ctx, { workId, runResult }) => {
|
|
76
|
-
await ctx.db.insert("pendingCompletion", {
|
|
77
|
-
runResult,
|
|
78
|
-
workId,
|
|
79
|
-
segment: nextSegment(),
|
|
80
|
-
});
|
|
81
|
-
await kickMainLoop(ctx, "saveResult");
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
71
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
85
72
|
const console = "THIS IS A REMINDER TO USE createLogger";
|
|
86
73
|
//# sourceMappingURL=worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"email": "support@convex.dev",
|
|
8
8
|
"url": "https://github.com/get-convex/workpool/issues"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.2.
|
|
10
|
+
"version": "0.2.1",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
"build:cjs": "tsc --project ./commonjs.json && echo '{\\n \"type\": \"commonjs\"\\n}' > dist/commonjs/package.json",
|
|
25
25
|
"dev": "cd example; npm run dev",
|
|
26
26
|
"typecheck": "tsc --noEmit",
|
|
27
|
-
"prepare": "npm run build",
|
|
28
|
-
"prepack": "node node10stubs.mjs",
|
|
29
|
-
"postpack": "node node10stubs.mjs --cleanup",
|
|
30
|
-
"test": "vitest",
|
|
31
27
|
"lint": "tsc --noEmit && eslint . && prettier --check .",
|
|
32
28
|
"format": "prettier --write .",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
33
31
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
34
|
-
"test:coverage": "vitest run --coverage --coverage.reporter=text"
|
|
32
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
33
|
+
"prepare": "npm run build",
|
|
34
|
+
"prepack": "node node10stubs.mjs",
|
|
35
|
+
"postpack": "node node10stubs.mjs --cleanup"
|
|
35
36
|
},
|
|
36
37
|
"files": [
|
|
37
38
|
"dist",
|
|
@@ -61,11 +62,14 @@
|
|
|
61
62
|
}
|
|
62
63
|
},
|
|
63
64
|
"peerDependencies": {
|
|
64
|
-
"convex": ">=1.17.0 <1.25.0"
|
|
65
|
+
"convex": ">=1.17.0 <1.25.0",
|
|
66
|
+
"convex-helpers": "^0.1.71"
|
|
65
67
|
},
|
|
66
68
|
"devDependencies": {
|
|
69
|
+
"@edge-runtime/vm": "^4.0.4",
|
|
67
70
|
"@eslint/js": "^9.9.1",
|
|
68
71
|
"@types/node": "^18.17.0",
|
|
72
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
69
73
|
"convex-test": "^0.0.36-alpha.0",
|
|
70
74
|
"eslint": "^9.9.1",
|
|
71
75
|
"globals": "^15.9.0",
|
|
@@ -76,9 +80,5 @@
|
|
|
76
80
|
},
|
|
77
81
|
"main": "./dist/commonjs/client/index.js",
|
|
78
82
|
"types": "./dist/commonjs/client/index.d.ts",
|
|
79
|
-
"module": "./dist/esm/client/index.js"
|
|
80
|
-
"dependencies": {
|
|
81
|
-
"@edge-runtime/vm": "^4.0.4",
|
|
82
|
-
"@vitest/coverage-v8": "^2.1.9"
|
|
83
|
-
}
|
|
83
|
+
"module": "./dist/esm/client/index.js"
|
|
84
84
|
}
|