@smthrs/engine-store 1.0.0-rc.7 → 1.0.0-rc.8
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 +3 -1
- package/dist/cjs/ArtifactSync.d.ts.map +1 -1
- package/dist/cjs/ArtifactSync.js +5 -0
- package/dist/cjs/ArtifactSync.js.map +2 -2
- package/dist/cjs/DisasterRecovery.d.ts +9 -26
- package/dist/cjs/DisasterRecovery.d.ts.map +1 -1
- package/dist/cjs/DisasterRecovery.js +27 -18
- package/dist/cjs/DisasterRecovery.js.map +2 -2
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/internal/ActionPersistence.d.ts.map +1 -1
- package/dist/cjs/internal/ActionPersistence.js +27 -2
- package/dist/cjs/internal/ActionPersistence.js.map +3 -3
- package/dist/esm/ArtifactSync.d.ts.map +1 -1
- package/dist/esm/ArtifactSync.js +6 -1
- package/dist/esm/ArtifactSync.js.map +1 -1
- package/dist/esm/DisasterRecovery.d.ts +9 -26
- package/dist/esm/DisasterRecovery.d.ts.map +1 -1
- package/dist/esm/DisasterRecovery.js +46 -27
- package/dist/esm/DisasterRecovery.js.map +1 -1
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/ActionPersistence.d.ts.map +1 -1
- package/dist/esm/internal/ActionPersistence.js +59 -3
- package/dist/esm/internal/ActionPersistence.js.map +1 -1
- package/docs/README.md +3 -1
- package/docs/api.md +4 -1
- package/docs/concepts/attempts-and-replay.md +15 -2
- package/docs/guides/back-up-and-restore.md +9 -3
- package/docs/guides/reclaim-runs-from-a-dead-host.md +16 -0
- package/docs/installation.md +5 -1
- package/docs/quickstart.md +9 -1
- package/docs/troubleshooting.md +3 -0
- package/package.json +18 -18
- package/src/ArtifactSync.ts +7 -0
- package/src/DisasterRecovery.ts +90 -58
- package/src/index.ts +14 -0
- package/src/internal/ActionPersistence.ts +64 -3
|
@@ -598,7 +598,10 @@ const make = (deps) => {
|
|
|
598
598
|
}
|
|
599
599
|
}
|
|
600
600
|
});
|
|
601
|
-
|
|
601
|
+
const exclusive = (effect) => admission.withPermit(`run:${deps.runId}|${stepKeyDigest}`)(
|
|
602
|
+
cacheDeclaration._tag === "Eligible" ? admission.withPermit(`cache:${keyDigest}`)(effect) : effect
|
|
603
|
+
);
|
|
604
|
+
return yield* exclusive(
|
|
602
605
|
Effect.gen(function* () {
|
|
603
606
|
const attemptSource = (record) => ({
|
|
604
607
|
runId: deps.runId,
|
|
@@ -731,6 +734,7 @@ const make = (deps) => {
|
|
|
731
734
|
return Option.none();
|
|
732
735
|
});
|
|
733
736
|
const existing = yield* attempts.get(attemptId);
|
|
737
|
+
const orphaned = Option.isSome(existing) && existing.value.state === "running" && decodeMeta(existing.value.meta)?.effectCrossing !== "succeeded" ? existing.value : void 0;
|
|
734
738
|
if (cacheDeclaration._tag === "Eligible") {
|
|
735
739
|
const observed = yield* cache.get(keyDigest).pipe(
|
|
736
740
|
Effect.catch(
|
|
@@ -761,7 +765,7 @@ const make = (deps) => {
|
|
|
761
765
|
}
|
|
762
766
|
));
|
|
763
767
|
}
|
|
764
|
-
if (candidate._tag === "CandidateEvidence" && Option.isNone(existing)) {
|
|
768
|
+
if (candidate._tag === "CandidateEvidence" && (Option.isNone(existing) || orphaned !== void 0)) {
|
|
765
769
|
const boundary2 = yield* StepBoundary.StepBoundary;
|
|
766
770
|
const measured = yield* boundary2.prepare(cacheDeclaration.metadata).pipe(Effect.option);
|
|
767
771
|
const verified = Option.isSome(measured) && StepBoundary.readSetMatches(measured.value);
|
|
@@ -784,6 +788,27 @@ const make = (deps) => {
|
|
|
784
788
|
recordedRunId: cached.value.recordedRunId,
|
|
785
789
|
recordedEventSeq: cached.value.recordedEventSeq
|
|
786
790
|
}));
|
|
791
|
+
if (orphaned !== void 0) {
|
|
792
|
+
const finishedAtMs2 = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor));
|
|
793
|
+
const settled2 = yield* settleAttempt({
|
|
794
|
+
...attemptId,
|
|
795
|
+
state: "succeeded",
|
|
796
|
+
finishedAtMs: finishedAtMs2,
|
|
797
|
+
outcome: attemptPayload(cached.value.result),
|
|
798
|
+
meta: attemptPayload(
|
|
799
|
+
{
|
|
800
|
+
...decodeMeta(orphaned.meta),
|
|
801
|
+
...declarationMeta,
|
|
802
|
+
admittedBy: deps.owner
|
|
803
|
+
}
|
|
804
|
+
)
|
|
805
|
+
}, [
|
|
806
|
+
JournalRecords.attemptFinished(attemptSource("finished"), { ...attemptId, state: "succeeded" })
|
|
807
|
+
]);
|
|
808
|
+
if (!settled2) {
|
|
809
|
+
return yield* Effect.interrupt;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
787
812
|
yield* Metric.update(EngineStoreMetrics.stepCacheDecision.VerifiedHit, 1);
|
|
788
813
|
yield* import_flow.Action.reportDispatch({
|
|
789
814
|
outcome: "replayed",
|