@indigoai-us/hq-cloud 6.15.78 → 6.15.80
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/bin/area-ledger-migration.d.ts +13 -0
- package/dist/bin/area-ledger-migration.d.ts.map +1 -0
- package/dist/bin/area-ledger-migration.js +64 -0
- package/dist/bin/area-ledger-migration.js.map +1 -0
- package/dist/bin/area-ledger-migration.test.d.ts +2 -0
- package/dist/bin/area-ledger-migration.test.d.ts.map +1 -0
- package/dist/bin/area-ledger-migration.test.js +55 -0
- package/dist/bin/area-ledger-migration.test.js.map +1 -0
- package/dist/bin/sync-runner-company.d.ts +6 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +6 -0
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-company.test.js +47 -0
- package/dist/bin/sync-runner-company.test.js.map +1 -1
- package/dist/cli/share.d.ts +8 -0
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +184 -10
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +330 -7
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +7 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +11 -1
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +25 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +11 -1
- package/dist/index.test.js.map +1 -1
- package/dist/journal-store.test.js +42 -1
- package/dist/journal-store.test.js.map +1 -1
- package/dist/journal.d.ts +13 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +104 -3
- package/dist/journal.js.map +1 -1
- package/dist/sync/area-ledger-migration.d.ts +116 -0
- package/dist/sync/area-ledger-migration.d.ts.map +1 -0
- package/dist/sync/area-ledger-migration.js +505 -0
- package/dist/sync/area-ledger-migration.js.map +1 -0
- package/dist/sync/area-ledger-migration.test.d.ts +2 -0
- package/dist/sync/area-ledger-migration.test.d.ts.map +1 -0
- package/dist/sync/area-ledger-migration.test.js +274 -0
- package/dist/sync/area-ledger-migration.test.js.map +1 -0
- package/dist/sync/area-ledger.d.ts +93 -0
- package/dist/sync/area-ledger.d.ts.map +1 -0
- package/dist/sync/area-ledger.js +460 -0
- package/dist/sync/area-ledger.js.map +1 -0
- package/dist/sync/area-ledger.test.d.ts +2 -0
- package/dist/sync/area-ledger.test.d.ts.map +1 -0
- package/dist/sync/area-ledger.test.js +199 -0
- package/dist/sync/area-ledger.test.js.map +1 -0
- package/dist/sync/event-sync.d.ts +14 -4
- package/dist/sync/event-sync.d.ts.map +1 -1
- package/dist/sync/event-sync.js +177 -61
- package/dist/sync/event-sync.js.map +1 -1
- package/dist/sync/event-sync.test.js +140 -10
- package/dist/sync/event-sync.test.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/parallel-sync-coordinator.d.ts.map +1 -1
- package/dist/sync/parallel-sync-coordinator.js +22 -4
- package/dist/sync/parallel-sync-coordinator.js.map +1 -1
- package/dist/sync/parallel-sync-coordinator.test.js +45 -0
- package/dist/sync/parallel-sync-coordinator.test.js.map +1 -1
- package/dist/sync/reconcile-cursor.d.ts +97 -0
- package/dist/sync/reconcile-cursor.d.ts.map +1 -0
- package/dist/sync/reconcile-cursor.js +215 -0
- package/dist/sync/reconcile-cursor.js.map +1 -0
- package/dist/sync/reconcile-cursor.test.d.ts +2 -0
- package/dist/sync/reconcile-cursor.test.d.ts.map +1 -0
- package/dist/sync/reconcile-cursor.test.js +139 -0
- package/dist/sync/reconcile-cursor.test.js.map +1 -0
- package/dist/sync/state-store.d.ts +76 -0
- package/dist/sync/state-store.d.ts.map +1 -1
- package/dist/sync/state-store.js +317 -3
- package/dist/sync/state-store.js.map +1 -1
- package/dist/sync/state-store.test.js +39 -1
- package/dist/sync/state-store.test.js.map +1 -1
- package/dist/sync/sync-work.d.ts +2 -1
- package/dist/sync/sync-work.d.ts.map +1 -1
- package/dist/sync/sync-work.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vault-client.d.ts +9 -2
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +3 -2
- package/dist/vault-client.js.map +1 -1
- package/dist/vault-client.test.js +26 -0
- package/dist/vault-client.test.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { SyncJournal, V3JournalState } from "../types.js";
|
|
2
|
+
import { type AreaLedgerDelta } from "./area-ledger.js";
|
|
3
|
+
import { AreaResolver, type AreaId } from "./area-resolver.js";
|
|
4
|
+
import { StateStore } from "./state-store.js";
|
|
5
|
+
export declare const AREA_LAYOUT_STATE_FORMAT = 1;
|
|
6
|
+
export declare const DEFAULT_MIGRATION_MAX_RECORD_BYTES: number;
|
|
7
|
+
export declare const DEFAULT_MIGRATION_MAX_ROWS_PER_RECORD = 256;
|
|
8
|
+
export type LayoutPhase = "legacy-authoritative" | "copying" | "catching-up" | "cutover-ready" | "area-authoritative";
|
|
9
|
+
export interface SourceCursor {
|
|
10
|
+
generation: number;
|
|
11
|
+
sequence: number;
|
|
12
|
+
}
|
|
13
|
+
/** Durable control state. This is deliberately a small, checksummed file. */
|
|
14
|
+
export interface LayoutState {
|
|
15
|
+
format: typeof AREA_LAYOUT_STATE_FORMAT;
|
|
16
|
+
routerVersion: number;
|
|
17
|
+
phase: LayoutPhase;
|
|
18
|
+
sourceScope: string;
|
|
19
|
+
sourceGeneration: number;
|
|
20
|
+
sourceSequence: number;
|
|
21
|
+
sourceWalBytes: number;
|
|
22
|
+
perAreaCursor: Record<AreaId, SourceCursor>;
|
|
23
|
+
/** Durable ownership of the source-generation pin across CLI processes. */
|
|
24
|
+
sourcePinPath?: string;
|
|
25
|
+
activeLayoutEpoch?: string;
|
|
26
|
+
activeCommitWatermark?: number;
|
|
27
|
+
legacyMirrorWatermark?: number;
|
|
28
|
+
rollbackSafe: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface AreaLedgerMigrationOptions {
|
|
31
|
+
rootDir: string;
|
|
32
|
+
journalSlug: string;
|
|
33
|
+
resolver: AreaResolver;
|
|
34
|
+
/** The live legacy v3 store. It remains the only writer authority before cutover. */
|
|
35
|
+
legacyStore: StateStore<V3JournalState>;
|
|
36
|
+
maxRecordBytes?: number;
|
|
37
|
+
maxRowsPerRecord?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface MigrationParity {
|
|
40
|
+
rowCount: number;
|
|
41
|
+
rowDigest: string;
|
|
42
|
+
unionDigest: string;
|
|
43
|
+
tombstoneDigest: string;
|
|
44
|
+
metadataDigest: string;
|
|
45
|
+
}
|
|
46
|
+
export interface MigrationRunResult {
|
|
47
|
+
state: LayoutState;
|
|
48
|
+
projectedRows: number;
|
|
49
|
+
maxProjectedRecordBytes: number;
|
|
50
|
+
}
|
|
51
|
+
export interface AreaLedgerMigrationTestHooks {
|
|
52
|
+
/** Throws to model a process death after the named durable transition. */
|
|
53
|
+
afterDurablePhase?: (phase: string) => void;
|
|
54
|
+
beforeManifestCommit?: () => void;
|
|
55
|
+
afterManifestCommit?: () => void;
|
|
56
|
+
}
|
|
57
|
+
export declare function setAreaLedgerMigrationTestHooksForTest(hooks: AreaLedgerMigrationTestHooks | undefined): void;
|
|
58
|
+
/** The path is derived from the legacy scope, never from a mutable current pointer. */
|
|
59
|
+
export declare function areaLayoutDirectory(rootDir: string, journalSlug: string): string;
|
|
60
|
+
export declare function areaLayoutManifestPath(rootDir: string, journalSlug: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Read the last valid durable control state. A corrupt primary never makes
|
|
63
|
+
* area directories authoritative; a valid committed backup prevents a torn
|
|
64
|
+
* primary from silently reverting an already-cut-over outpost to legacy.
|
|
65
|
+
*/
|
|
66
|
+
export declare function readAreaLayoutState(rootDir: string, journalSlug: string): LayoutState | undefined;
|
|
67
|
+
export declare function resolveAreaLayoutAuthority(rootDir: string, journalSlug: string): "legacy" | "areas";
|
|
68
|
+
/** V3-only binaries must not be allowed to read a stale pre-cutover journal. */
|
|
69
|
+
export declare function assertV3OnlyPinAllowed(rootDir: string, journalSlug: string): void;
|
|
70
|
+
export declare class AreaLedgerMigration {
|
|
71
|
+
private readonly options;
|
|
72
|
+
private readonly maxRecordBytes;
|
|
73
|
+
private readonly maxRowsPerRecord;
|
|
74
|
+
private readonly areaIds;
|
|
75
|
+
private readonly ledger;
|
|
76
|
+
private pin;
|
|
77
|
+
private mirror;
|
|
78
|
+
private projectedRows;
|
|
79
|
+
private maxProjectedRecordBytes;
|
|
80
|
+
constructor(options: AreaLedgerMigrationOptions);
|
|
81
|
+
/** Phase 1 followed by an ordinary Phase 2 tail pass. Safe to resume indefinitely. */
|
|
82
|
+
copyAndCatchUp(): MigrationRunResult;
|
|
83
|
+
/** Phase 3. The caller must already have acquired coordinator maintenance admission. */
|
|
84
|
+
cutOver(cutoverBudgetMs?: number): LayoutState;
|
|
85
|
+
/**
|
|
86
|
+
* Apply an area-authoritative mutation and mirror it into a fresh v3
|
|
87
|
+
* generation. A crash after the area append and before this marker leaves
|
|
88
|
+
* `rollbackSafe=false`, which is intentionally observable to the launcher.
|
|
89
|
+
*/
|
|
90
|
+
reverseShadow(delta: AreaLedgerDelta): LayoutState;
|
|
91
|
+
/** Compose the area union into a new v3 generation before an old binary may run. */
|
|
92
|
+
composeBackForV3Rollback(): LayoutState;
|
|
93
|
+
/**
|
|
94
|
+
* Explicitly abandon an uncommitted copy/catch-up attempt. Area directories
|
|
95
|
+
* remain non-authoritative, and its durable source pin is retired so pruning
|
|
96
|
+
* is not held hostage by an abandoned operator run.
|
|
97
|
+
*/
|
|
98
|
+
abandon(): LayoutState;
|
|
99
|
+
verifyParity(legacy: SyncJournal): MigrationParity;
|
|
100
|
+
dispose(): void;
|
|
101
|
+
/** The post-cutover journal adapter uses this instead of opening legacy state. */
|
|
102
|
+
readAreaJournal(): SyncJournal;
|
|
103
|
+
private loadOrInitialize;
|
|
104
|
+
private withSource;
|
|
105
|
+
private projectSnapshot;
|
|
106
|
+
private appendProjection;
|
|
107
|
+
private replayTail;
|
|
108
|
+
private applyLegacyRecord;
|
|
109
|
+
private reconcile;
|
|
110
|
+
private isTailWarm;
|
|
111
|
+
private sourceIsAheadOfCursor;
|
|
112
|
+
private releaseSourcePin;
|
|
113
|
+
private requireAreaAuthority;
|
|
114
|
+
private persist;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=area-ledger-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-ledger-migration.d.ts","sourceRoot":"","sources":["../../src/sync/area-ledger-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy/catch-up/cutover bridge from the personal v3 journal to AreaLedger.
|
|
3
|
+
*
|
|
4
|
+
* The manifest, rather than the presence of area directories, is the only
|
|
5
|
+
* authority switch. This module intentionally has no watcher or scheduler:
|
|
6
|
+
* a runner can invoke `copyAndCatchUp` repeatedly and safely after a crash.
|
|
7
|
+
*/
|
|
8
|
+
import * as crypto from "node:crypto";
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { AreaLedger } from "./area-ledger.js";
|
|
12
|
+
export const AREA_LAYOUT_STATE_FORMAT = 1;
|
|
13
|
+
export const DEFAULT_MIGRATION_MAX_RECORD_BYTES = 256 * 1024;
|
|
14
|
+
export const DEFAULT_MIGRATION_MAX_ROWS_PER_RECORD = 256;
|
|
15
|
+
let testHooks = {};
|
|
16
|
+
export function setAreaLedgerMigrationTestHooksForTest(hooks) {
|
|
17
|
+
testHooks = hooks ?? {};
|
|
18
|
+
}
|
|
19
|
+
/** The path is derived from the legacy scope, never from a mutable current pointer. */
|
|
20
|
+
export function areaLayoutDirectory(rootDir, journalSlug) {
|
|
21
|
+
return path.join(rootDir, "sync-state-layouts", digest(`journal:${journalSlug}`));
|
|
22
|
+
}
|
|
23
|
+
export function areaLayoutManifestPath(rootDir, journalSlug) {
|
|
24
|
+
return path.join(areaLayoutDirectory(rootDir, journalSlug), "area-layout.json");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read the last valid durable control state. A corrupt primary never makes
|
|
28
|
+
* area directories authoritative; a valid committed backup prevents a torn
|
|
29
|
+
* primary from silently reverting an already-cut-over outpost to legacy.
|
|
30
|
+
*/
|
|
31
|
+
export function readAreaLayoutState(rootDir, journalSlug) {
|
|
32
|
+
const dir = areaLayoutDirectory(rootDir, journalSlug);
|
|
33
|
+
for (const candidate of ["area-layout.json", "area-layout.last-good.json"]) {
|
|
34
|
+
const state = readManifest(path.join(dir, candidate));
|
|
35
|
+
if (state)
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
export function resolveAreaLayoutAuthority(rootDir, journalSlug) {
|
|
41
|
+
return readAreaLayoutState(rootDir, journalSlug)?.phase === "area-authoritative" ? "areas" : "legacy";
|
|
42
|
+
}
|
|
43
|
+
/** V3-only binaries must not be allowed to read a stale pre-cutover journal. */
|
|
44
|
+
export function assertV3OnlyPinAllowed(rootDir, journalSlug) {
|
|
45
|
+
const state = readAreaLayoutState(rootDir, journalSlug);
|
|
46
|
+
if (state?.phase === "area-authoritative" && !state.rollbackSafe) {
|
|
47
|
+
throw new Error("area-ledger migration: refusing v3-only pin while reverse mirror is behind; compose back with the bridge first");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export class AreaLedgerMigration {
|
|
51
|
+
options;
|
|
52
|
+
maxRecordBytes;
|
|
53
|
+
maxRowsPerRecord;
|
|
54
|
+
areaIds;
|
|
55
|
+
ledger;
|
|
56
|
+
pin;
|
|
57
|
+
mirror;
|
|
58
|
+
projectedRows = 0;
|
|
59
|
+
maxProjectedRecordBytes = 0;
|
|
60
|
+
constructor(options) {
|
|
61
|
+
this.options = options;
|
|
62
|
+
this.maxRecordBytes = options.maxRecordBytes ?? DEFAULT_MIGRATION_MAX_RECORD_BYTES;
|
|
63
|
+
this.maxRowsPerRecord = options.maxRowsPerRecord ?? DEFAULT_MIGRATION_MAX_ROWS_PER_RECORD;
|
|
64
|
+
if (this.maxRecordBytes < 1024 || this.maxRowsPerRecord < 1) {
|
|
65
|
+
throw new Error("area-ledger migration: projection limits must be positive and bounded");
|
|
66
|
+
}
|
|
67
|
+
this.areaIds = options.resolver.layout.areas.map((area) => area.id);
|
|
68
|
+
this.ledger = AreaLedger.open({
|
|
69
|
+
rootDir: options.rootDir,
|
|
70
|
+
journalSlug: options.journalSlug,
|
|
71
|
+
layoutEpoch: 1,
|
|
72
|
+
areaIds: this.areaIds,
|
|
73
|
+
resolveArea: (key) => options.resolver.resolve(key),
|
|
74
|
+
// Projection records are deliberately small. Keep the source copy out
|
|
75
|
+
// of a compaction loop while it is being built; normal maintenance can
|
|
76
|
+
// compact each area after cutover.
|
|
77
|
+
maxRecordsBeforeCompaction: 1_000_000,
|
|
78
|
+
maxWalBytesBeforeCompaction: 256 * 1024 * 1024,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Phase 1 followed by an ordinary Phase 2 tail pass. Safe to resume indefinitely. */
|
|
82
|
+
copyAndCatchUp() {
|
|
83
|
+
let state = this.loadOrInitialize();
|
|
84
|
+
if (state.phase === "legacy-authoritative") {
|
|
85
|
+
this.pin ??= this.options.legacyStore.pinCurrentGeneration();
|
|
86
|
+
state = { ...this.withSource(state, this.pin.identity, "copying"), sourcePinPath: this.pin.path };
|
|
87
|
+
this.persist(state, "source-pinned");
|
|
88
|
+
}
|
|
89
|
+
if (state.phase === "copying") {
|
|
90
|
+
this.projectSnapshot(this.options.legacyStore.getState().journal, state);
|
|
91
|
+
state = { ...state, phase: "catching-up" };
|
|
92
|
+
this.persist(state, "snapshot-projected");
|
|
93
|
+
}
|
|
94
|
+
if (state.phase === "catching-up" || state.phase === "cutover-ready") {
|
|
95
|
+
state = this.replayTail(state);
|
|
96
|
+
if (state.phase === "cutover-ready")
|
|
97
|
+
state = { ...state, phase: "catching-up" };
|
|
98
|
+
this.persist(state, "tail-replayed");
|
|
99
|
+
}
|
|
100
|
+
return { state, projectedRows: this.projectedRows, maxProjectedRecordBytes: this.maxProjectedRecordBytes };
|
|
101
|
+
}
|
|
102
|
+
/** Phase 3. The caller must already have acquired coordinator maintenance admission. */
|
|
103
|
+
cutOver(cutoverBudgetMs = 1_000) {
|
|
104
|
+
const started = Date.now();
|
|
105
|
+
let state = this.copyAndCatchUp().state;
|
|
106
|
+
if (!this.isTailWarm(state))
|
|
107
|
+
return state;
|
|
108
|
+
const parity = this.verifyParity(this.options.legacyStore.getState().journal);
|
|
109
|
+
if (Date.now() - started > cutoverBudgetMs)
|
|
110
|
+
return state;
|
|
111
|
+
state = { ...state, phase: "cutover-ready" };
|
|
112
|
+
this.persist(state, "cutover-ready");
|
|
113
|
+
testHooks.beforeManifestCommit?.();
|
|
114
|
+
// This temp+fdatasync+rename is the sole authority transition.
|
|
115
|
+
state = {
|
|
116
|
+
...state,
|
|
117
|
+
phase: "area-authoritative",
|
|
118
|
+
activeLayoutEpoch: crypto.randomUUID(),
|
|
119
|
+
activeCommitWatermark: 0,
|
|
120
|
+
legacyMirrorWatermark: 0,
|
|
121
|
+
rollbackSafe: true,
|
|
122
|
+
};
|
|
123
|
+
this.mirror = structuredClone(this.options.legacyStore.getState().journal);
|
|
124
|
+
this.persist(state, "manifest-commit");
|
|
125
|
+
state = this.releaseSourcePin(state);
|
|
126
|
+
testHooks.afterManifestCommit?.();
|
|
127
|
+
// Prevent accidental removal by an apparently-unused local calculation.
|
|
128
|
+
void parity;
|
|
129
|
+
return state;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Apply an area-authoritative mutation and mirror it into a fresh v3
|
|
133
|
+
* generation. A crash after the area append and before this marker leaves
|
|
134
|
+
* `rollbackSafe=false`, which is intentionally observable to the launcher.
|
|
135
|
+
*/
|
|
136
|
+
reverseShadow(delta) {
|
|
137
|
+
let state = this.requireAreaAuthority();
|
|
138
|
+
const nextCommit = (state.activeCommitWatermark ?? 0) + 1;
|
|
139
|
+
// A reverse shadow is unsafe as soon as the area write may become durable.
|
|
140
|
+
// Persist that intent first so a process death cannot admit a v3-only
|
|
141
|
+
// reader to a stale legacy mirror.
|
|
142
|
+
state = { ...state, activeCommitWatermark: nextCommit, rollbackSafe: false };
|
|
143
|
+
this.persist(state, "area-commit-intent");
|
|
144
|
+
this.ledger.append(delta);
|
|
145
|
+
this.persist(state, "area-commit");
|
|
146
|
+
// Append the mirror delta under legacy's own lock. Replacing a stale
|
|
147
|
+
// aggregate snapshot here would erase an unrelated concurrent writer.
|
|
148
|
+
this.options.legacyStore.append(2, legacyDelta(delta));
|
|
149
|
+
this.mirror = structuredClone(this.options.legacyStore.getState().journal);
|
|
150
|
+
const parity = this.verifyParity(this.mirror);
|
|
151
|
+
state = {
|
|
152
|
+
...state,
|
|
153
|
+
legacyMirrorWatermark: nextCommit,
|
|
154
|
+
rollbackSafe: state.activeCommitWatermark === nextCommit && parity.rowCount >= 0,
|
|
155
|
+
};
|
|
156
|
+
this.persist(state, "reverse-shadow");
|
|
157
|
+
return state;
|
|
158
|
+
}
|
|
159
|
+
/** Compose the area union into a new v3 generation before an old binary may run. */
|
|
160
|
+
composeBackForV3Rollback() {
|
|
161
|
+
let state = this.requireAreaAuthority();
|
|
162
|
+
const composed = this.ledger.read();
|
|
163
|
+
this.verifyParity(composed);
|
|
164
|
+
this.options.legacyStore.replaceState({ journal: structuredClone(composed) });
|
|
165
|
+
this.mirror = structuredClone(composed);
|
|
166
|
+
const watermark = state.activeCommitWatermark ?? 0;
|
|
167
|
+
state = { ...state, legacyMirrorWatermark: watermark, rollbackSafe: true };
|
|
168
|
+
this.persist(state, "rollback-compose");
|
|
169
|
+
state = this.releaseSourcePin(state);
|
|
170
|
+
return state;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Explicitly abandon an uncommitted copy/catch-up attempt. Area directories
|
|
174
|
+
* remain non-authoritative, and its durable source pin is retired so pruning
|
|
175
|
+
* is not held hostage by an abandoned operator run.
|
|
176
|
+
*/
|
|
177
|
+
abandon() {
|
|
178
|
+
let state = this.loadOrInitialize();
|
|
179
|
+
if (state.phase === "area-authoritative") {
|
|
180
|
+
throw new Error("area-ledger migration: cannot abandon an authoritative layout; compose back instead");
|
|
181
|
+
}
|
|
182
|
+
state = { ...state, phase: "legacy-authoritative", perAreaCursor: {}, rollbackSafe: false };
|
|
183
|
+
this.persist(state, "abandoned");
|
|
184
|
+
return this.releaseSourcePin(state);
|
|
185
|
+
}
|
|
186
|
+
verifyParity(legacy) {
|
|
187
|
+
const areas = this.ledger.read();
|
|
188
|
+
const legacyKeys = Object.keys(legacy.files).sort();
|
|
189
|
+
const areaKeys = Object.keys(areas.files).sort();
|
|
190
|
+
if (legacyKeys.length !== areaKeys.length || legacyKeys.some((key, index) => key !== areaKeys[index])) {
|
|
191
|
+
throw new Error("area-ledger migration: row-set parity failed");
|
|
192
|
+
}
|
|
193
|
+
for (const key of legacyKeys) {
|
|
194
|
+
if (canonicalJson(legacy.files[key]) !== canonicalJson(areas.files[key])) {
|
|
195
|
+
throw new Error(`area-ledger migration: per-row parity failed for ${JSON.stringify(key)}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (canonicalJson(metadataOf(legacy)) !== canonicalJson(metadataOf(areas))) {
|
|
199
|
+
throw new Error("area-ledger migration: journal metadata parity failed");
|
|
200
|
+
}
|
|
201
|
+
const rowHash = crypto.createHash("sha256");
|
|
202
|
+
for (const [index, key] of legacyKeys.entries()) {
|
|
203
|
+
if (index > 0)
|
|
204
|
+
rowHash.update("\n");
|
|
205
|
+
rowHash.update(key);
|
|
206
|
+
rowHash.update("\n");
|
|
207
|
+
rowHash.update(canonicalJson(legacy.files[key]));
|
|
208
|
+
}
|
|
209
|
+
const tombstoneKeys = legacyKeys.filter((key) => legacy.files[key]?.removedAt !== undefined);
|
|
210
|
+
return {
|
|
211
|
+
rowCount: legacyKeys.length,
|
|
212
|
+
rowDigest: rowHash.digest("hex"),
|
|
213
|
+
unionDigest: digestLines(legacyKeys),
|
|
214
|
+
tombstoneDigest: digestLines(tombstoneKeys),
|
|
215
|
+
metadataDigest: digest(canonicalJson(metadataOf(legacy))),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
dispose() {
|
|
219
|
+
// Pins are intentionally owned by the durable layout manifest rather than
|
|
220
|
+
// this process-local object. Use abandon(), cutOver(), or composeBack...
|
|
221
|
+
// to retire them across CLI invocations.
|
|
222
|
+
this.pin = undefined;
|
|
223
|
+
}
|
|
224
|
+
/** The post-cutover journal adapter uses this instead of opening legacy state. */
|
|
225
|
+
readAreaJournal() {
|
|
226
|
+
return this.ledger.read();
|
|
227
|
+
}
|
|
228
|
+
loadOrInitialize() {
|
|
229
|
+
const state = readAreaLayoutState(this.options.rootDir, this.options.journalSlug);
|
|
230
|
+
if (state)
|
|
231
|
+
return state;
|
|
232
|
+
const source = this.options.legacyStore.getGenerationIdentity();
|
|
233
|
+
return this.withSource({
|
|
234
|
+
format: AREA_LAYOUT_STATE_FORMAT,
|
|
235
|
+
routerVersion: this.options.resolver.layout.routerVersion,
|
|
236
|
+
phase: "legacy-authoritative",
|
|
237
|
+
sourceScope: `journal:${this.options.journalSlug}`,
|
|
238
|
+
sourceGeneration: source.generation,
|
|
239
|
+
sourceSequence: source.lastRecordSequence,
|
|
240
|
+
sourceWalBytes: source.walBytes,
|
|
241
|
+
perAreaCursor: {},
|
|
242
|
+
rollbackSafe: false,
|
|
243
|
+
}, source, "legacy-authoritative");
|
|
244
|
+
}
|
|
245
|
+
withSource(state, source, phase) {
|
|
246
|
+
return {
|
|
247
|
+
...state,
|
|
248
|
+
phase,
|
|
249
|
+
sourceGeneration: source.generation,
|
|
250
|
+
sourceSequence: source.lastRecordSequence,
|
|
251
|
+
sourceWalBytes: source.walBytes,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
projectSnapshot(journal, state) {
|
|
255
|
+
const pending = new Map();
|
|
256
|
+
for (const { key, value } of this.options.legacyStore.iterateStateEntries(["journal", "files"])) {
|
|
257
|
+
const area = this.options.resolver.resolve(key);
|
|
258
|
+
if (!area)
|
|
259
|
+
throw new Error(`area-ledger migration: source key ${JSON.stringify(key)} has no area`);
|
|
260
|
+
let bucket = pending.get(area) ?? {};
|
|
261
|
+
const next = { ...bucket, [key]: value };
|
|
262
|
+
if (encodedBytes(next) > this.maxRecordBytes) {
|
|
263
|
+
if (Object.keys(bucket).length === 0) {
|
|
264
|
+
throw new Error("area-ledger migration: projected record exceeded bounded size");
|
|
265
|
+
}
|
|
266
|
+
this.appendProjection(area, bucket, state, false);
|
|
267
|
+
bucket = {};
|
|
268
|
+
}
|
|
269
|
+
bucket[key] = value;
|
|
270
|
+
pending.set(area, bucket);
|
|
271
|
+
if (Object.keys(bucket).length >= this.maxRowsPerRecord) {
|
|
272
|
+
this.appendProjection(area, bucket, state, false);
|
|
273
|
+
pending.set(area, {});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
for (const [area, rows] of pending)
|
|
277
|
+
if (Object.keys(rows).length > 0)
|
|
278
|
+
this.appendProjection(area, rows, state, true);
|
|
279
|
+
const identity = this.options.legacyStore.getGenerationIdentity();
|
|
280
|
+
for (const area of this.areaIds) {
|
|
281
|
+
state.perAreaCursor[area] ??= { generation: identity.generation, sequence: identity.lastRecordSequence };
|
|
282
|
+
}
|
|
283
|
+
// A metadata-only append is final and keeps its visibility independent of
|
|
284
|
+
// whichever area happened to receive the final source row.
|
|
285
|
+
this.ledger.append({ metadata: metadataOf(journal) });
|
|
286
|
+
}
|
|
287
|
+
appendProjection(area, rows, state, final) {
|
|
288
|
+
const bytes = encodedBytes(rows);
|
|
289
|
+
if (bytes > this.maxRecordBytes)
|
|
290
|
+
throw new Error("area-ledger migration: projected record exceeded bounded size");
|
|
291
|
+
this.ledger.append({ upserts: rows });
|
|
292
|
+
this.projectedRows += Object.keys(rows).length;
|
|
293
|
+
this.maxProjectedRecordBytes = Math.max(this.maxProjectedRecordBytes, bytes);
|
|
294
|
+
state.perAreaCursor[area] = {
|
|
295
|
+
generation: this.options.legacyStore.getGeneration(),
|
|
296
|
+
sequence: this.options.legacyStore.getLastRecordSequence(),
|
|
297
|
+
};
|
|
298
|
+
// Persist after every durable area append. `final` only documents that a
|
|
299
|
+
// later crash may replay a harmless duplicate, never an untracked row.
|
|
300
|
+
this.persist(state, final ? "area-cursor" : "area-cursor-chunk");
|
|
301
|
+
}
|
|
302
|
+
replayTail(state) {
|
|
303
|
+
const refresh = this.options.legacyStore.refresh();
|
|
304
|
+
// StateStore.open() has already materialised the latest WAL in a fresh CLI
|
|
305
|
+
// process, so refresh() can legitimately contain no records while this
|
|
306
|
+
// durable migration cursor is behind. Reconcile that materialised source
|
|
307
|
+
// rather than advancing the cursor past an unapplied tail.
|
|
308
|
+
if (refresh.recovered || this.sourceIsAheadOfCursor(state)) {
|
|
309
|
+
this.reconcile(this.options.legacyStore.getState().journal);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
for (const record of refresh.records)
|
|
313
|
+
this.applyLegacyRecord(record);
|
|
314
|
+
}
|
|
315
|
+
const identity = this.options.legacyStore.getGenerationIdentity();
|
|
316
|
+
for (const area of this.areaIds)
|
|
317
|
+
state.perAreaCursor[area] = { generation: identity.generation, sequence: identity.lastRecordSequence };
|
|
318
|
+
return this.withSource(state, identity, "catching-up");
|
|
319
|
+
}
|
|
320
|
+
applyLegacyRecord(record) {
|
|
321
|
+
if (record.type === 1) {
|
|
322
|
+
this.reconcile(record.payload.journal);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
if (record.type !== 2)
|
|
326
|
+
throw new Error(`area-ledger migration: unknown legacy WAL type ${record.type}`);
|
|
327
|
+
const delta = record.payload;
|
|
328
|
+
this.ledger.append({ upserts: delta.upserts, deletes: delta.deletes, metadata: {
|
|
329
|
+
...(delta.lastSync === undefined ? {} : { lastSync: delta.lastSync }),
|
|
330
|
+
...(delta.pulls === undefined ? {} : { pulls: delta.pulls }),
|
|
331
|
+
} });
|
|
332
|
+
}
|
|
333
|
+
reconcile(next) {
|
|
334
|
+
const current = this.ledger.read();
|
|
335
|
+
const upserts = {};
|
|
336
|
+
for (const [key, entry] of Object.entries(next.files)) {
|
|
337
|
+
if (canonicalJsonOrUndefined(current.files[key]) !== canonicalJson(entry))
|
|
338
|
+
upserts[key] = entry;
|
|
339
|
+
}
|
|
340
|
+
const deletes = Object.keys(current.files).filter((key) => !(key in next.files));
|
|
341
|
+
this.ledger.append({ upserts, deletes, metadata: metadataOf(next) });
|
|
342
|
+
}
|
|
343
|
+
isTailWarm(state) {
|
|
344
|
+
const identity = this.options.legacyStore.getGenerationIdentity();
|
|
345
|
+
return this.areaIds.every((area) => {
|
|
346
|
+
const cursor = state.perAreaCursor[area];
|
|
347
|
+
return cursor?.generation === identity.generation && cursor.sequence === identity.lastRecordSequence;
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
sourceIsAheadOfCursor(state) {
|
|
351
|
+
const identity = this.options.legacyStore.getGenerationIdentity();
|
|
352
|
+
return this.areaIds.some((area) => {
|
|
353
|
+
const cursor = state.perAreaCursor[area];
|
|
354
|
+
return cursor === undefined ||
|
|
355
|
+
cursor.generation !== identity.generation ||
|
|
356
|
+
cursor.sequence !== identity.lastRecordSequence;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
releaseSourcePin(state) {
|
|
360
|
+
const pinPath = state.sourcePinPath;
|
|
361
|
+
if (!pinPath)
|
|
362
|
+
return state;
|
|
363
|
+
this.pin?.release();
|
|
364
|
+
this.pin = undefined;
|
|
365
|
+
try {
|
|
366
|
+
fs.unlinkSync(pinPath);
|
|
367
|
+
fsyncDirectory(path.dirname(pinPath));
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
if (error.code !== "ENOENT") {
|
|
371
|
+
throw new Error(`area-ledger migration: cannot release source generation pin ${pinPath}`, { cause: error });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
const { sourcePinPath: _releasedPinPath, ...released } = state;
|
|
375
|
+
this.persist(released, "source-pin-released");
|
|
376
|
+
return released;
|
|
377
|
+
}
|
|
378
|
+
requireAreaAuthority() {
|
|
379
|
+
const state = readAreaLayoutState(this.options.rootDir, this.options.journalSlug);
|
|
380
|
+
if (!state || state.phase !== "area-authoritative") {
|
|
381
|
+
throw new Error("area-ledger migration: areas are not authoritative");
|
|
382
|
+
}
|
|
383
|
+
return state;
|
|
384
|
+
}
|
|
385
|
+
persist(state, durablePhase) {
|
|
386
|
+
const dir = areaLayoutDirectory(this.options.rootDir, this.options.journalSlug);
|
|
387
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
388
|
+
writeManifest(path.join(dir, "area-layout.json"), state);
|
|
389
|
+
writeManifest(path.join(dir, "area-layout.last-good.json"), state);
|
|
390
|
+
fs.writeFileSync(path.join(dir, "area-resolver.json"), this.options.resolver.toJson());
|
|
391
|
+
fsyncDirectory(dir);
|
|
392
|
+
testHooks.afterDurablePhase?.(durablePhase);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function legacyDelta(delta) {
|
|
396
|
+
return {
|
|
397
|
+
version: "2",
|
|
398
|
+
upserts: structuredClone(delta.upserts ?? {}),
|
|
399
|
+
deletes: [...(delta.deletes ?? [])],
|
|
400
|
+
...(delta.metadata?.lastSync === undefined ? {} : { lastSync: delta.metadata.lastSync }),
|
|
401
|
+
...(delta.metadata?.pulls === undefined ? {} : { pulls: structuredClone(delta.metadata.pulls) }),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
function metadataOf(journal) {
|
|
405
|
+
return { version: journal.version, lastSync: journal.lastSync, pulls: structuredClone(journal.pulls ?? []) };
|
|
406
|
+
}
|
|
407
|
+
function writeManifest(filePath, state) {
|
|
408
|
+
const body = canonicalJson(state);
|
|
409
|
+
const envelope = `${canonicalJson({ checksum: digest(body), state })}\n`;
|
|
410
|
+
const temporary = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${crypto.randomBytes(6).toString("hex")}.tmp`);
|
|
411
|
+
let fd;
|
|
412
|
+
try {
|
|
413
|
+
fd = fs.openSync(temporary, "wx");
|
|
414
|
+
fs.writeFileSync(fd, envelope);
|
|
415
|
+
fs.fdatasyncSync(fd);
|
|
416
|
+
fs.closeSync(fd);
|
|
417
|
+
fd = undefined;
|
|
418
|
+
fs.renameSync(temporary, filePath);
|
|
419
|
+
fsyncDirectory(path.dirname(filePath));
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
if (fd !== undefined)
|
|
423
|
+
fs.closeSync(fd);
|
|
424
|
+
try {
|
|
425
|
+
fs.rmSync(temporary, { force: true });
|
|
426
|
+
}
|
|
427
|
+
catch { /* preserve original error */ }
|
|
428
|
+
throw new Error(`area-ledger migration: cannot durably publish ${filePath}`, { cause: error });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function readManifest(filePath) {
|
|
432
|
+
try {
|
|
433
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
434
|
+
if (typeof parsed.checksum !== "string" || !isLayoutState(parsed.state))
|
|
435
|
+
return undefined;
|
|
436
|
+
return parsed.checksum === digest(canonicalJson(parsed.state)) ? parsed.state : undefined;
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
if (error.code === "ENOENT")
|
|
440
|
+
return undefined;
|
|
441
|
+
return undefined;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function isLayoutState(value) {
|
|
445
|
+
if (typeof value !== "object" || value === null)
|
|
446
|
+
return false;
|
|
447
|
+
const state = value;
|
|
448
|
+
return state.format === AREA_LAYOUT_STATE_FORMAT &&
|
|
449
|
+
typeof state.routerVersion === "number" &&
|
|
450
|
+
typeof state.phase === "string" &&
|
|
451
|
+
["legacy-authoritative", "copying", "catching-up", "cutover-ready", "area-authoritative"].includes(state.phase) &&
|
|
452
|
+
typeof state.sourceScope === "string" &&
|
|
453
|
+
Number.isSafeInteger(state.sourceGeneration) && Number.isSafeInteger(state.sourceSequence) && Number.isSafeInteger(state.sourceWalBytes) &&
|
|
454
|
+
typeof state.perAreaCursor === "object" && state.perAreaCursor !== null &&
|
|
455
|
+
(state.sourcePinPath === undefined || typeof state.sourcePinPath === "string") &&
|
|
456
|
+
typeof state.rollbackSafe === "boolean";
|
|
457
|
+
}
|
|
458
|
+
function encodedBytes(value) {
|
|
459
|
+
return Buffer.byteLength(canonicalJson(value), "utf8");
|
|
460
|
+
}
|
|
461
|
+
function digest(value) {
|
|
462
|
+
return crypto.createHash("sha256").update(value).digest("hex");
|
|
463
|
+
}
|
|
464
|
+
function digestLines(values) {
|
|
465
|
+
const hash = crypto.createHash("sha256");
|
|
466
|
+
for (const [index, value] of values.entries()) {
|
|
467
|
+
if (index > 0)
|
|
468
|
+
hash.update("\n");
|
|
469
|
+
hash.update(value);
|
|
470
|
+
}
|
|
471
|
+
return hash.digest("hex");
|
|
472
|
+
}
|
|
473
|
+
function fsyncDirectory(dir) {
|
|
474
|
+
let fd;
|
|
475
|
+
try {
|
|
476
|
+
fd = fs.openSync(dir, "r");
|
|
477
|
+
fs.fsyncSync(fd);
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
const code = error.code;
|
|
481
|
+
if (!["EINVAL", "ENOTSUP", "EOPNOTSUPP", "EPERM"].includes(code ?? ""))
|
|
482
|
+
throw error;
|
|
483
|
+
}
|
|
484
|
+
finally {
|
|
485
|
+
if (fd !== undefined)
|
|
486
|
+
fs.closeSync(fd);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function canonicalJson(value) {
|
|
490
|
+
if (value === null || typeof value === "boolean" || typeof value === "string")
|
|
491
|
+
return JSON.stringify(value);
|
|
492
|
+
if (typeof value === "number")
|
|
493
|
+
return JSON.stringify(value);
|
|
494
|
+
if (Array.isArray(value))
|
|
495
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
496
|
+
if (typeof value === "object" && value !== null) {
|
|
497
|
+
const object = value;
|
|
498
|
+
return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(",")}}`;
|
|
499
|
+
}
|
|
500
|
+
throw new Error("area-ledger migration: manifest contains an unsupported value");
|
|
501
|
+
}
|
|
502
|
+
function canonicalJsonOrUndefined(value) {
|
|
503
|
+
return value === undefined ? undefined : canonicalJson(value);
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=area-ledger-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-ledger-migration.js","sourceRoot":"","sources":["../../src/sync/area-ledger-migration.ts"],"names":[],"mappings":"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"}
|