fix(data-plane): accept exact replacement replays

This commit is contained in:
Codex
2026-07-21 23:11:35 +03:00
parent 45884cd4dc
commit a9b8d71968
5 changed files with 279 additions and 5 deletions
@@ -232,6 +232,26 @@ try {
);
assert.equal(firstZoneGeneration.currentUpdatedCount, 2);
assert.equal(firstZoneGeneration.currentRemovedCount, 0);
const replayedFirstZoneGeneration = await persistDataProductPublish(
pool,
zoneBatch("zones-01-stable-replay-key", firstZoneGenerationAt, [
zoneFact("zone-01", firstZoneGenerationAt),
zoneFact("zone-02", firstZoneGenerationAt),
]),
storedZoneDefinition,
);
assert.equal(replayedFirstZoneGeneration.idempotent, true);
assert.equal(replayedFirstZoneGeneration.publishedFactCount, 2);
assert.equal(replayedFirstZoneGeneration.currentUpdatedCount, 0);
assert.equal(replayedFirstZoneGeneration.currentRemovedCount, 0);
assert.equal(replayedFirstZoneGeneration.patchOperationCount, 0);
assert.equal(replayedFirstZoneGeneration.cursor, firstZoneGeneration.cursor);
await assert.rejects(
persistDataProductPublish(pool, zoneBatch("zones-01-conflicting-replay", firstZoneGenerationAt, [
zoneFact("zone-01", firstZoneGenerationAt),
]), storedZoneDefinition),
(error) => error?.status === 409 && error?.code === "data_product_generation_not_newer",
);
const secondZoneGenerationAt = "2026-07-15T10:11:00.000Z";
const secondZoneGeneration = await persistDataProductPublish(
pool,
@@ -1,6 +1,9 @@
import assert from "node:assert/strict";
import { assertPublishMatchesDefinition } from "../src/data-product-delivery.mjs";
import {
assertPublishMatchesDefinition,
classifyReplacementGeneration,
} from "../src/data-product-delivery.mjs";
import { normalizeDataProductDefinition } from "../src/data-product-policy.mjs";
const definition = normalizeDataProductDefinition({
@@ -92,4 +95,42 @@ assert.doesNotThrow(() => assertPublishMatchesDefinition({
}],
}, legacyDefinition));
const acceptedGeneration = "2026-07-15T10:10:00.000Z";
assert.equal(classifyReplacementGeneration({
currentGenerationAt: null,
generationAt: acceptedGeneration,
}), "advance");
assert.equal(classifyReplacementGeneration({
currentGenerationAt: acceptedGeneration,
generationAt: "2026-07-15T10:11:00.000Z",
}), "advance");
assert.equal(classifyReplacementGeneration({
currentGenerationAt: acceptedGeneration,
generationAt: acceptedGeneration,
incomingCount: 903,
currentCount: 903,
matchingCount: 903,
}), "replay");
assert.equal(classifyReplacementGeneration({
currentGenerationAt: acceptedGeneration,
generationAt: acceptedGeneration,
incomingCount: 903,
currentCount: 903,
matchingCount: 902,
}), "conflict");
assert.equal(classifyReplacementGeneration({
currentGenerationAt: acceptedGeneration,
generationAt: acceptedGeneration,
incomingCount: 902,
currentCount: 903,
matchingCount: 902,
}), "conflict");
assert.equal(classifyReplacementGeneration({
currentGenerationAt: acceptedGeneration,
generationAt: "2026-07-15T10:09:00.000Z",
incomingCount: 903,
currentCount: 903,
matchingCount: 903,
}), "stale");
console.log("external-data-plane data product delivery policy: ok");