fix(data-plane): accept exact replacement replays
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user