trigger.dev 0.0.0-prerelease-20240410151927 → 0.0.0-v2-prerelease-20240524135558
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/Containerfile.prod +5 -1
- package/dist/index.js +1544 -552
- package/dist/index.js.map +1 -1
- package/dist/workers/dev/worker-facade.js +41 -61
- package/dist/workers/dev/worker-setup.js +16 -22
- package/dist/workers/prod/entry-point.js +127 -59
- package/dist/workers/prod/worker-facade.js +52 -61
- package/dist/workers/prod/worker-setup.js +12 -24
- package/package.json +15 -61
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
// src/workers/dev/worker-facade.ts
|
|
2
2
|
import {
|
|
3
|
-
TaskExecutor,
|
|
4
|
-
DurableClock,
|
|
5
3
|
clock,
|
|
6
|
-
|
|
7
|
-
getEnvVar,
|
|
8
|
-
ZodSchemaParsedError
|
|
4
|
+
taskCatalog
|
|
9
5
|
} from "@trigger.dev/core/v3";
|
|
10
6
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
TaskExecutor,
|
|
8
|
+
DurableClock,
|
|
9
|
+
getEnvVar,
|
|
10
|
+
logLevels,
|
|
13
11
|
OtelTaskLogger,
|
|
12
|
+
ConsoleInterceptor
|
|
13
|
+
} from "@trigger.dev/core/v3/workers";
|
|
14
|
+
import {
|
|
14
15
|
TaskRunErrorCodes,
|
|
15
16
|
TriggerTracer,
|
|
16
|
-
ZodMessageHandler,
|
|
17
17
|
logger,
|
|
18
18
|
runtime,
|
|
19
19
|
workerToChildMessages
|
|
20
20
|
} from "@trigger.dev/core/v3";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
import { DevRuntimeManager } from "@trigger.dev/core/v3/dev";
|
|
22
|
+
import {
|
|
23
|
+
ZodMessageHandler,
|
|
24
|
+
ZodSchemaParsedError
|
|
25
|
+
} from "@trigger.dev/core/v3/zodMessageHandler";
|
|
26
26
|
__WORKER_SETUP__;
|
|
27
27
|
__IMPORTED_PROJECT_CONFIG__;
|
|
28
|
-
var otelTracer = tracingSDK.getTracer("trigger-dev-worker", version);
|
|
29
|
-
var otelLogger = tracingSDK.getLogger("trigger-dev-worker", version);
|
|
30
28
|
var durableClock = new DurableClock();
|
|
31
29
|
clock.setGlobalClock(durableClock);
|
|
32
30
|
var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
|
|
33
|
-
var consoleInterceptor = new ConsoleInterceptor(
|
|
31
|
+
var consoleInterceptor = new ConsoleInterceptor(
|
|
32
|
+
otelLogger,
|
|
33
|
+
typeof __PROJECT_CONFIG__.enableConsoleLogging === "boolean" ? __PROJECT_CONFIG__.enableConsoleLogging : true
|
|
34
|
+
);
|
|
34
35
|
var devRuntimeManager = new DevRuntimeManager();
|
|
35
36
|
runtime.setGlobalRuntimeManager(devRuntimeManager);
|
|
36
37
|
var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
|
|
@@ -38,56 +39,27 @@ var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? import
|
|
|
38
39
|
var otelTaskLogger = new OtelTaskLogger({
|
|
39
40
|
logger: otelLogger,
|
|
40
41
|
tracer,
|
|
41
|
-
level: logLevels.includes(configLogLevel) ? configLogLevel : "
|
|
42
|
+
level: logLevels.includes(configLogLevel) ? configLogLevel : "info"
|
|
42
43
|
});
|
|
43
44
|
logger.setGlobalTaskLogger(otelTaskLogger);
|
|
44
45
|
var TaskFileImports = {};
|
|
45
46
|
var TaskFiles = {};
|
|
46
47
|
__TASKS__;
|
|
47
|
-
|
|
48
|
-
const result = [];
|
|
48
|
+
(() => {
|
|
49
49
|
for (const [importName, taskFile] of Object.entries(TaskFiles)) {
|
|
50
50
|
const fileImports = TaskFileImports[importName];
|
|
51
51
|
for (const [exportName, task] of Object.entries(fileImports ?? {})) {
|
|
52
|
-
if (task.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
retry: task.__trigger.retry,
|
|
60
|
-
machine: task.__trigger.machine,
|
|
61
|
-
fns: task.__trigger.fns
|
|
62
|
-
});
|
|
52
|
+
if (typeof task === "object" && task !== null && "id" in task && typeof task.id === "string") {
|
|
53
|
+
if (taskCatalog.taskExists(task.id)) {
|
|
54
|
+
taskCatalog.registerTaskFileMetadata(task.id, {
|
|
55
|
+
exportName,
|
|
56
|
+
filePath: taskFile.filePath
|
|
57
|
+
});
|
|
58
|
+
}
|
|
63
59
|
}
|
|
64
60
|
}
|
|
65
61
|
}
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
function getTaskMetadata() {
|
|
69
|
-
const result = getTasks();
|
|
70
|
-
return result.map((task) => {
|
|
71
|
-
const { fns, ...metadata } = task;
|
|
72
|
-
return metadata;
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
var tasks = getTasks();
|
|
76
|
-
runtime.registerTasks(tasks);
|
|
77
|
-
var taskExecutors = /* @__PURE__ */ new Map();
|
|
78
|
-
for (const task of tasks) {
|
|
79
|
-
taskExecutors.set(
|
|
80
|
-
task.id,
|
|
81
|
-
new TaskExecutor(task, {
|
|
82
|
-
tracer,
|
|
83
|
-
tracingSDK,
|
|
84
|
-
consoleInterceptor,
|
|
85
|
-
projectConfig: __PROJECT_CONFIG__,
|
|
86
|
-
importedConfig,
|
|
87
|
-
handleErrorFn: handleError
|
|
88
|
-
})
|
|
89
|
-
);
|
|
90
|
-
}
|
|
62
|
+
})();
|
|
91
63
|
var _execution;
|
|
92
64
|
var _isRunning = false;
|
|
93
65
|
var handler = new ZodMessageHandler({
|
|
@@ -100,7 +72,7 @@ var handler = new ZodMessageHandler({
|
|
|
100
72
|
execution,
|
|
101
73
|
result: {
|
|
102
74
|
ok: false,
|
|
103
|
-
id: execution.
|
|
75
|
+
id: execution.run.id,
|
|
104
76
|
error: {
|
|
105
77
|
type: "INTERNAL_ERROR",
|
|
106
78
|
code: TaskRunErrorCodes.TASK_ALREADY_RUNNING
|
|
@@ -110,14 +82,14 @@ var handler = new ZodMessageHandler({
|
|
|
110
82
|
return;
|
|
111
83
|
}
|
|
112
84
|
process.title = `trigger-dev-worker: ${execution.task.id} ${execution.run.id}`;
|
|
113
|
-
const
|
|
114
|
-
if (!
|
|
115
|
-
console.error(`Could not find
|
|
85
|
+
const task = taskCatalog.getTask(execution.task.id);
|
|
86
|
+
if (!task) {
|
|
87
|
+
console.error(`Could not find task ${execution.task.id}`);
|
|
116
88
|
await sender.send("TASK_RUN_COMPLETED", {
|
|
117
89
|
execution,
|
|
118
90
|
result: {
|
|
119
91
|
ok: false,
|
|
120
|
-
id: execution.
|
|
92
|
+
id: execution.run.id,
|
|
121
93
|
error: {
|
|
122
94
|
type: "INTERNAL_ERROR",
|
|
123
95
|
code: TaskRunErrorCodes.COULD_NOT_FIND_EXECUTOR
|
|
@@ -126,6 +98,14 @@ var handler = new ZodMessageHandler({
|
|
|
126
98
|
});
|
|
127
99
|
return;
|
|
128
100
|
}
|
|
101
|
+
const executor = new TaskExecutor(task, {
|
|
102
|
+
tracer,
|
|
103
|
+
tracingSDK,
|
|
104
|
+
consoleInterceptor,
|
|
105
|
+
projectConfig: __PROJECT_CONFIG__,
|
|
106
|
+
importedConfig,
|
|
107
|
+
handleErrorFn: handleError
|
|
108
|
+
});
|
|
129
109
|
try {
|
|
130
110
|
_execution = execution;
|
|
131
111
|
_isRunning = true;
|
|
@@ -157,7 +137,7 @@ var handler = new ZodMessageHandler({
|
|
|
157
137
|
process.on("message", async (msg) => {
|
|
158
138
|
await handler.handleMessage(msg);
|
|
159
139
|
});
|
|
160
|
-
var TASK_METADATA =
|
|
140
|
+
var TASK_METADATA = taskCatalog.getAllTaskMetadata();
|
|
161
141
|
sender.send("TASKS_READY", { tasks: TASK_METADATA }).catch((err) => {
|
|
162
142
|
if (err instanceof ZodSchemaParsedError) {
|
|
163
143
|
sender.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: TASK_METADATA });
|
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
// src/workers/dev/worker-setup.ts
|
|
2
|
-
import "
|
|
3
|
-
import { Resource } from "@opentelemetry/resources";
|
|
2
|
+
import { childToWorkerMessages, taskCatalog } from "@trigger.dev/core/v3";
|
|
4
3
|
import {
|
|
5
|
-
|
|
6
|
-
TracingSDK
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
StandardTaskCatalog,
|
|
5
|
+
TracingSDK
|
|
6
|
+
} from "@trigger.dev/core/v3/workers";
|
|
7
|
+
import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler";
|
|
8
|
+
import "source-map-support/register.js";
|
|
9
|
+
|
|
10
|
+
// package.json
|
|
11
|
+
var version = "3.0.0-beta.33";
|
|
12
|
+
|
|
13
|
+
// src/workers/dev/worker-setup.ts
|
|
10
14
|
__SETUP_IMPORTED_PROJECT_CONFIG__;
|
|
11
15
|
var tracingSDK = new TracingSDK({
|
|
12
16
|
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318",
|
|
13
|
-
resource: new Resource({
|
|
14
|
-
[SemanticInternalAttributes.CLI_VERSION]: "3.0.0"
|
|
15
|
-
}),
|
|
16
17
|
instrumentations: setupImportedConfig?.instrumentations ?? [],
|
|
17
18
|
diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none"
|
|
18
19
|
});
|
|
20
|
+
var otelTracer = tracingSDK.getTracer("trigger-dev-worker", version);
|
|
21
|
+
var otelLogger = tracingSDK.getLogger("trigger-dev-worker", version);
|
|
19
22
|
var sender = new ZodMessageSender({
|
|
20
23
|
schema: childToWorkerMessages,
|
|
21
24
|
sender: async (message) => {
|
|
22
25
|
process.send?.(message);
|
|
23
26
|
}
|
|
24
27
|
});
|
|
25
|
-
|
|
26
|
-
sender.send("UNCAUGHT_EXCEPTION", {
|
|
27
|
-
error: {
|
|
28
|
-
name: error.name,
|
|
29
|
-
message: error.message,
|
|
30
|
-
stack: error.stack
|
|
31
|
-
},
|
|
32
|
-
origin
|
|
33
|
-
}).catch((err) => {
|
|
34
|
-
console.error("Failed to send UNCAUGHT_EXCEPTION message", err);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
28
|
+
taskCatalog.setGlobalTaskCatalog(new StandardTaskCatalog());
|
|
37
29
|
export {
|
|
30
|
+
otelLogger,
|
|
31
|
+
otelTracer,
|
|
38
32
|
sender,
|
|
39
33
|
tracingSDK
|
|
40
34
|
};
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
CoordinatorToProdWorkerMessages,
|
|
4
4
|
PostStartCauses,
|
|
5
5
|
PreStopCauses,
|
|
6
|
-
ProdWorkerToCoordinatorMessages
|
|
7
|
-
ZodSocketConnection as ZodSocketConnection2
|
|
6
|
+
ProdWorkerToCoordinatorMessages
|
|
8
7
|
} from "@trigger.dev/core/v3";
|
|
8
|
+
import { ZodSocketConnection as ZodSocketConnection2 } from "@trigger.dev/core/v3/zodSocket";
|
|
9
9
|
|
|
10
10
|
// ../core-apps/src/http.ts
|
|
11
11
|
var HttpReply = class {
|
|
@@ -71,10 +71,10 @@ import {
|
|
|
71
71
|
clientWebsocketMessages,
|
|
72
72
|
PlatformToProviderMessages,
|
|
73
73
|
ProviderToPlatformMessages,
|
|
74
|
-
SharedQueueToClientMessages
|
|
75
|
-
ZodMessageSender,
|
|
76
|
-
ZodSocketConnection
|
|
74
|
+
SharedQueueToClientMessages
|
|
77
75
|
} from "@trigger.dev/core/v3";
|
|
76
|
+
import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler";
|
|
77
|
+
import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket";
|
|
78
78
|
var HTTP_SERVER_PORT = Number(process.env.HTTP_SERVER_PORT || getRandomPortNumber());
|
|
79
79
|
var MACHINE_NAME = process.env.MACHINE_NAME || "local";
|
|
80
80
|
var PLATFORM_HOST = process.env.PLATFORM_HOST || "127.0.0.1";
|
|
@@ -93,9 +93,9 @@ import {
|
|
|
93
93
|
ProdWorkerToChildMessages,
|
|
94
94
|
SemanticInternalAttributes,
|
|
95
95
|
TaskRunErrorCodes,
|
|
96
|
-
ZodIpcConnection,
|
|
97
96
|
correctErrorStackTrace
|
|
98
97
|
} from "@trigger.dev/core/v3";
|
|
98
|
+
import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc";
|
|
99
99
|
import { Evt } from "evt";
|
|
100
100
|
import { fork } from "node:child_process";
|
|
101
101
|
|
|
@@ -148,6 +148,7 @@ var ProdBackgroundWorker = class {
|
|
|
148
148
|
onWaitForDuration = new Evt();
|
|
149
149
|
onWaitForTask = new Evt();
|
|
150
150
|
preCheckpointNotification = Evt.create();
|
|
151
|
+
checkpointCanceledNotification = Evt.create();
|
|
151
152
|
onReadyForCheckpoint = Evt.create();
|
|
152
153
|
onCancelCheckpoint = Evt.create();
|
|
153
154
|
_onClose = new Evt();
|
|
@@ -296,6 +297,9 @@ var ProdBackgroundWorker = class {
|
|
|
296
297
|
this.preCheckpointNotification.attach((message) => {
|
|
297
298
|
taskRunProcess.preCheckpointNotification.post(message);
|
|
298
299
|
});
|
|
300
|
+
this.checkpointCanceledNotification.attach((message) => {
|
|
301
|
+
taskRunProcess.checkpointCanceledNotification.post(message);
|
|
302
|
+
});
|
|
299
303
|
await taskRunProcess.initialize();
|
|
300
304
|
this._taskRunProcess = taskRunProcess;
|
|
301
305
|
}
|
|
@@ -394,6 +398,7 @@ var TaskRunProcess = class {
|
|
|
394
398
|
onWaitForDuration = new Evt();
|
|
395
399
|
onWaitForTask = new Evt();
|
|
396
400
|
preCheckpointNotification = Evt.create();
|
|
401
|
+
checkpointCanceledNotification = Evt.create();
|
|
397
402
|
onReadyForCheckpoint = Evt.create();
|
|
398
403
|
onCancelCheckpoint = Evt.create();
|
|
399
404
|
async initialize() {
|
|
@@ -443,22 +448,49 @@ var TaskRunProcess = class {
|
|
|
443
448
|
},
|
|
444
449
|
TASKS_READY: async (message) => {
|
|
445
450
|
},
|
|
451
|
+
WAIT_FOR_TASK: async (message) => {
|
|
452
|
+
this.onWaitForTask.post(message);
|
|
453
|
+
},
|
|
446
454
|
WAIT_FOR_BATCH: async (message) => {
|
|
447
455
|
this.onWaitForBatch.post(message);
|
|
448
456
|
},
|
|
449
457
|
WAIT_FOR_DURATION: async (message) => {
|
|
450
458
|
this.onWaitForDuration.post(message);
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
459
|
+
try {
|
|
460
|
+
const { willCheckpointAndRestore } = await this.preCheckpointNotification.waitFor(
|
|
461
|
+
3e4
|
|
462
|
+
);
|
|
463
|
+
return {
|
|
464
|
+
willCheckpointAndRestore
|
|
465
|
+
};
|
|
466
|
+
} catch (error) {
|
|
467
|
+
console.error("Error while waiting for pre-checkpoint notification", error);
|
|
468
|
+
return {
|
|
469
|
+
willCheckpointAndRestore: false
|
|
470
|
+
};
|
|
471
|
+
}
|
|
456
472
|
},
|
|
457
473
|
READY_FOR_CHECKPOINT: async (message) => {
|
|
458
474
|
this.onReadyForCheckpoint.post(message);
|
|
459
475
|
},
|
|
460
476
|
CANCEL_CHECKPOINT: async (message) => {
|
|
477
|
+
const version = "v2";
|
|
461
478
|
this.onCancelCheckpoint.post(message);
|
|
479
|
+
try {
|
|
480
|
+
const { checkpointCanceled } = await this.checkpointCanceledNotification.waitFor(
|
|
481
|
+
3e4
|
|
482
|
+
);
|
|
483
|
+
return {
|
|
484
|
+
version,
|
|
485
|
+
checkpointCanceled
|
|
486
|
+
};
|
|
487
|
+
} catch (error) {
|
|
488
|
+
console.error("Error while waiting for checkpoint cancellation", error);
|
|
489
|
+
return {
|
|
490
|
+
version,
|
|
491
|
+
checkpointCanceled: true
|
|
492
|
+
};
|
|
493
|
+
}
|
|
462
494
|
}
|
|
463
495
|
}
|
|
464
496
|
});
|
|
@@ -577,6 +609,7 @@ var logger2 = new SimpleLogger(`[${MACHINE_NAME2}][${SHORT_HASH}]`);
|
|
|
577
609
|
var ProdWorker = class {
|
|
578
610
|
constructor(port, host = "0.0.0.0") {
|
|
579
611
|
this.host = host;
|
|
612
|
+
process.on("SIGTERM", this.#handleSignal.bind(this, "SIGTERM"));
|
|
580
613
|
this.#coordinatorSocket = this.#createCoordinatorSocket(COORDINATOR_HOST);
|
|
581
614
|
this.#backgroundWorker = new ProdBackgroundWorker("worker.js", {
|
|
582
615
|
projectConfig: __PROJECT_CONFIG__,
|
|
@@ -592,18 +625,26 @@ var ProdWorker = class {
|
|
|
592
625
|
this.#coordinatorSocket.socket.emit("TASK_HEARTBEAT", { version: "v1", attemptFriendlyId });
|
|
593
626
|
});
|
|
594
627
|
this.#backgroundWorker.onReadyForCheckpoint.attach(async (message) => {
|
|
628
|
+
await this.#backgroundWorker.flushTelemetry();
|
|
595
629
|
this.#coordinatorSocket.socket.emit("READY_FOR_CHECKPOINT", { version: "v1" });
|
|
596
630
|
});
|
|
597
631
|
this.#backgroundWorker.onCancelCheckpoint.attach(async (message) => {
|
|
598
|
-
logger2.log("onCancelCheckpoint
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
632
|
+
logger2.log("onCancelCheckpoint", { message });
|
|
633
|
+
const { checkpointCanceled } = await this.#coordinatorSocket.socket.emitWithAck(
|
|
634
|
+
"CANCEL_CHECKPOINT",
|
|
635
|
+
{
|
|
636
|
+
version: "v2",
|
|
637
|
+
reason: message.reason
|
|
638
|
+
}
|
|
639
|
+
);
|
|
640
|
+
if (checkpointCanceled) {
|
|
641
|
+
if (message.reason === "WAIT_FOR_DURATION") {
|
|
642
|
+
this.paused = false;
|
|
643
|
+
this.nextResumeAfter = void 0;
|
|
644
|
+
this.waitForPostStart = false;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
this.#backgroundWorker.checkpointCanceledNotification.post({ checkpointCanceled });
|
|
607
648
|
});
|
|
608
649
|
this.#backgroundWorker.onWaitForDuration.attach(async (message) => {
|
|
609
650
|
if (!this.attemptFriendlyId) {
|
|
@@ -669,6 +710,27 @@ var ProdWorker = class {
|
|
|
669
710
|
#backgroundWorker;
|
|
670
711
|
#httpServer;
|
|
671
712
|
#coordinatorSocket;
|
|
713
|
+
async #handleSignal(signal) {
|
|
714
|
+
logger2.log("Received signal", { signal });
|
|
715
|
+
if (signal === "SIGTERM") {
|
|
716
|
+
if (this.executing) {
|
|
717
|
+
const terminationGracePeriodSeconds = 60 * 60;
|
|
718
|
+
logger2.log("Waiting for attempt to complete before exiting", {
|
|
719
|
+
terminationGracePeriodSeconds
|
|
720
|
+
});
|
|
721
|
+
await setTimeout2(terminationGracePeriodSeconds * 1e3 - 5e3);
|
|
722
|
+
logger2.log("Termination timeout reached, exiting gracefully.");
|
|
723
|
+
} else {
|
|
724
|
+
logger2.log("Not executing, exiting immediately.");
|
|
725
|
+
}
|
|
726
|
+
await this.#exitGracefully();
|
|
727
|
+
}
|
|
728
|
+
logger2.log("Unhandled signal", { signal });
|
|
729
|
+
}
|
|
730
|
+
async #exitGracefully() {
|
|
731
|
+
await this.#backgroundWorker.close();
|
|
732
|
+
process.exit(0);
|
|
733
|
+
}
|
|
672
734
|
async #reconnect(isPostStart = false, reconnectImmediately = false) {
|
|
673
735
|
if (isPostStart) {
|
|
674
736
|
this.waitForPostStart = false;
|
|
@@ -698,13 +760,16 @@ var ProdWorker = class {
|
|
|
698
760
|
this.#coordinatorSocket = this.#createCoordinatorSocket(coordinatorHost);
|
|
699
761
|
}
|
|
700
762
|
}
|
|
701
|
-
#prepareForWait(reason, willCheckpointAndRestore) {
|
|
763
|
+
async #prepareForWait(reason, willCheckpointAndRestore) {
|
|
702
764
|
logger2.log(`prepare for ${reason}`, { willCheckpointAndRestore });
|
|
703
765
|
this.#backgroundWorker.preCheckpointNotification.post({ willCheckpointAndRestore });
|
|
704
766
|
if (willCheckpointAndRestore) {
|
|
705
767
|
this.paused = true;
|
|
706
768
|
this.nextResumeAfter = reason;
|
|
707
769
|
this.waitForPostStart = true;
|
|
770
|
+
if (reason === "WAIT_FOR_TASK" || reason === "WAIT_FOR_BATCH") {
|
|
771
|
+
await this.#backgroundWorker.flushTelemetry();
|
|
772
|
+
}
|
|
708
773
|
}
|
|
709
774
|
}
|
|
710
775
|
async #prepareForRetry(willCheckpointAndRestore, shouldExit) {
|
|
@@ -713,8 +778,7 @@ var ProdWorker = class {
|
|
|
713
778
|
if (willCheckpointAndRestore) {
|
|
714
779
|
logger2.log("WARNING: Will checkpoint but also requested exit. This won't end well.");
|
|
715
780
|
}
|
|
716
|
-
await this.#
|
|
717
|
-
process.exit(0);
|
|
781
|
+
await this.#exitGracefully();
|
|
718
782
|
}
|
|
719
783
|
this.executing = false;
|
|
720
784
|
this.attemptFriendlyId = void 0;
|
|
@@ -727,6 +791,7 @@ var ProdWorker = class {
|
|
|
727
791
|
#resumeAfterDuration() {
|
|
728
792
|
this.paused = false;
|
|
729
793
|
this.nextResumeAfter = void 0;
|
|
794
|
+
this.waitForPostStart = false;
|
|
730
795
|
this.#backgroundWorker.waitCompletedNotification();
|
|
731
796
|
}
|
|
732
797
|
#returnValidatedExtraHeaders(headers) {
|
|
@@ -737,6 +802,7 @@ var ProdWorker = class {
|
|
|
737
802
|
}
|
|
738
803
|
return headers;
|
|
739
804
|
}
|
|
805
|
+
// FIXME: If the the worker can't connect for a while, this runs MANY times - it should only run once
|
|
740
806
|
#createCoordinatorSocket(host) {
|
|
741
807
|
const extraHeaders = this.#returnValidatedExtraHeaders({
|
|
742
808
|
"x-machine-name": MACHINE_NAME2,
|
|
@@ -801,6 +867,7 @@ var ProdWorker = class {
|
|
|
801
867
|
}
|
|
802
868
|
this.paused = false;
|
|
803
869
|
this.nextResumeAfter = void 0;
|
|
870
|
+
this.waitForPostStart = false;
|
|
804
871
|
for (let i = 0; i < message.completions.length; i++) {
|
|
805
872
|
const completion = message.completions[i];
|
|
806
873
|
const execution = message.executions[i];
|
|
@@ -872,6 +939,21 @@ var ProdWorker = class {
|
|
|
872
939
|
logger3.log("skip connection handler, waiting for post start hook");
|
|
873
940
|
return;
|
|
874
941
|
}
|
|
942
|
+
if (this.paused) {
|
|
943
|
+
if (!this.nextResumeAfter) {
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
946
|
+
if (!this.attemptFriendlyId) {
|
|
947
|
+
logger3.error("Missing friendly ID");
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
socket.emit("READY_FOR_RESUME", {
|
|
951
|
+
version: "v1",
|
|
952
|
+
attemptFriendlyId: this.attemptFriendlyId,
|
|
953
|
+
type: this.nextResumeAfter
|
|
954
|
+
});
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
875
957
|
if (process.env.INDEX_TASKS === "true") {
|
|
876
958
|
try {
|
|
877
959
|
const taskResources = await this.#initializeWorker();
|
|
@@ -889,7 +971,10 @@ var ProdWorker = class {
|
|
|
889
971
|
}
|
|
890
972
|
} catch (e) {
|
|
891
973
|
if (e instanceof TaskMetadataParseError) {
|
|
892
|
-
logger3.error("tasks metadata parse error", {
|
|
974
|
+
logger3.error("tasks metadata parse error", {
|
|
975
|
+
zodIssues: e.zodIssues,
|
|
976
|
+
tasks: e.tasks
|
|
977
|
+
});
|
|
893
978
|
socket.emit("INDEXING_FAILED", {
|
|
894
979
|
version: "v1",
|
|
895
980
|
deploymentId: this.deploymentId,
|
|
@@ -900,29 +985,31 @@ var ProdWorker = class {
|
|
|
900
985
|
}
|
|
901
986
|
});
|
|
902
987
|
} else if (e instanceof UncaughtExceptionError) {
|
|
903
|
-
|
|
988
|
+
const error = {
|
|
989
|
+
name: e.originalError.name,
|
|
990
|
+
message: e.originalError.message,
|
|
991
|
+
stack: e.originalError.stack
|
|
992
|
+
};
|
|
993
|
+
logger3.error("uncaught exception", { originalError: error });
|
|
904
994
|
socket.emit("INDEXING_FAILED", {
|
|
905
995
|
version: "v1",
|
|
906
996
|
deploymentId: this.deploymentId,
|
|
907
|
-
error
|
|
908
|
-
name: e.originalError.name,
|
|
909
|
-
message: e.originalError.message,
|
|
910
|
-
stack: e.originalError.stack
|
|
911
|
-
}
|
|
997
|
+
error
|
|
912
998
|
});
|
|
913
999
|
} else if (e instanceof Error) {
|
|
914
|
-
|
|
1000
|
+
const error = {
|
|
1001
|
+
name: e.name,
|
|
1002
|
+
message: e.message,
|
|
1003
|
+
stack: e.stack
|
|
1004
|
+
};
|
|
1005
|
+
logger3.error("error", { error });
|
|
915
1006
|
socket.emit("INDEXING_FAILED", {
|
|
916
1007
|
version: "v1",
|
|
917
1008
|
deploymentId: this.deploymentId,
|
|
918
|
-
error
|
|
919
|
-
name: e.name,
|
|
920
|
-
message: e.message,
|
|
921
|
-
stack: e.stack
|
|
922
|
-
}
|
|
1009
|
+
error
|
|
923
1010
|
});
|
|
924
1011
|
} else if (typeof e === "string") {
|
|
925
|
-
logger3.error("string error", { message: e });
|
|
1012
|
+
logger3.error("string error", { error: { message: e } });
|
|
926
1013
|
socket.emit("INDEXING_FAILED", {
|
|
927
1014
|
version: "v1",
|
|
928
1015
|
deploymentId: this.deploymentId,
|
|
@@ -943,28 +1030,9 @@ var ProdWorker = class {
|
|
|
943
1030
|
});
|
|
944
1031
|
}
|
|
945
1032
|
await setTimeout2(200);
|
|
946
|
-
process.exit(
|
|
1033
|
+
process.exit(111);
|
|
947
1034
|
}
|
|
948
1035
|
}
|
|
949
|
-
if (this.paused) {
|
|
950
|
-
if (!this.nextResumeAfter) {
|
|
951
|
-
return;
|
|
952
|
-
}
|
|
953
|
-
if (!this.attemptFriendlyId) {
|
|
954
|
-
logger3.error("Missing friendly ID");
|
|
955
|
-
return;
|
|
956
|
-
}
|
|
957
|
-
if (this.nextResumeAfter === "WAIT_FOR_DURATION") {
|
|
958
|
-
this.#resumeAfterDuration();
|
|
959
|
-
return;
|
|
960
|
-
}
|
|
961
|
-
socket.emit("READY_FOR_RESUME", {
|
|
962
|
-
version: "v1",
|
|
963
|
-
attemptFriendlyId: this.attemptFriendlyId,
|
|
964
|
-
type: this.nextResumeAfter
|
|
965
|
-
});
|
|
966
|
-
return;
|
|
967
|
-
}
|
|
968
1036
|
if (this.executing) {
|
|
969
1037
|
return;
|
|
970
1038
|
}
|
|
@@ -1001,7 +1069,8 @@ var ProdWorker = class {
|
|
|
1001
1069
|
case "/status": {
|
|
1002
1070
|
return reply.json({
|
|
1003
1071
|
executing: this.executing,
|
|
1004
|
-
|
|
1072
|
+
paused: this.paused,
|
|
1073
|
+
completed: this.completed.size,
|
|
1005
1074
|
nextResumeAfter: this.nextResumeAfter
|
|
1006
1075
|
});
|
|
1007
1076
|
}
|
|
@@ -1039,7 +1108,6 @@ var ProdWorker = class {
|
|
|
1039
1108
|
break;
|
|
1040
1109
|
}
|
|
1041
1110
|
}
|
|
1042
|
-
logger2.log("preStop", { url: req.url });
|
|
1043
1111
|
return reply.text("preStop ok");
|
|
1044
1112
|
}
|
|
1045
1113
|
case "/postStart": {
|