@sixb/pipeline-worker 0.2.0 → 0.2.2
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/events.d.ts.map +1 -1
- package/dist/index.js +40 -6
- package/dist/index.js.map +5 -5
- package/dist/run-pipeline-job.d.ts.map +1 -1
- package/dist/worker.d.ts +6 -1
- package/dist/worker.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/events.ts +2 -0
- package/src/run-pipeline-job.ts +3 -1
- package/src/worker.ts +54 -4
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAI/F,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACrB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAC7E,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACnB,IAAI,GACJ,eAAe,GACf,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,CACV,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAI/F,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACrB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAC7E,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACnB,IAAI,GACJ,eAAe,GACf,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,CACV,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,EACjF,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/worker.ts
|
|
3
3
|
import { reportRunFailure } from "@sixb/core/internal/error-reporting";
|
|
4
|
+
import { captureSixbFailure as captureSixbFailure3 } from "@sixb/core/internal/errors";
|
|
4
5
|
import { bindDurablePrimitiveExecution } from "@sixb/core/internal/primitive-execution";
|
|
5
|
-
import { QueueWorker } from "@sixb/core/internal/workers";
|
|
6
|
-
import {
|
|
6
|
+
import { QueueWorker, retryUnstartedRun } from "@sixb/core/internal/workers";
|
|
7
|
+
import {
|
|
8
|
+
PIPELINE_RUN_FAILURE_CODES as PIPELINE_RUN_FAILURE_CODES3
|
|
9
|
+
} from "@sixb/core/storage";
|
|
7
10
|
|
|
8
11
|
// src/events.ts
|
|
9
12
|
var SOURCE = "SixbPipelineWorker";
|
|
@@ -85,7 +88,9 @@ async function emitDatasetVersionCommitted(events, job, step, correlationId) {
|
|
|
85
88
|
id: job.pipelineId,
|
|
86
89
|
runId: job.id,
|
|
87
90
|
stepId: step.run.stepId
|
|
88
|
-
}
|
|
91
|
+
},
|
|
92
|
+
rowsChanged: step.version.rowsChanged,
|
|
93
|
+
lineageChanged: step.version.lineageChanged
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
],
|
|
@@ -619,7 +624,7 @@ async function runPipelineJob(input) {
|
|
|
619
624
|
projectId: runtime.id,
|
|
620
625
|
id: job.id
|
|
621
626
|
});
|
|
622
|
-
if (existing?.pipelineId === durableRun.pipelineId && existing.executionId === durableRun.executionId) {
|
|
627
|
+
if (existing?.pipelineId === durableRun.pipelineId && existing.executionId === durableRun.executionId && existing.status !== "queued") {
|
|
623
628
|
throw new PipelineRunAlreadyStartedError(existing);
|
|
624
629
|
}
|
|
625
630
|
throw error;
|
|
@@ -746,6 +751,8 @@ class PipelineWorker extends QueueWorker {
|
|
|
746
751
|
if (!run) {
|
|
747
752
|
throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`);
|
|
748
753
|
}
|
|
754
|
+
if (run.status !== "queued")
|
|
755
|
+
return;
|
|
749
756
|
const durableExecution = await this.host.storage.executions.getById({
|
|
750
757
|
projectId: this.host.id,
|
|
751
758
|
id: run.executionId
|
|
@@ -790,13 +797,40 @@ class PipelineWorker extends QueueWorker {
|
|
|
790
797
|
throw error;
|
|
791
798
|
}
|
|
792
799
|
}
|
|
793
|
-
async onExecutionError(claimed,
|
|
800
|
+
async onExecutionError(claimed, error) {
|
|
794
801
|
const run = await this.host.storage.pipelineRuns?.getById({
|
|
795
802
|
projectId: this.host.id,
|
|
796
803
|
id: claimed.job.payload.runId
|
|
797
804
|
});
|
|
805
|
+
if (run?.status === "queued") {
|
|
806
|
+
const retry = retryUnstartedRun(claimed.job.attempt);
|
|
807
|
+
if (retry)
|
|
808
|
+
return retry;
|
|
809
|
+
return { kind: "fail", failure: await this.failUnstartedRun(claimed, run, error) };
|
|
810
|
+
}
|
|
798
811
|
return run?.status === "failed" && run.error ? { kind: "fail", failure: run.error } : { kind: "fail" };
|
|
799
812
|
}
|
|
813
|
+
async failUnstartedRun(claimed, run, error) {
|
|
814
|
+
const failure = captureSixbFailure3(error, {
|
|
815
|
+
allowedCodes: PIPELINE_RUN_FAILURE_CODES3,
|
|
816
|
+
defaultCode: "internal.unexpected",
|
|
817
|
+
details: { pipelineId: run.pipelineId, runId: run.id }
|
|
818
|
+
});
|
|
819
|
+
await this.context.pipelineRunsStorage.finish({
|
|
820
|
+
projectId: this.host.id,
|
|
821
|
+
id: run.id,
|
|
822
|
+
status: "failed",
|
|
823
|
+
error: failure
|
|
824
|
+
});
|
|
825
|
+
reportRunFailure(this.host, error, {
|
|
826
|
+
projectId: this.host.id,
|
|
827
|
+
attempt: claimed.job.attempt,
|
|
828
|
+
runKind: "pipeline",
|
|
829
|
+
run: { runId: run.id, pipelineId: run.pipelineId },
|
|
830
|
+
failure
|
|
831
|
+
});
|
|
832
|
+
return failure;
|
|
833
|
+
}
|
|
800
834
|
async onAbortError(claimed, _error) {
|
|
801
835
|
const run = await this.host.storage.pipelineRuns?.getById({
|
|
802
836
|
projectId: this.host.id,
|
|
@@ -833,4 +867,4 @@ export {
|
|
|
833
867
|
PipelineWorker
|
|
834
868
|
};
|
|
835
869
|
|
|
836
|
-
//# debugId=
|
|
870
|
+
//# debugId=93F85C427BD82A2064756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/worker.ts", "../src/events.ts", "../src/run-pipeline-job.ts", "../src/errors.ts", "../src/run-step.ts", "../src/execute-run-step.ts", "../src/step-inputs.ts", "../src/execute-sql-step.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { reportRunFailure } from \"@sixb/core/internal/error-reporting\"\nimport { bindDurablePrimitiveExecution } from \"@sixb/core/internal/primitive-execution\"\nimport type { QueueWorkerFailureDecision } from \"@sixb/core/internal/workers\"\nimport { QueueWorker } from \"@sixb/core/internal/workers\"\nimport type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from \"@sixb/core/queues\"\nimport {
|
|
6
|
-
"import type { DomainEventLog } from \"@sixb/core\"\nimport type {\n PipelineRunRecord,\n PipelineRunStatus,\n PipelineStepRunRecord,\n} from \"@sixb/core/storage\"\nimport type { PipelineJob, PipelineStepLifecycleContext, PipelineStepRunResult } from \"./types\"\n\nconst SOURCE = \"SixbPipelineWorker\"\n\nexport async function emitPipelineRunStarted(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"startedAt\">,\n correlationId: string\n): Promise<void> {\n if (!run.startedAt) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${run.id}' started without a timestamp.`)\n }\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.started\",\n payload: {\n pipelineId: run.pipelineId,\n runId: run.id,\n startedAt: run.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepStarted(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n \"id\" | \"pipelineRunId\" | \"pipelineId\" | \"stepId\" | \"datasetId\" | \"startedAt\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.started\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n startedAt: step.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepFinished(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n | \"id\"\n | \"pipelineRunId\"\n | \"pipelineId\"\n | \"stepId\"\n | \"datasetId\"\n | \"status\"\n | \"finishedAt\"\n | \"output\"\n | \"rowsWritten\"\n | \"error\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.finished\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n status: requireTerminalStatus(step.status, `Pipeline step run '${step.id}'`),\n finishedAt: requireFinishedAt(step.id, step.finishedAt).toISOString(),\n ...(step.output ? { versionId: step.output.versionId } : {}),\n ...(step.rowsWritten !== undefined ? { rowsWritten: step.rowsWritten } : {}),\n ...(step.error ? { error: step.error } : {}),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitDatasetVersionCommitted(\n events: DomainEventLog | undefined,\n job: PipelineJob,\n step: PipelineStepRunResult,\n correlationId: string\n): Promise<void> {\n if (!step.versionCreated) return\n\n // Emit step outputs immediately so dataset event schedules can react before later steps finish.\n await events?.emit(\n {\n events: [\n {\n type: \"dataset.version.committed\" as const,\n payload: {\n datasetId: step.version.datasetId,\n versionId: step.version.versionId,\n createdAt: step.version.createdAt.toISOString(),\n producer: {\n kind: \"pipeline\" as const,\n id: job.pipelineId,\n runId: job.id,\n stepId: step.run.stepId,\n },\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunFinished(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [{ type: \"pipeline.run.finished\", payload: buildPipelineRunFinishedPayload(run) }],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nfunction buildPipelineRunFinishedPayload(\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">\n) {\n return {\n pipelineId: run.pipelineId,\n runId: run.id,\n status: requireTerminalStatus(run.status, `Pipeline run '${run.id}'`),\n ...(run.output\n ? {\n datasetId: run.output.datasetId,\n versionId: run.output.versionId,\n }\n : {}),\n ...(run.error ? { error: run.error } : {}),\n }\n}\n\nfunction requireFinishedAt(stepRunId: string, finishedAt: Date | undefined): Date {\n if (finishedAt) {\n return finishedAt\n }\n\n throw new Error(`[SixbPipelineWorker] Pipeline step run '${stepRunId}' has no finishedAt.`)\n}\n\nfunction requireTerminalStatus(\n status: PipelineRunStatus,\n context: string\n): Exclude<PipelineRunStatus, \"queued\" | \"running\"> {\n if (status === \"queued\" || status === \"running\") {\n throw new Error(`[SixbPipelineWorker] ${context} is still running.`)\n }\n\n return status\n}\n",
|
|
7
|
-
"import { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { resolveLoggingService } from \"@sixb/core/internal/logging\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineBookkeepingError,\n requireFinishedAt,\n requirePipeline,\n statusForFailure,\n throwIfAborted,\n unwrapPipelineStepFailure,\n} from \"./errors\"\nimport { runStep } from \"./run-step\"\nimport type {\n PipelineRunFinishedHandler,\n PipelineRunResult,\n PipelineStepRunResult,\n RunPipelineJobInput,\n} from \"./types\"\n\nexport class PipelineRunAlreadyStartedError extends Error {\n override readonly name = \"PipelineRunAlreadyStartedError\"\n\n constructor(readonly run: PipelineRunRecord) {\n super(`[SixbPipelineWorker] Pipeline run '${run.id}' has already started.`)\n }\n}\n\nexport async function runPipelineJob(input: RunPipelineJobInput): Promise<PipelineRunResult> {\n const { runtime, run: durableRun } = input\n const job = { id: durableRun.id, pipelineId: durableRun.pipelineId }\n const signal = input.signal ?? new AbortController().signal\n if (durableRun.projectId !== runtime.id) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${durableRun.id}' belongs to project '${durableRun.projectId}', not '${runtime.id}'.`\n )\n }\n const logSession = resolveLoggingService(runtime.id, runtime.logging).startExecution({\n kind: \"pipeline\",\n id: job.id,\n })\n const steps: PipelineStepRunResult[] = []\n let startedRun: PipelineRunRecord | undefined\n let finalVersion: DatasetVersion | undefined\n let finished = false\n\n throwIfAborted(signal)\n\n try {\n try {\n startedRun = await runtime.pipelineRunsStorage.start({\n projectId: runtime.id,\n id: job.id,\n })\n } catch (error) {\n const existing = await runtime.pipelineRunsStorage.getById({\n projectId: runtime.id,\n id: job.id,\n })\n if (\n existing?.pipelineId === durableRun.pipelineId &&\n existing.executionId === durableRun.executionId\n ) {\n throw new PipelineRunAlreadyStartedError(existing)\n }\n throw error\n }\n await input.onRunStarted?.(startedRun)\n\n const pipeline = requirePipeline(runtime.pipelines.getById(job.pipelineId), job)\n\n for (const [stepIndex, node] of pipeline.graph.nodes.entries()) {\n const stepResult = await runStep({\n runtime,\n pipeline,\n step: node.step,\n stepIndex,\n job,\n signal,\n logSession,\n onStepStarted: input.onStepStarted,\n onStepFinished: input.onStepFinished,\n })\n\n steps.push(stepResult)\n finalVersion = stepResult.version\n // This is the durability boundary for per-step output events.\n await input.onStepCommitted?.(stepResult)\n }\n\n let run: PipelineRunRecord\n try {\n run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status: \"succeeded\",\n output: finalVersion\n ? {\n datasetId: finalVersion.datasetId,\n versionId: finalVersion.versionId,\n }\n : undefined,\n })\n } catch (error) {\n if (finalVersion) {\n throw createPipelineBookkeepingError({\n pipelineId: pipeline.id,\n runId: job.id,\n version: finalVersion,\n cause: error,\n })\n }\n throw error\n }\n const finishedRun = {\n ...run,\n finishedAt: requireFinishedAt({\n pipelineId: pipeline.id,\n runId: job.id,\n finishedAt: run.finishedAt,\n }),\n }\n\n finished = true\n await notifyRunFinished(input.onRunFinished, finishedRun)\n return {\n run: finishedRun,\n steps,\n version: finalVersion,\n }\n } catch (error) {\n const reportedError = unwrapPipelineStepFailure(error)\n if (startedRun && !finished) {\n const status = statusForFailure(signal, error)\n try {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: { pipelineId: durableRun.pipelineId, runId: job.id },\n })\n const run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status,\n error: failure,\n })\n if (status === \"failed\" && run.status === \"failed\") {\n input.onRunFailed?.(reportedError, run, failure)\n }\n await notifyRunFinished(input.onRunFinished, run)\n } catch {\n // The run did not transition to the requested terminal status.\n }\n }\n\n throw reportedError\n } finally {\n await logSession.flush()\n }\n}\n\nasync function notifyRunFinished(\n handler: PipelineRunFinishedHandler | undefined,\n run: PipelineRunRecord\n): Promise<void> {\n try {\n await handler?.(run)\n } catch (error) {\n // The built-in event log reports lost batches itself. Anything reaching here is a broken\n // invariant in a custom lifecycle handler and must not change an already durable outcome.\n console.error(\"[SixbPipelineWorker] Pipeline run lifecycle handler failed:\", error)\n }\n}\n",
|
|
5
|
+
"import type { SixbFailure } from \"@sixb/core\"\nimport { reportRunFailure } from \"@sixb/core/internal/error-reporting\"\nimport { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { bindDurablePrimitiveExecution } from \"@sixb/core/internal/primitive-execution\"\nimport type { QueueWorkerFailureDecision } from \"@sixb/core/internal/workers\"\nimport { QueueWorker, retryUnstartedRun } from \"@sixb/core/internal/workers\"\nimport type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from \"@sixb/core/queues\"\nimport {\n PIPELINE_RUN_FAILURE_CODES,\n type PipelineRunFailureCode,\n type PipelineRunRecord,\n type PipelineRunStorage,\n} from \"@sixb/core/storage\"\nimport {\n emitDatasetVersionCommitted,\n emitPipelineRunFinished,\n emitPipelineRunStarted,\n emitPipelineRunStepFinished,\n emitPipelineRunStepStarted,\n} from \"./events\"\nimport { PipelineRunAlreadyStartedError, runPipelineJob } from \"./run-pipeline-job\"\nimport type { PipelineJob, PipelineWorkerContext, PipelineWorkerHost } from \"./types\"\n\nexport interface PipelineWorkerOptions {\n /** Maximum pipeline run jobs this worker claims and executes at once. Defaults to 1. */\n readonly concurrency?: number\n}\n\nexport class PipelineWorker extends QueueWorker<\n PipelineRunRequestedQueueJob,\n typeof PIPELINE_RUN_FAILURE_CODES\n> {\n private readonly context: PipelineWorkerContext\n private readonly host: PipelineWorkerHost\n\n constructor(host: PipelineWorkerHost, options: PipelineWorkerOptions = {}) {\n if (host.definitions.pipelines.list().length === 0) {\n throw new Error(\"[SixbPipelineWorker] No pipeline definitions are registered.\")\n }\n\n const pipelineRunsStorage = host.storage.pipelineRuns\n if (!pipelineRunsStorage) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n\n super({\n projectId: host.id,\n queue: host.queues.pipelines,\n failureCodes: PIPELINE_RUN_FAILURE_CODES,\n workerId: `pipeline-worker-${host.id}`,\n claimLimit: options.concurrency,\n })\n\n this.context = buildPipelineContext(host, pipelineRunsStorage)\n this.host = host\n }\n\n protected async execute(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n signal: AbortSignal\n ): Promise<void> {\n const { job } = claimed\n const pipelineRuns = this.host.storage.pipelineRuns\n if (!pipelineRuns) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n const run = await pipelineRuns.getById({ projectId: this.host.id, id: job.payload.runId })\n if (!run) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`)\n }\n\n // Each trigger that joined this run published its own job for it. Once one of them has started\n // the run, the others have nothing left to do.\n if (run.status !== \"queued\") return\n\n const durableExecution = await this.host.storage.executions.getById({\n projectId: this.host.id,\n id: run.executionId,\n })\n if (!durableExecution) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${run.id}' references missing execution '${run.executionId}'.`\n )\n }\n\n const pipelineJob: PipelineJob = {\n id: run.id,\n pipelineId: run.pipelineId,\n }\n // Pipeline steps currently use host-owned lake and run storage directly. Binding still happens\n // here so the durable execution and its trusted primitive authority are validated before work.\n bindDurablePrimitiveExecution(this.host, {\n execution: durableExecution,\n primitive: { kind: \"pipeline\", id: run.pipelineId, runId: run.id },\n })\n\n try {\n await runPipelineJob({\n runtime: this.context,\n run,\n signal,\n onRunStarted: (run) =>\n emitPipelineRunStarted(this.host.events, run, durableExecution.correlationId),\n onRunFinished: (run) =>\n emitPipelineRunFinished(this.host.events, run, durableExecution.correlationId),\n onRunFailed: (error, run, failure) => {\n reportRunFailure(this.host, error, {\n projectId: this.host.id,\n attempt: job.attempt,\n runKind: \"pipeline\",\n run: {\n runId: run.id,\n pipelineId: run.pipelineId,\n },\n failure,\n })\n },\n onStepStarted: (step, context) =>\n emitPipelineRunStepStarted(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepFinished: (step, context) =>\n emitPipelineRunStepFinished(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepCommitted: (step) =>\n emitDatasetVersionCommitted(\n this.host.events,\n pipelineJob,\n step,\n durableExecution.correlationId\n ),\n })\n } catch (error) {\n if (error instanceof PipelineRunAlreadyStartedError) return\n throw error\n }\n }\n\n protected override async onExecutionError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n // Pipeline runs are not all-or-nothing in V1. A previous step may have committed an append\n // output, so a job that failed after starting its run must not be retried automatically.\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n if (run?.status === \"queued\") {\n const retry = retryUnstartedRun(claimed.job.attempt)\n if (retry) return retry\n\n return { kind: \"fail\", failure: await this.failUnstartedRun(claimed, run, error) }\n }\n\n return run?.status === \"failed\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n\n /**\n * Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends\n * before starting it must not stay queued: every later trigger would wait on it forever.\n */\n private async failUnstartedRun(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n run: PipelineRunRecord,\n error: unknown\n ): Promise<SixbFailure<PipelineRunFailureCode>> {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: \"internal.unexpected\",\n details: { pipelineId: run.pipelineId, runId: run.id },\n })\n\n await this.context.pipelineRunsStorage.finish({\n projectId: this.host.id,\n id: run.id,\n status: \"failed\",\n error: failure,\n })\n\n reportRunFailure(this.host, error, {\n projectId: this.host.id,\n attempt: claimed.job.attempt,\n runKind: \"pipeline\",\n run: { runId: run.id, pipelineId: run.pipelineId },\n failure,\n })\n return failure\n }\n\n protected override async onAbortError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n _error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n if (!run) return { kind: \"fail\" }\n\n if (!(await hasCommittedStep(this.context, run.id))) {\n return { kind: \"retry\" }\n }\n\n // After a step commit, rerunning the whole pipeline could duplicate append outputs.\n return run.status === \"cancelled\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n}\n\nfunction buildPipelineContext(\n host: PipelineWorkerHost,\n pipelineRunsStorage: PipelineRunStorage\n): PipelineWorkerContext {\n return {\n id: host.id,\n pipelineRunsStorage,\n lakeStorage: host.lakeStorage,\n logging: host.logging,\n pipelines: host.definitions.pipelines,\n datasets: host.definitions.datasets,\n }\n}\n\nasync function hasCommittedStep(\n context: PipelineWorkerContext,\n pipelineRunId: string\n): Promise<boolean> {\n const result = await context.pipelineRunsStorage.listSteps({\n projectId: context.id,\n pipelineRunId,\n statuses: [\"succeeded\"],\n limit: 1,\n })\n\n return result.steps.some((step) => Boolean(step.output))\n}\n",
|
|
6
|
+
"import type { DomainEventLog } from \"@sixb/core\"\nimport type {\n PipelineRunRecord,\n PipelineRunStatus,\n PipelineStepRunRecord,\n} from \"@sixb/core/storage\"\nimport type { PipelineJob, PipelineStepLifecycleContext, PipelineStepRunResult } from \"./types\"\n\nconst SOURCE = \"SixbPipelineWorker\"\n\nexport async function emitPipelineRunStarted(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"startedAt\">,\n correlationId: string\n): Promise<void> {\n if (!run.startedAt) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${run.id}' started without a timestamp.`)\n }\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.started\",\n payload: {\n pipelineId: run.pipelineId,\n runId: run.id,\n startedAt: run.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepStarted(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n \"id\" | \"pipelineRunId\" | \"pipelineId\" | \"stepId\" | \"datasetId\" | \"startedAt\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.started\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n startedAt: step.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepFinished(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n | \"id\"\n | \"pipelineRunId\"\n | \"pipelineId\"\n | \"stepId\"\n | \"datasetId\"\n | \"status\"\n | \"finishedAt\"\n | \"output\"\n | \"rowsWritten\"\n | \"error\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.finished\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n status: requireTerminalStatus(step.status, `Pipeline step run '${step.id}'`),\n finishedAt: requireFinishedAt(step.id, step.finishedAt).toISOString(),\n ...(step.output ? { versionId: step.output.versionId } : {}),\n ...(step.rowsWritten !== undefined ? { rowsWritten: step.rowsWritten } : {}),\n ...(step.error ? { error: step.error } : {}),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitDatasetVersionCommitted(\n events: DomainEventLog | undefined,\n job: PipelineJob,\n step: PipelineStepRunResult,\n correlationId: string\n): Promise<void> {\n if (!step.versionCreated) return\n\n // Emit step outputs immediately so dataset event schedules can react before later steps finish.\n await events?.emit(\n {\n events: [\n {\n type: \"dataset.version.committed\" as const,\n payload: {\n datasetId: step.version.datasetId,\n versionId: step.version.versionId,\n createdAt: step.version.createdAt.toISOString(),\n producer: {\n kind: \"pipeline\" as const,\n id: job.pipelineId,\n runId: job.id,\n stepId: step.run.stepId,\n },\n rowsChanged: step.version.rowsChanged,\n lineageChanged: step.version.lineageChanged,\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunFinished(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [{ type: \"pipeline.run.finished\", payload: buildPipelineRunFinishedPayload(run) }],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nfunction buildPipelineRunFinishedPayload(\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">\n) {\n return {\n pipelineId: run.pipelineId,\n runId: run.id,\n status: requireTerminalStatus(run.status, `Pipeline run '${run.id}'`),\n ...(run.output\n ? {\n datasetId: run.output.datasetId,\n versionId: run.output.versionId,\n }\n : {}),\n ...(run.error ? { error: run.error } : {}),\n }\n}\n\nfunction requireFinishedAt(stepRunId: string, finishedAt: Date | undefined): Date {\n if (finishedAt) {\n return finishedAt\n }\n\n throw new Error(`[SixbPipelineWorker] Pipeline step run '${stepRunId}' has no finishedAt.`)\n}\n\nfunction requireTerminalStatus(\n status: PipelineRunStatus,\n context: string\n): Exclude<PipelineRunStatus, \"queued\" | \"running\"> {\n if (status === \"queued\" || status === \"running\") {\n throw new Error(`[SixbPipelineWorker] ${context} is still running.`)\n }\n\n return status\n}\n",
|
|
7
|
+
"import { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { resolveLoggingService } from \"@sixb/core/internal/logging\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineBookkeepingError,\n requireFinishedAt,\n requirePipeline,\n statusForFailure,\n throwIfAborted,\n unwrapPipelineStepFailure,\n} from \"./errors\"\nimport { runStep } from \"./run-step\"\nimport type {\n PipelineRunFinishedHandler,\n PipelineRunResult,\n PipelineStepRunResult,\n RunPipelineJobInput,\n} from \"./types\"\n\nexport class PipelineRunAlreadyStartedError extends Error {\n override readonly name = \"PipelineRunAlreadyStartedError\"\n\n constructor(readonly run: PipelineRunRecord) {\n super(`[SixbPipelineWorker] Pipeline run '${run.id}' has already started.`)\n }\n}\n\nexport async function runPipelineJob(input: RunPipelineJobInput): Promise<PipelineRunResult> {\n const { runtime, run: durableRun } = input\n const job = { id: durableRun.id, pipelineId: durableRun.pipelineId }\n const signal = input.signal ?? new AbortController().signal\n if (durableRun.projectId !== runtime.id) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${durableRun.id}' belongs to project '${durableRun.projectId}', not '${runtime.id}'.`\n )\n }\n const logSession = resolveLoggingService(runtime.id, runtime.logging).startExecution({\n kind: \"pipeline\",\n id: job.id,\n })\n const steps: PipelineStepRunResult[] = []\n let startedRun: PipelineRunRecord | undefined\n let finalVersion: DatasetVersion | undefined\n let finished = false\n\n throwIfAborted(signal)\n\n try {\n try {\n startedRun = await runtime.pipelineRunsStorage.start({\n projectId: runtime.id,\n id: job.id,\n })\n } catch (error) {\n const existing = await runtime.pipelineRunsStorage.getById({\n projectId: runtime.id,\n id: job.id,\n })\n // A run still queued did not start elsewhere: the start itself failed.\n if (\n existing?.pipelineId === durableRun.pipelineId &&\n existing.executionId === durableRun.executionId &&\n existing.status !== \"queued\"\n ) {\n throw new PipelineRunAlreadyStartedError(existing)\n }\n throw error\n }\n await input.onRunStarted?.(startedRun)\n\n const pipeline = requirePipeline(runtime.pipelines.getById(job.pipelineId), job)\n\n for (const [stepIndex, node] of pipeline.graph.nodes.entries()) {\n const stepResult = await runStep({\n runtime,\n pipeline,\n step: node.step,\n stepIndex,\n job,\n signal,\n logSession,\n onStepStarted: input.onStepStarted,\n onStepFinished: input.onStepFinished,\n })\n\n steps.push(stepResult)\n finalVersion = stepResult.version\n // This is the durability boundary for per-step output events.\n await input.onStepCommitted?.(stepResult)\n }\n\n let run: PipelineRunRecord\n try {\n run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status: \"succeeded\",\n output: finalVersion\n ? {\n datasetId: finalVersion.datasetId,\n versionId: finalVersion.versionId,\n }\n : undefined,\n })\n } catch (error) {\n if (finalVersion) {\n throw createPipelineBookkeepingError({\n pipelineId: pipeline.id,\n runId: job.id,\n version: finalVersion,\n cause: error,\n })\n }\n throw error\n }\n const finishedRun = {\n ...run,\n finishedAt: requireFinishedAt({\n pipelineId: pipeline.id,\n runId: job.id,\n finishedAt: run.finishedAt,\n }),\n }\n\n finished = true\n await notifyRunFinished(input.onRunFinished, finishedRun)\n return {\n run: finishedRun,\n steps,\n version: finalVersion,\n }\n } catch (error) {\n const reportedError = unwrapPipelineStepFailure(error)\n if (startedRun && !finished) {\n const status = statusForFailure(signal, error)\n try {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: { pipelineId: durableRun.pipelineId, runId: job.id },\n })\n const run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status,\n error: failure,\n })\n if (status === \"failed\" && run.status === \"failed\") {\n input.onRunFailed?.(reportedError, run, failure)\n }\n await notifyRunFinished(input.onRunFinished, run)\n } catch {\n // The run did not transition to the requested terminal status.\n }\n }\n\n throw reportedError\n } finally {\n await logSession.flush()\n }\n}\n\nasync function notifyRunFinished(\n handler: PipelineRunFinishedHandler | undefined,\n run: PipelineRunRecord\n): Promise<void> {\n try {\n await handler?.(run)\n } catch (error) {\n // The built-in event log reports lost batches itself. Anything reaching here is a broken\n // invariant in a custom lifecycle handler and must not change an already durable outcome.\n console.error(\"[SixbPipelineWorker] Pipeline run lifecycle handler failed:\", error)\n }\n}\n",
|
|
8
8
|
"import type { DatasetDefinition, PipelineDefinition } from \"@sixb/core\"\nimport { createSixbError, isSixbError, summarizeErrorMessage } from \"@sixb/core/internal/errors\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport type { PipelineRunStatus } from \"@sixb/core/storage\"\nimport type { PipelineJob } from \"./types\"\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw createAbortError()\n }\n}\n\nexport function statusForFailure(\n signal: AbortSignal,\n error: unknown\n): Extract<PipelineRunStatus, \"failed\" | \"cancelled\"> {\n return signal.aborted || isAbortError(error) ? \"cancelled\" : \"failed\"\n}\n\nexport function requireFinishedAt(input: {\n readonly pipelineId: string\n readonly runId: string\n readonly finishedAt: Date | undefined\n}): Date {\n if (input.finishedAt) {\n return input.finishedAt\n }\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline run '${input.runId}' finished without a finishedAt timestamp.`,\n { details: { pipelineId: input.pipelineId, runId: input.runId } }\n )\n}\n\nexport function createStepBookkeepingError(options: {\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly stepRunId: string\n readonly version: DatasetVersion\n readonly cause: unknown\n}): Error {\n // The dataset version is already durable; retrying the whole pipeline could duplicate appends.\n return createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' step '${options.stepId}' committed dataset version '${options.version.versionId}', but failed to finalize step run '${options.stepRunId}'. The dataset commit may already have succeeded and the step run record may need repair.`,\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n stepRunId: options.stepRunId,\n datasetId: options.version.datasetId,\n versionId: options.version.versionId,\n },\n }\n )\n}\n\nexport function createPipelineStepFailure(options: {\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly stepRunId?: string\n readonly cause: unknown\n}) {\n return createSixbError(\n \"pipeline.step_failed\",\n summarizeErrorMessage(options.cause, \"Pipeline step execution failed.\"),\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n ...(options.stepRunId ? { stepRunId: options.stepRunId } : {}),\n },\n }\n )\n}\n\nexport function unwrapPipelineStepFailure(error: unknown): unknown {\n return isSixbError(error) && error.code === \"pipeline.step_failed\" && error.cause !== undefined\n ? error.cause\n : error\n}\n\nexport function createPipelineBookkeepingError(options: {\n readonly pipelineId: string\n readonly runId: string\n readonly version: DatasetVersion\n readonly cause: unknown\n}): Error {\n return createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' committed final dataset version '${options.version.versionId}', but failed to finalize pipeline run '${options.runId}'. The dataset commit may already have succeeded and the pipeline run record may need repair.`,\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n runId: options.runId,\n datasetId: options.version.datasetId,\n versionId: options.version.versionId,\n },\n }\n )\n}\n\nexport function requirePipeline(\n pipeline: PipelineDefinition | null,\n job: PipelineJob\n): PipelineDefinition {\n if (!pipeline) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Unknown pipeline '${job.pipelineId}'.`,\n { details: { pipelineId: job.pipelineId, runId: job.id } }\n )\n }\n\n return pipeline\n}\n\nexport function requireRegisteredDataset(options: {\n readonly dataset: DatasetDefinition | null\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly role: \"input\" | \"output\"\n readonly name?: string\n readonly datasetId: string\n}): DatasetDefinition {\n if (options.dataset) {\n return options.dataset\n }\n\n const namedRole = options.role === \"input\" ? `input '${options.name ?? \"unknown\"}'` : \"output\"\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' step '${options.stepId}' ${namedRole} references unknown dataset '${options.datasetId}'.`,\n {\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n datasetId: options.datasetId,\n },\n }\n )\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"Worker runtime aborted.\")\n error.name = \"AbortError\"\n return error\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\"\n}\n",
|
|
9
9
|
"import type { DatasetDefinition, PipelineDefinition, PipelineStepDefinition } from \"@sixb/core\"\nimport { lakeDatasetDefinition } from \"@sixb/core/internal/datasets\"\nimport { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineStepRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineStepFailure,\n createStepBookkeepingError,\n requireRegisteredDataset,\n statusForFailure,\n throwIfAborted,\n} from \"./errors\"\nimport { executeRunStep } from \"./execute-run-step\"\nimport { executeSqlStep } from \"./execute-sql-step\"\nimport { type ResolvedStepInput, resolveStepInputs } from \"./step-inputs\"\nimport type {\n PipelineJob,\n PipelineLogSession,\n PipelineStepFinishedHandler,\n PipelineStepRunResult,\n PipelineStepStartedHandler,\n PipelineWorkerContext,\n} from \"./types\"\n\ntype StepExecutionResult = {\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten?: number\n}\n\nexport async function runStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly stepIndex: number\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly onStepStarted?: PipelineStepStartedHandler\n readonly onStepFinished?: PipelineStepFinishedHandler\n}): Promise<PipelineStepRunResult> {\n const { runtime, pipeline, step, stepIndex, job, signal } = input\n const lifecycleContext = {\n stepIndex,\n totalSteps: pipeline.graph.nodes.length,\n }\n\n throwIfAborted(signal)\n let resolvedInputs: readonly ResolvedStepInput[]\n let outputDataset: DatasetDefinition\n let expectedLatestVersionId: string | null\n try {\n outputDataset = lakeDatasetDefinition(\n requireRegisteredDataset({\n dataset: runtime.datasets.getById(step.output.id),\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n role: \"output\",\n datasetId: step.output.id,\n })\n )\n\n await runtime.lakeStorage.createDataset(outputDataset)\n // Capture the output guard before any input is pinned. A later capture could legitimize\n // overwriting a concurrent run with results computed from older inputs.\n expectedLatestVersionId =\n (await runtime.lakeStorage.getLatestVersion(outputDataset.id))?.versionId ?? null\n resolvedInputs = await resolveStepInputs({\n runtime,\n pipeline,\n step,\n pipelineRunId: job.id,\n })\n } catch (error) {\n if (statusForFailure(signal, error) === \"failed\") {\n throw createPipelineStepFailure({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n cause: error,\n })\n }\n throw error\n }\n const inputRefs = resolvedInputs.map((resolved) => resolved.ref)\n\n const stepRunId = `${job.id}:step:${stepIndex + 1}:${step.id}`\n const startedStepRun = await runtime.pipelineRunsStorage.startStep({\n projectId: runtime.id,\n id: stepRunId,\n pipelineRunId: job.id,\n pipelineId: pipeline.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n mode: step.mode,\n inputs: inputRefs,\n })\n await input.onStepStarted?.(startedStepRun, lifecycleContext)\n\n let committedVersion: DatasetVersion | undefined\n let rowsWritten: number | undefined\n\n try {\n const execution = await executeStep({\n runtime,\n pipeline,\n step,\n job,\n signal,\n logSession: input.logSession,\n outputDataset,\n expectedLatestVersionId,\n resolvedInputs,\n })\n committedVersion = execution.version\n rowsWritten = execution.rowsWritten\n\n let stepRun: PipelineStepRunRecord\n try {\n stepRun = await runtime.pipelineRunsStorage.finishStep({\n projectId: runtime.id,\n id: stepRunId,\n status: \"succeeded\",\n output: {\n datasetId: committedVersion.datasetId,\n versionId: committedVersion.versionId,\n },\n rowsWritten,\n })\n } catch (error) {\n throw createStepBookkeepingError({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n version: committedVersion,\n cause: error,\n })\n }\n await input.onStepFinished?.(stepRun, lifecycleContext)\n\n return {\n run: stepRun,\n version: committedVersion,\n versionCreated: execution.versionCreated,\n }\n } catch (error) {\n if (!committedVersion) {\n const status = statusForFailure(signal, error)\n const failureError =\n status === \"failed\"\n ? createPipelineStepFailure({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n cause: error,\n })\n : error\n const failedStepRun = await runtime.pipelineRunsStorage\n .finishStep({\n projectId: runtime.id,\n id: stepRunId,\n status,\n rowsWritten,\n error: captureSixbFailure(failureError, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n },\n }),\n })\n .catch(() => null)\n\n if (failedStepRun) {\n await input.onStepFinished?.(failedStepRun, lifecycleContext)\n }\n\n throw failureError\n }\n\n throw error\n }\n}\n\nasync function executeStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<StepExecutionResult> {\n switch (input.step.executor.kind) {\n case \"run\":\n return executeRunStep(input)\n case \"sql\":\n return executeSqlStep(input)\n }\n}\n",
|
|
10
10
|
"import type {\n DatasetDefinition,\n DatasetRow,\n PipelineDefinition,\n PipelineStepDefinition,\n PipelineStepRunContext,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport { runStepLineage } from \"@sixb/core/internal/pipelines\"\nimport { type DatasetVersion, resolveStepLineage } from \"@sixb/core/lake-storage\"\nimport { throwIfAborted } from \"./errors\"\nimport { createStepInputs, type ResolvedStepInput } from \"./step-inputs\"\nimport type { PipelineJob, PipelineLogSession, PipelineWorkerContext } from \"./types\"\n\nexport async function executeRunStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<{\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten: number\n}> {\n const { runtime, pipeline, step, job, signal, outputDataset, resolvedInputs } = input\n\n if (step.executor.kind !== \"run\") {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' uses SQL execution, which is not supported by the run step executor.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n const logger = input.logSession.withContext({ stepId: step.id })\n let rowsWritten = 0\n const write = await runtime.lakeStorage.beginWrite({\n dataset: outputDataset,\n mode: step.mode,\n inputs: resolvedInputs.map((resolved) => resolved.ref),\n producer: { kind: \"pipeline\", id: pipeline.id, runId: job.id, stepId: step.id },\n // Through every upstream hop: each column the step reads stands for what its input version\n // records. The output is the only registered dataset the step's own lineage reads.\n lineage: resolveStepLineage(\n runStepLineage(step, new Map([[outputDataset.id, outputDataset]])),\n resolvedInputs.map((resolved) => resolved.version)\n ),\n })\n\n try {\n const context: PipelineStepRunContext = {\n projectId: runtime.id,\n pipelineId: pipeline.id,\n stepId: step.id,\n runId: job.id,\n signal,\n logger,\n inputs: createStepInputs({\n lakeStorage: runtime.lakeStorage,\n pipeline,\n step,\n resolvedInputs,\n signal,\n }),\n output: {\n async writeRows(rows) {\n await write.writeRows(\n countRowsWritten(rows, signal, () => {\n rowsWritten += 1\n })\n )\n },\n },\n }\n\n await step.executor.handler(context)\n throwIfAborted(signal)\n\n const commit = await write.commit({\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: `pipeline ${pipeline.id} step ${step.id} run ${job.id}`,\n })\n const { outcome, ...version } = commit\n\n return {\n version,\n versionCreated: outcome === \"created\",\n rowsWritten,\n }\n } catch (error) {\n await write.abort().catch(() => {})\n throw error\n }\n}\n\nasync function* countRowsWritten(\n rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>,\n signal: AbortSignal,\n onWritten: () => void\n): AsyncIterable<DatasetRow> {\n for await (const row of rows) {\n throwIfAborted(signal)\n yield row\n onWritten()\n }\n}\n",
|
|
11
11
|
"import type {\n DatasetDefinition,\n PipelineDefinition,\n PipelineStepDefinition,\n PipelineStepInput,\n PipelineStepRunContext,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport { isDatasetPick, stepInputColumns } from \"@sixb/core/internal/pipelines\"\nimport type {\n DatasetVersion,\n DatasetVersionRef,\n ReadDatasetRowsInput,\n} from \"@sixb/core/lake-storage\"\nimport { requireRegisteredDataset } from \"./errors\"\nimport type { PipelineWorkerContext } from \"./types\"\n\nexport interface ResolvedStepInput {\n readonly name: string\n /** The registered dataset. */\n readonly dataset: DatasetDefinition\n /** Present when the step input is `dataset.pick(...)`: the step reads only those columns. */\n readonly pick?: {\n readonly dataset: DatasetDefinition\n readonly columns: readonly string[]\n }\n readonly version: DatasetVersion\n readonly ref: DatasetVersionRef\n}\n\nexport async function resolveStepInputs(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly pipelineRunId: string\n}): Promise<readonly ResolvedStepInput[]> {\n const { runtime, pipeline, step, pipelineRunId } = input\n const resolved: ResolvedStepInput[] = []\n\n for (const [name, declaredDataset] of Object.entries(step.inputs)) {\n const dataset = requireRegisteredDataset({\n dataset: runtime.datasets.getById(declaredDataset.id),\n pipelineId: pipeline.id,\n pipelineRunId,\n stepId: step.id,\n role: \"input\",\n name,\n datasetId: declaredDataset.id,\n })\n\n const version = await runtime.lakeStorage.getLatestVersion(dataset.id)\n if (!version) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' input '${name}' dataset '${dataset.id}' has no committed version.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId,\n stepId: step.id,\n datasetId: dataset.id,\n },\n }\n )\n }\n\n resolved.push({\n name,\n dataset,\n ...(isDatasetPick(declaredDataset)\n ? { pick: { dataset: declaredDataset, columns: stepInputColumns(declaredDataset) } }\n : {}),\n version,\n ref: {\n datasetId: version.datasetId,\n versionId: version.versionId,\n },\n })\n }\n\n return resolved\n}\n\nexport function createStepInputs(input: {\n readonly lakeStorage: PipelineWorkerContext[\"lakeStorage\"]\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly resolvedInputs: readonly ResolvedStepInput[]\n readonly signal: AbortSignal\n}): PipelineStepRunContext[\"inputs\"] {\n const { lakeStorage, signal } = input\n const inputs: Record<string, PipelineStepInput> = {}\n\n for (const resolved of input.resolvedInputs) {\n const subject = `[SixbPipelineWorker] Pipeline '${input.pipeline.id}' step '${input.step.id}' input '${resolved.name}'`\n const { pick } = resolved\n\n inputs[resolved.name] = {\n dataset: pick?.dataset ?? resolved.dataset,\n version: resolved.version,\n readRows(readInput: Omit<ReadDatasetRowsInput, \"datasetId\" | \"versionId\"> = {}) {\n // Step readers stay pinned even if newer versions commit while the handler runs.\n return lakeStorage.readRows({\n ...readInput,\n ...(pick && { columns: readPickedColumns(subject, pick.columns, readInput.columns) }),\n signal: readInput.signal ? AbortSignal.any([signal, readInput.signal]) : signal,\n datasetId: resolved.dataset.id,\n versionId: resolved.version.versionId,\n })\n },\n }\n }\n\n return inputs\n}\n\n/**\n * The version records that the step read only the picked columns, which keeps the markings of the\n * others out of its output. Reading another column would make that record false.\n */\nfunction readPickedColumns(\n subject: string,\n pickedColumns: readonly string[],\n requested: readonly string[] | undefined\n): readonly string[] {\n // Lake providers read every column for an empty list.\n if (requested === undefined || requested.length === 0) return pickedColumns\n\n const unpicked = requested.find((column) => !pickedColumns.includes(column))\n if (unpicked !== undefined) {\n throw new Error(\n `${subject} reads column '${unpicked}', which its pick leaves out. Add '${unpicked}' to the pick to read it.`\n )\n }\n\n return requested\n}\n",
|
|
12
12
|
"import type {\n DatasetDefinition,\n LakeStorage,\n LakeStorageWithSql,\n PipelineDefinition,\n PipelineStepDefinition,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport type {\n DatasetVersion,\n DatasetWriteMode,\n LakeSqlTransformCapabilities,\n} from \"@sixb/core/lake-storage\"\nimport { throwIfAborted } from \"./errors\"\nimport type { ResolvedStepInput } from \"./step-inputs\"\nimport type { PipelineJob, PipelineWorkerContext } from \"./types\"\n\nfunction hasSqlExecutor(lakeStorage: LakeStorage): lakeStorage is LakeStorageWithSql {\n const sql = \"sql\" in lakeStorage ? lakeStorage.sql : null\n\n return (\n typeof sql === \"object\" && sql !== null && \"execute\" in sql && typeof sql.execute === \"function\"\n )\n}\n\nfunction assertSqlModeSupported(input: {\n readonly capabilities: LakeSqlTransformCapabilities\n readonly dialect: string\n readonly mode: DatasetWriteMode\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly datasetId: string\n}): void {\n const supported =\n input.mode === \"append\"\n ? input.capabilities.supportsAppend\n : input.capabilities.supportsSnapshot\n if (supported) return\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${input.pipelineId}' step '${input.stepId}' writes in ` +\n `'${input.mode}' mode, which the ${input.dialect} SQL executor does not support.`,\n {\n details: {\n pipelineId: input.pipelineId,\n pipelineRunId: input.pipelineRunId,\n stepId: input.stepId,\n datasetId: input.datasetId,\n },\n }\n )\n}\n\nexport async function executeSqlStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<{\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten?: number\n}> {\n const { runtime, pipeline, step, job, signal, outputDataset, resolvedInputs } = input\n\n if (step.executor.kind !== \"sql\") {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' uses run execution, which is not supported by the SQL step executor.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n if (!hasSqlExecutor(runtime.lakeStorage)) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' requires SQL transform support, but lake storage does not provide lakeStorage.sql.execute(...).`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n // `LakeSqlExecutor.capabilities` is a required field on the contract that nothing read,\n // so a provider declaring `supportsAppend: false` was asked to be honest and then\n // ignored — the unsupported mode failed somewhere inside the provider instead, in\n // whatever words that provider happened to use.\n assertSqlModeSupported({\n capabilities: runtime.lakeStorage.sql.capabilities,\n dialect: runtime.lakeStorage.sql.dialect,\n mode: step.mode,\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n })\n\n throwIfAborted(signal)\n\n const commit = await runtime.lakeStorage.sql.execute({\n sources: Object.fromEntries(\n resolvedInputs.map((input) => [\n input.name,\n {\n dataset: input.dataset,\n versionId: input.version.versionId,\n ...(input.pick && { columns: input.pick.columns }),\n },\n ])\n ),\n sql: step.executor.sql,\n target: outputDataset,\n expectedLatestVersionId: input.expectedLatestVersionId,\n mode: step.mode,\n producer: {\n kind: \"pipeline\",\n id: pipeline.id,\n runId: job.id,\n stepId: step.id,\n },\n commitMessage: `pipeline ${pipeline.id} step ${step.id} run ${job.id}`,\n })\n\n throwIfAborted(signal)\n const { outcome, ...version } = commit\n\n return {\n version,\n versionCreated: outcome === \"created\",\n rowsWritten: version.rowCount,\n }\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "93F85C427BD82A2064756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-pipeline-job.d.ts","sourceRoot":"","sources":["../src/run-pipeline-job.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUvF,OAAO,KAAK,EAEV,iBAAiB,EAEjB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,qBAAa,8BAA+B,SAAQ,KAAK;IAG3C,QAAQ,CAAC,GAAG,EAAE,iBAAiB;IAF3C,SAAkB,IAAI,oCAAmC;gBAEpC,GAAG,EAAE,iBAAiB;CAG5C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"run-pipeline-job.d.ts","sourceRoot":"","sources":["../src/run-pipeline-job.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUvF,OAAO,KAAK,EAEV,iBAAiB,EAEjB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,qBAAa,8BAA+B,SAAQ,KAAK;IAG3C,QAAQ,CAAC,GAAG,EAAE,iBAAiB;IAF3C,SAAkB,IAAI,oCAAmC;gBAEpC,GAAG,EAAE,iBAAiB;CAG5C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqI3F"}
|
package/dist/worker.d.ts
CHANGED
|
@@ -12,7 +12,12 @@ export declare class PipelineWorker extends QueueWorker<PipelineRunRequestedQueu
|
|
|
12
12
|
private readonly host;
|
|
13
13
|
constructor(host: PipelineWorkerHost, options?: PipelineWorkerOptions);
|
|
14
14
|
protected execute(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, signal: AbortSignal): Promise<void>;
|
|
15
|
-
protected onExecutionError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
|
|
15
|
+
protected onExecutionError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, error: unknown): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>>;
|
|
16
|
+
/**
|
|
17
|
+
* Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends
|
|
18
|
+
* before starting it must not stay queued: every later trigger would wait on it forever.
|
|
19
|
+
*/
|
|
20
|
+
private failUnstartedRun;
|
|
16
21
|
protected onAbortError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, _error: unknown): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>>;
|
|
17
22
|
}
|
|
18
23
|
//# sourceMappingURL=worker.d.ts.map
|
package/dist/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,WAAW,EAAqB,MAAM,6BAA6B,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EACL,0BAA0B,EAI3B,MAAM,oBAAoB,CAAA;AAS3B,OAAO,KAAK,EAAsC,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,qBAAa,cAAe,SAAQ,WAAW,CAC7C,4BAA4B,EAC5B,OAAO,0BAA0B,CAClC;IACC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;gBAE7B,IAAI,EAAE,kBAAkB,EAAE,OAAO,GAAE,qBAA0B;cAsBzD,OAAO,CACrB,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC;cAqFS,gBAAgB,CACvC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAmBnF;;;OAGG;YACW,gBAAgB;cA4BL,YAAY,CACnC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAgBpF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sixb/pipeline-worker",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Worker that runs Sixb pipelines",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sixb",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"prepack": "bun run build"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@sixb/core": "0.2.
|
|
38
|
+
"@sixb/core": "0.2.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@sixb/core": "0.2.
|
|
41
|
+
"@sixb/core": "0.2.2",
|
|
42
42
|
"@types/bun": "latest",
|
|
43
43
|
"typescript": "^5.7.0"
|
|
44
44
|
},
|
package/src/events.ts
CHANGED
package/src/run-pipeline-job.ts
CHANGED
|
@@ -57,9 +57,11 @@ export async function runPipelineJob(input: RunPipelineJobInput): Promise<Pipeli
|
|
|
57
57
|
projectId: runtime.id,
|
|
58
58
|
id: job.id,
|
|
59
59
|
})
|
|
60
|
+
// A run still queued did not start elsewhere: the start itself failed.
|
|
60
61
|
if (
|
|
61
62
|
existing?.pipelineId === durableRun.pipelineId &&
|
|
62
|
-
existing.executionId === durableRun.executionId
|
|
63
|
+
existing.executionId === durableRun.executionId &&
|
|
64
|
+
existing.status !== "queued"
|
|
63
65
|
) {
|
|
64
66
|
throw new PipelineRunAlreadyStartedError(existing)
|
|
65
67
|
}
|
package/src/worker.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import type { SixbFailure } from "@sixb/core"
|
|
1
2
|
import { reportRunFailure } from "@sixb/core/internal/error-reporting"
|
|
3
|
+
import { captureSixbFailure } from "@sixb/core/internal/errors"
|
|
2
4
|
import { bindDurablePrimitiveExecution } from "@sixb/core/internal/primitive-execution"
|
|
3
5
|
import type { QueueWorkerFailureDecision } from "@sixb/core/internal/workers"
|
|
4
|
-
import { QueueWorker } from "@sixb/core/internal/workers"
|
|
6
|
+
import { QueueWorker, retryUnstartedRun } from "@sixb/core/internal/workers"
|
|
5
7
|
import type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from "@sixb/core/queues"
|
|
6
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
PIPELINE_RUN_FAILURE_CODES,
|
|
10
|
+
type PipelineRunFailureCode,
|
|
11
|
+
type PipelineRunRecord,
|
|
12
|
+
type PipelineRunStorage,
|
|
13
|
+
} from "@sixb/core/storage"
|
|
7
14
|
import {
|
|
8
15
|
emitDatasetVersionCommitted,
|
|
9
16
|
emitPipelineRunFinished,
|
|
@@ -62,6 +69,10 @@ export class PipelineWorker extends QueueWorker<
|
|
|
62
69
|
throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`)
|
|
63
70
|
}
|
|
64
71
|
|
|
72
|
+
// Each trigger that joined this run published its own job for it. Once one of them has started
|
|
73
|
+
// the run, the others have nothing left to do.
|
|
74
|
+
if (run.status !== "queued") return
|
|
75
|
+
|
|
65
76
|
const durableExecution = await this.host.storage.executions.getById({
|
|
66
77
|
projectId: this.host.id,
|
|
67
78
|
id: run.executionId,
|
|
@@ -134,19 +145,58 @@ export class PipelineWorker extends QueueWorker<
|
|
|
134
145
|
|
|
135
146
|
protected override async onExecutionError(
|
|
136
147
|
claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
|
|
137
|
-
|
|
148
|
+
error: unknown
|
|
138
149
|
): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {
|
|
139
150
|
// Pipeline runs are not all-or-nothing in V1. A previous step may have committed an append
|
|
140
|
-
// output, so failed
|
|
151
|
+
// output, so a job that failed after starting its run must not be retried automatically.
|
|
141
152
|
const run = await this.host.storage.pipelineRuns?.getById({
|
|
142
153
|
projectId: this.host.id,
|
|
143
154
|
id: claimed.job.payload.runId,
|
|
144
155
|
})
|
|
156
|
+
if (run?.status === "queued") {
|
|
157
|
+
const retry = retryUnstartedRun(claimed.job.attempt)
|
|
158
|
+
if (retry) return retry
|
|
159
|
+
|
|
160
|
+
return { kind: "fail", failure: await this.failUnstartedRun(claimed, run, error) }
|
|
161
|
+
}
|
|
162
|
+
|
|
145
163
|
return run?.status === "failed" && run.error
|
|
146
164
|
? { kind: "fail", failure: run.error }
|
|
147
165
|
: { kind: "fail" }
|
|
148
166
|
}
|
|
149
167
|
|
|
168
|
+
/**
|
|
169
|
+
* Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends
|
|
170
|
+
* before starting it must not stay queued: every later trigger would wait on it forever.
|
|
171
|
+
*/
|
|
172
|
+
private async failUnstartedRun(
|
|
173
|
+
claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
|
|
174
|
+
run: PipelineRunRecord,
|
|
175
|
+
error: unknown
|
|
176
|
+
): Promise<SixbFailure<PipelineRunFailureCode>> {
|
|
177
|
+
const failure = captureSixbFailure(error, {
|
|
178
|
+
allowedCodes: PIPELINE_RUN_FAILURE_CODES,
|
|
179
|
+
defaultCode: "internal.unexpected",
|
|
180
|
+
details: { pipelineId: run.pipelineId, runId: run.id },
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
await this.context.pipelineRunsStorage.finish({
|
|
184
|
+
projectId: this.host.id,
|
|
185
|
+
id: run.id,
|
|
186
|
+
status: "failed",
|
|
187
|
+
error: failure,
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
reportRunFailure(this.host, error, {
|
|
191
|
+
projectId: this.host.id,
|
|
192
|
+
attempt: claimed.job.attempt,
|
|
193
|
+
runKind: "pipeline",
|
|
194
|
+
run: { runId: run.id, pipelineId: run.pipelineId },
|
|
195
|
+
failure,
|
|
196
|
+
})
|
|
197
|
+
return failure
|
|
198
|
+
}
|
|
199
|
+
|
|
150
200
|
protected override async onAbortError(
|
|
151
201
|
claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
|
|
152
202
|
_error: unknown
|