@indigoai-us/hq-cloud 6.15.79 → 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/journal-store.test.js +42 -1
- package/dist/journal-store.test.js.map +1 -1
- package/dist/journal.d.ts +12 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +103 -6
- 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/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 +37 -0
- package/dist/sync/state-store.d.ts.map +1 -1
- package/dist/sync/state-store.js +109 -1
- package/dist/sync/state-store.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,97 @@
|
|
|
1
|
+
export declare const RECONCILE_CURSOR_FORMAT = 1;
|
|
2
|
+
export type ReconcilePhase = "local-discovery" | "remote-list" | "diff" | "apply";
|
|
3
|
+
export type ReconcileCursor = {
|
|
4
|
+
routerVersion: number;
|
|
5
|
+
epoch: string;
|
|
6
|
+
areaId: string;
|
|
7
|
+
phase: ReconcilePhase;
|
|
8
|
+
localDirectoryStack?: readonly string[];
|
|
9
|
+
localAfterPath?: string;
|
|
10
|
+
remotePrefix?: string;
|
|
11
|
+
remoteContinuation?: string;
|
|
12
|
+
journalAfterKey?: string;
|
|
13
|
+
remoteHighWater?: string;
|
|
14
|
+
};
|
|
15
|
+
export type ReconcileCursorState = {
|
|
16
|
+
format: typeof RECONCILE_CURSOR_FORMAT;
|
|
17
|
+
cursor?: ReconcileCursor;
|
|
18
|
+
completedEpoch?: string;
|
|
19
|
+
};
|
|
20
|
+
export type ReconcileCursorStoreOptions = {
|
|
21
|
+
rootDir: string;
|
|
22
|
+
journalSlug: string;
|
|
23
|
+
layoutEpoch: number;
|
|
24
|
+
areaId: string;
|
|
25
|
+
initialCursor?: ReconcileCursor;
|
|
26
|
+
};
|
|
27
|
+
export type ReconcilePathOutcome = {
|
|
28
|
+
path: string;
|
|
29
|
+
/** True only after the journal/ledger outcome for this path is durable. */
|
|
30
|
+
durable: boolean;
|
|
31
|
+
};
|
|
32
|
+
/** Passed by a bounded apply caller after its journal/ledger writes commit. */
|
|
33
|
+
export type ReconcileApplyCheckpoint = {
|
|
34
|
+
store: ReconcileCursorStore;
|
|
35
|
+
cursor: ReconcileCursor;
|
|
36
|
+
};
|
|
37
|
+
export type ReconcileSliceBudget = {
|
|
38
|
+
/** Rollout default from the parallel-sync design. */
|
|
39
|
+
maxEntries?: number;
|
|
40
|
+
/** Bound candidate buffering independently of entry count. */
|
|
41
|
+
maxBytes?: number;
|
|
42
|
+
/** CPU wall-clock budget before returning to the scheduler mailbox. */
|
|
43
|
+
maxWallClockMs?: number;
|
|
44
|
+
};
|
|
45
|
+
export type ReconcileSliceEntry = {
|
|
46
|
+
path: string;
|
|
47
|
+
bytes: number;
|
|
48
|
+
};
|
|
49
|
+
export type ReconcileSliceResult<T extends ReconcileSliceEntry> = {
|
|
50
|
+
entries: readonly T[];
|
|
51
|
+
bytes: number;
|
|
52
|
+
yielded: boolean;
|
|
53
|
+
cancelled: boolean;
|
|
54
|
+
/** One look-ahead candidate retained for the next slice; never dropped. */
|
|
55
|
+
deferred?: T;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* StateStore-backed cursor for exactly one area. Independent areas use
|
|
59
|
+
* independent StateStore scopes, so checkpointing a slow area never holds a
|
|
60
|
+
* mutation lock for another area.
|
|
61
|
+
*/
|
|
62
|
+
export declare class ReconcileCursorStore {
|
|
63
|
+
private readonly store;
|
|
64
|
+
readonly areaId: string;
|
|
65
|
+
private constructor();
|
|
66
|
+
static open(options: ReconcileCursorStoreOptions): ReconcileCursorStore;
|
|
67
|
+
read(): ReconcileCursorState;
|
|
68
|
+
/** Persist a discovery/list/diff checkpoint; it intentionally owns no path lease. */
|
|
69
|
+
checkpointDiscovery(cursor: ReconcileCursor): void;
|
|
70
|
+
/**
|
|
71
|
+
* Persist an apply checkpoint only after every path in the slice has a
|
|
72
|
+
* durable outcome. The ordering is enforced at the API boundary so callers
|
|
73
|
+
* cannot accidentally save progress before journal/ledger commits.
|
|
74
|
+
*/
|
|
75
|
+
checkpointApply(cursor: ReconcileCursor, outcomes: readonly ReconcilePathOutcome[]): void;
|
|
76
|
+
/** A completed area is never rediscovered when the same epoch restarts. */
|
|
77
|
+
complete(epoch: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* A remote LIST continuation is valid only for the remote high-water that
|
|
80
|
+
* produced it. A changed high-water restarts remote listing, rather than
|
|
81
|
+
* accepting a continuation from an invalidated inventory.
|
|
82
|
+
*/
|
|
83
|
+
invalidateRemoteContinuation(epoch: string, remoteHighWater?: string): ReconcileCursor | undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Pull no more than one scheduler slice from an iterable inventory. The
|
|
87
|
+
* iterable is consumed lazily; callers can feed a 562k-file generator without
|
|
88
|
+
* turning it into an array. An over-budget first entry still runs so a single
|
|
89
|
+
* large file cannot livelock the cursor.
|
|
90
|
+
*/
|
|
91
|
+
export declare function takeBoundedReconcileSlice<T extends ReconcileSliceEntry>(entries: Iterable<T>, options?: ReconcileSliceBudget & {
|
|
92
|
+
now?: () => number;
|
|
93
|
+
isCancelled?: () => boolean;
|
|
94
|
+
}): ReconcileSliceResult<T>;
|
|
95
|
+
/** Advance an apply cursor only after the caller's path outcomes are durable. */
|
|
96
|
+
export declare function checkpointReconcileApply(checkpoint: ReconcileApplyCheckpoint | undefined, paths: Iterable<string>): void;
|
|
97
|
+
//# sourceMappingURL=reconcile-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-cursor.d.ts","sourceRoot":"","sources":["../../src/sync/reconcile-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable, per-area progress for a resumable full reconcile.
|
|
3
|
+
*
|
|
4
|
+
* A cursor is deliberately small: inventories and apply candidates remain
|
|
5
|
+
* streaming inputs, never serialized into the journal. This lets a restart
|
|
6
|
+
* continue an individual area without retaining a whole-vault listing in
|
|
7
|
+
* memory.
|
|
8
|
+
*/
|
|
9
|
+
import { StateStore } from "./state-store.js";
|
|
10
|
+
export const RECONCILE_CURSOR_FORMAT = 1;
|
|
11
|
+
const CURSOR_SET = 1;
|
|
12
|
+
const CURSOR_COMPLETE = 2;
|
|
13
|
+
/**
|
|
14
|
+
* StateStore-backed cursor for exactly one area. Independent areas use
|
|
15
|
+
* independent StateStore scopes, so checkpointing a slow area never holds a
|
|
16
|
+
* mutation lock for another area.
|
|
17
|
+
*/
|
|
18
|
+
export class ReconcileCursorStore {
|
|
19
|
+
store;
|
|
20
|
+
areaId;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
assertAreaId(options.areaId);
|
|
23
|
+
if (!Number.isSafeInteger(options.layoutEpoch) || options.layoutEpoch < 1) {
|
|
24
|
+
throw new Error("reconcile cursor layoutEpoch must be a positive safe integer");
|
|
25
|
+
}
|
|
26
|
+
if (options.journalSlug.length === 0)
|
|
27
|
+
throw new Error("reconcile cursor journalSlug is required");
|
|
28
|
+
if (options.initialCursor)
|
|
29
|
+
assertCursor(options.initialCursor, options.areaId);
|
|
30
|
+
this.areaId = options.areaId;
|
|
31
|
+
this.store = StateStore.open({
|
|
32
|
+
rootDir: options.rootDir,
|
|
33
|
+
scopeId: `reconcile-cursor:${options.journalSlug}:${options.layoutEpoch}:${options.areaId}`,
|
|
34
|
+
initialState: {
|
|
35
|
+
format: RECONCILE_CURSOR_FORMAT,
|
|
36
|
+
...(options.initialCursor ? { cursor: cloneCursor(options.initialCursor) } : {}),
|
|
37
|
+
},
|
|
38
|
+
reduce: reduceCursorRecord,
|
|
39
|
+
validateRecord: validateCursorRecord,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
static open(options) {
|
|
43
|
+
return new ReconcileCursorStore(options);
|
|
44
|
+
}
|
|
45
|
+
read() {
|
|
46
|
+
this.store.refresh();
|
|
47
|
+
return cloneState(this.store.getState());
|
|
48
|
+
}
|
|
49
|
+
/** Persist a discovery/list/diff checkpoint; it intentionally owns no path lease. */
|
|
50
|
+
checkpointDiscovery(cursor) {
|
|
51
|
+
assertCursor(cursor, this.areaId);
|
|
52
|
+
if (cursor.phase === "apply") {
|
|
53
|
+
throw new Error("apply cursors require durable path outcomes before advancing");
|
|
54
|
+
}
|
|
55
|
+
this.store.append(CURSOR_SET, { cursor: cloneCursor(cursor) });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Persist an apply checkpoint only after every path in the slice has a
|
|
59
|
+
* durable outcome. The ordering is enforced at the API boundary so callers
|
|
60
|
+
* cannot accidentally save progress before journal/ledger commits.
|
|
61
|
+
*/
|
|
62
|
+
checkpointApply(cursor, outcomes) {
|
|
63
|
+
assertCursor(cursor, this.areaId);
|
|
64
|
+
if (cursor.phase !== "apply")
|
|
65
|
+
throw new Error("only an apply cursor may checkpoint path outcomes");
|
|
66
|
+
if (outcomes.some((outcome) => outcome.path.length === 0 || !outcome.durable)) {
|
|
67
|
+
throw new Error("reconcile cursor cannot advance before every path outcome is durable");
|
|
68
|
+
}
|
|
69
|
+
this.store.append(CURSOR_SET, { cursor: cloneCursor(cursor) });
|
|
70
|
+
}
|
|
71
|
+
/** A completed area is never rediscovered when the same epoch restarts. */
|
|
72
|
+
complete(epoch) {
|
|
73
|
+
if (epoch.length === 0)
|
|
74
|
+
throw new Error("reconcile cursor epoch is required");
|
|
75
|
+
this.store.append(CURSOR_COMPLETE, { epoch });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A remote LIST continuation is valid only for the remote high-water that
|
|
79
|
+
* produced it. A changed high-water restarts remote listing, rather than
|
|
80
|
+
* accepting a continuation from an invalidated inventory.
|
|
81
|
+
*/
|
|
82
|
+
invalidateRemoteContinuation(epoch, remoteHighWater) {
|
|
83
|
+
const state = this.read();
|
|
84
|
+
const cursor = state.cursor;
|
|
85
|
+
if (!cursor || cursor.epoch !== epoch)
|
|
86
|
+
return cursor;
|
|
87
|
+
const { remoteContinuation: _discardedContinuation, ...withoutContinuation } = cursor;
|
|
88
|
+
const next = {
|
|
89
|
+
...withoutContinuation,
|
|
90
|
+
phase: "remote-list",
|
|
91
|
+
...(remoteHighWater === undefined ? {} : { remoteHighWater }),
|
|
92
|
+
};
|
|
93
|
+
this.checkpointDiscovery(next);
|
|
94
|
+
return next;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pull no more than one scheduler slice from an iterable inventory. The
|
|
99
|
+
* iterable is consumed lazily; callers can feed a 562k-file generator without
|
|
100
|
+
* turning it into an array. An over-budget first entry still runs so a single
|
|
101
|
+
* large file cannot livelock the cursor.
|
|
102
|
+
*/
|
|
103
|
+
export function takeBoundedReconcileSlice(entries, options = {}) {
|
|
104
|
+
const maxEntries = options.maxEntries ?? 512;
|
|
105
|
+
const maxBytes = options.maxBytes ?? 8 * 1024 * 1024;
|
|
106
|
+
const maxWallClockMs = options.maxWallClockMs ?? 50;
|
|
107
|
+
if (!Number.isSafeInteger(maxEntries) || maxEntries < 1)
|
|
108
|
+
throw new Error("reconcile slice maxEntries must be positive");
|
|
109
|
+
if (!Number.isFinite(maxBytes) || maxBytes < 1)
|
|
110
|
+
throw new Error("reconcile slice maxBytes must be positive");
|
|
111
|
+
if (!Number.isFinite(maxWallClockMs) || maxWallClockMs < 0)
|
|
112
|
+
throw new Error("reconcile slice maxWallClockMs must be non-negative");
|
|
113
|
+
const now = options.now ?? Date.now;
|
|
114
|
+
const startedAt = now();
|
|
115
|
+
const selected = [];
|
|
116
|
+
let bytes = 0;
|
|
117
|
+
// Do not use `for...of` here: returning a bounded result closes a generator
|
|
118
|
+
// through Iterator.return(), which drops the remainder needed by the next
|
|
119
|
+
// scheduler slice.
|
|
120
|
+
const iterator = entries[Symbol.iterator]();
|
|
121
|
+
while (true) {
|
|
122
|
+
const next = iterator.next();
|
|
123
|
+
if (next.done)
|
|
124
|
+
break;
|
|
125
|
+
const entry = next.value;
|
|
126
|
+
if (options.isCancelled?.())
|
|
127
|
+
return { entries: selected, bytes, yielded: true, cancelled: true, deferred: entry };
|
|
128
|
+
if (!Number.isFinite(entry.bytes) || entry.bytes < 0)
|
|
129
|
+
throw new Error(`reconcile slice entry ${JSON.stringify(entry.path)} has invalid bytes`);
|
|
130
|
+
const countExceeded = selected.length >= maxEntries;
|
|
131
|
+
const byteExceeded = selected.length > 0 && bytes + entry.bytes > maxBytes;
|
|
132
|
+
const timeExceeded = selected.length > 0 && now() - startedAt >= maxWallClockMs;
|
|
133
|
+
if (countExceeded || byteExceeded || timeExceeded) {
|
|
134
|
+
return { entries: selected, bytes, yielded: true, cancelled: false, deferred: entry };
|
|
135
|
+
}
|
|
136
|
+
selected.push(entry);
|
|
137
|
+
bytes += entry.bytes;
|
|
138
|
+
}
|
|
139
|
+
return { entries: selected, bytes, yielded: false, cancelled: false };
|
|
140
|
+
}
|
|
141
|
+
/** Advance an apply cursor only after the caller's path outcomes are durable. */
|
|
142
|
+
export function checkpointReconcileApply(checkpoint, paths) {
|
|
143
|
+
if (!checkpoint)
|
|
144
|
+
return;
|
|
145
|
+
checkpoint.store.checkpointApply(checkpoint.cursor, [...new Set(paths)].map((path) => ({ path, durable: true })));
|
|
146
|
+
}
|
|
147
|
+
function reduceCursorRecord(state, record) {
|
|
148
|
+
if (record.type === CURSOR_SET) {
|
|
149
|
+
const cursor = record.payload.cursor;
|
|
150
|
+
// StateStore refreshes before applying an append, so this reducer is the
|
|
151
|
+
// fencing point for records written by an older worker/process.
|
|
152
|
+
if (state.completedEpoch === cursor.epoch ||
|
|
153
|
+
(state.cursor !== undefined && state.cursor.epoch !== cursor.epoch)) {
|
|
154
|
+
return state;
|
|
155
|
+
}
|
|
156
|
+
return { ...state, cursor: cloneCursor(cursor), completedEpoch: undefined };
|
|
157
|
+
}
|
|
158
|
+
if (record.type === CURSOR_COMPLETE) {
|
|
159
|
+
const epoch = record.payload.epoch;
|
|
160
|
+
if (state.cursor?.epoch !== epoch)
|
|
161
|
+
return state;
|
|
162
|
+
return { ...state, cursor: undefined, completedEpoch: epoch };
|
|
163
|
+
}
|
|
164
|
+
throw new Error("reconcile cursor contains an unknown record");
|
|
165
|
+
}
|
|
166
|
+
function validateCursorRecord(record) {
|
|
167
|
+
if (record.type === CURSOR_SET && isCursorSetRecord(record.payload)) {
|
|
168
|
+
assertCursor(record.payload.cursor);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (record.type === CURSOR_COMPLETE && isCompleteRecord(record.payload))
|
|
172
|
+
return;
|
|
173
|
+
throw new Error("reconcile cursor record is invalid");
|
|
174
|
+
}
|
|
175
|
+
function isCursorSetRecord(value) {
|
|
176
|
+
return typeof value === "object" && value !== null && "cursor" in value;
|
|
177
|
+
}
|
|
178
|
+
function isCompleteRecord(value) {
|
|
179
|
+
return typeof value === "object" && value !== null && typeof value.epoch === "string" && value.epoch.length > 0;
|
|
180
|
+
}
|
|
181
|
+
function assertCursor(cursor, expectedAreaId) {
|
|
182
|
+
if (!cursor || !Number.isSafeInteger(cursor.routerVersion) || cursor.routerVersion < 1)
|
|
183
|
+
throw new Error("reconcile cursor routerVersion must be a positive safe integer");
|
|
184
|
+
if (cursor.epoch.length === 0)
|
|
185
|
+
throw new Error("reconcile cursor epoch is required");
|
|
186
|
+
assertAreaId(cursor.areaId);
|
|
187
|
+
if (expectedAreaId !== undefined && cursor.areaId !== expectedAreaId)
|
|
188
|
+
throw new Error("reconcile cursor area does not match its store");
|
|
189
|
+
if (!["local-discovery", "remote-list", "diff", "apply"].includes(cursor.phase))
|
|
190
|
+
throw new Error("reconcile cursor phase is invalid");
|
|
191
|
+
for (const value of [cursor.localAfterPath, cursor.remotePrefix, cursor.remoteContinuation, cursor.journalAfterKey, cursor.remoteHighWater]) {
|
|
192
|
+
if (value !== undefined && typeof value !== "string")
|
|
193
|
+
throw new Error("reconcile cursor fields must be strings");
|
|
194
|
+
}
|
|
195
|
+
if (cursor.localDirectoryStack !== undefined && (!Array.isArray(cursor.localDirectoryStack) || cursor.localDirectoryStack.some((part) => typeof part !== "string"))) {
|
|
196
|
+
throw new Error("reconcile cursor localDirectoryStack must contain strings");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function assertAreaId(areaId) {
|
|
200
|
+
if (areaId.length === 0 || areaId.includes("\0"))
|
|
201
|
+
throw new Error("reconcile cursor areaId is required");
|
|
202
|
+
}
|
|
203
|
+
function cloneCursor(cursor) {
|
|
204
|
+
return {
|
|
205
|
+
...cursor,
|
|
206
|
+
...(cursor.localDirectoryStack ? { localDirectoryStack: [...cursor.localDirectoryStack] } : {}),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function cloneState(state) {
|
|
210
|
+
return {
|
|
211
|
+
...state,
|
|
212
|
+
...(state.cursor ? { cursor: cloneCursor(state.cursor) } : {}),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=reconcile-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-cursor.js","sourceRoot":"","sources":["../../src/sync/reconcile-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-cursor.test.d.ts","sourceRoot":"","sources":["../../src/sync/reconcile-cursor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { ReconcileCursorStore, checkpointReconcileApply, takeBoundedReconcileSlice, } from "./reconcile-cursor.js";
|
|
6
|
+
const roots = [];
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
for (const root of roots.splice(0))
|
|
9
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
10
|
+
});
|
|
11
|
+
function root() {
|
|
12
|
+
const value = fs.mkdtempSync(path.join(os.tmpdir(), "hq-reconcile-cursor-test-"));
|
|
13
|
+
roots.push(value);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function cursor(phase, overrides = {}) {
|
|
17
|
+
return { routerVersion: 1, epoch: "epoch-1", areaId: "root:notes", phase, ...overrides };
|
|
18
|
+
}
|
|
19
|
+
function open(dir) {
|
|
20
|
+
return ReconcileCursorStore.open({ rootDir: dir, journalSlug: "personal", layoutEpoch: 1, areaId: "root:notes" });
|
|
21
|
+
}
|
|
22
|
+
describe("ReconcileCursorStore", () => {
|
|
23
|
+
it("resumes each discovery phase and does not revisit a completed area", () => {
|
|
24
|
+
const dir = root();
|
|
25
|
+
const first = open(dir);
|
|
26
|
+
first.checkpointDiscovery(cursor("local-discovery", { localDirectoryStack: ["notes"], localAfterPath: "notes/a.md" }));
|
|
27
|
+
expect(open(dir).read().cursor).toMatchObject({ phase: "local-discovery", localAfterPath: "notes/a.md" });
|
|
28
|
+
open(dir).checkpointDiscovery(cursor("remote-list", { remotePrefix: "notes/", remoteContinuation: "page-2" }));
|
|
29
|
+
expect(open(dir).read().cursor).toMatchObject({ phase: "remote-list", remoteContinuation: "page-2" });
|
|
30
|
+
open(dir).checkpointDiscovery(cursor("diff", { journalAfterKey: "notes/a.md", remoteHighWater: "etag-9" }));
|
|
31
|
+
expect(open(dir).read().cursor).toMatchObject({ phase: "diff", journalAfterKey: "notes/a.md" });
|
|
32
|
+
open(dir).complete("epoch-1");
|
|
33
|
+
expect(open(dir).read()).toEqual({ format: 1, completedEpoch: "epoch-1" });
|
|
34
|
+
});
|
|
35
|
+
it("only advances apply after each delete/tombstone outcome is durable", () => {
|
|
36
|
+
const dir = root();
|
|
37
|
+
const store = open(dir);
|
|
38
|
+
expect(() => store.checkpointApply(cursor("apply", { journalAfterKey: "notes/deleted.md" }), [
|
|
39
|
+
{ path: "notes/deleted.md", durable: false },
|
|
40
|
+
])).toThrow("before every path outcome is durable");
|
|
41
|
+
expect(store.read().cursor).toBeUndefined();
|
|
42
|
+
store.checkpointApply(cursor("apply", { journalAfterKey: "notes/deleted.md" }), [
|
|
43
|
+
{ path: "notes/deleted.md", durable: true },
|
|
44
|
+
{ path: "notes/tombstone.md", durable: true },
|
|
45
|
+
]);
|
|
46
|
+
expect(open(dir).read().cursor).toMatchObject({ phase: "apply", journalAfterKey: "notes/deleted.md" });
|
|
47
|
+
});
|
|
48
|
+
it("advances an entrypoint apply cursor only after the caller reports durable paths", () => {
|
|
49
|
+
const dir = root();
|
|
50
|
+
const store = open(dir);
|
|
51
|
+
checkpointReconcileApply({ store, cursor: cursor("apply", { journalAfterKey: "notes/tombstone.md" }) }, ["notes/upload.md", "notes/tombstone.md"]);
|
|
52
|
+
expect(open(dir).read().cursor).toMatchObject({ phase: "apply", journalAfterKey: "notes/tombstone.md" });
|
|
53
|
+
});
|
|
54
|
+
it("invalidates a remote continuation when a later inventory epoch supersedes it", () => {
|
|
55
|
+
const dir = root();
|
|
56
|
+
const store = open(dir);
|
|
57
|
+
store.checkpointDiscovery(cursor("remote-list", { remotePrefix: "notes/", remoteContinuation: "page-8", remoteHighWater: "old" }));
|
|
58
|
+
expect(store.invalidateRemoteContinuation("epoch-1", "new")).toMatchObject({
|
|
59
|
+
phase: "remote-list",
|
|
60
|
+
remoteHighWater: "new",
|
|
61
|
+
});
|
|
62
|
+
const resumed = open(dir).read().cursor;
|
|
63
|
+
expect(resumed).not.toHaveProperty("remoteContinuation");
|
|
64
|
+
expect(resumed.remoteHighWater).toBe("new");
|
|
65
|
+
});
|
|
66
|
+
it("keeps cursor state isolated per area", () => {
|
|
67
|
+
const dir = root();
|
|
68
|
+
const alpha = ReconcileCursorStore.open({ rootDir: dir, journalSlug: "personal", layoutEpoch: 1, areaId: "root:alpha" });
|
|
69
|
+
const beta = ReconcileCursorStore.open({ rootDir: dir, journalSlug: "personal", layoutEpoch: 1, areaId: "root:beta" });
|
|
70
|
+
alpha.checkpointDiscovery({ routerVersion: 1, epoch: "one", areaId: "root:alpha", phase: "diff" });
|
|
71
|
+
expect(beta.read().cursor).toBeUndefined();
|
|
72
|
+
});
|
|
73
|
+
it("ignores stale checkpoints and completion records from an older epoch", () => {
|
|
74
|
+
const dir = root();
|
|
75
|
+
const current = open(dir);
|
|
76
|
+
const stale = open(dir);
|
|
77
|
+
current.checkpointDiscovery(cursor("diff"));
|
|
78
|
+
current.complete("epoch-1");
|
|
79
|
+
current.checkpointDiscovery({ ...cursor("diff"), epoch: "epoch-2" });
|
|
80
|
+
stale.checkpointDiscovery(cursor("remote-list", { remoteContinuation: "late" }));
|
|
81
|
+
stale.complete("epoch-1");
|
|
82
|
+
expect(open(dir).read()).toMatchObject({
|
|
83
|
+
cursor: { epoch: "epoch-2", phase: "diff" },
|
|
84
|
+
});
|
|
85
|
+
current.complete("epoch-2");
|
|
86
|
+
expect(open(dir).read()).toEqual({ format: 1, completedEpoch: "epoch-2" });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("takeBoundedReconcileSlice", () => {
|
|
90
|
+
it("yields by count, bytes, and wall-clock without materializing the inventory", () => {
|
|
91
|
+
function* inventory() {
|
|
92
|
+
for (let index = 0; index < 562_000; index += 1)
|
|
93
|
+
yield { path: `notes/${index}.md`, bytes: 1 };
|
|
94
|
+
}
|
|
95
|
+
const largeInventoryResult = takeBoundedReconcileSlice(inventory(), { maxEntries: 512 });
|
|
96
|
+
expect(largeInventoryResult.entries).toHaveLength(512);
|
|
97
|
+
expect(largeInventoryResult).toMatchObject({ bytes: 512, yielded: true });
|
|
98
|
+
expect(takeBoundedReconcileSlice([{ path: "one", bytes: 8 }, { path: "two", bytes: 8 }], { maxBytes: 10 })).toMatchObject({ entries: [{ path: "one", bytes: 8 }], bytes: 8, yielded: true });
|
|
99
|
+
let time = 0;
|
|
100
|
+
const result = takeBoundedReconcileSlice([{ path: "one", bytes: 1 }, { path: "two", bytes: 1 }], {
|
|
101
|
+
maxWallClockMs: 50,
|
|
102
|
+
now: () => (time += 50),
|
|
103
|
+
});
|
|
104
|
+
expect(result).toMatchObject({ entries: [{ path: "one", bytes: 1 }], yielded: true });
|
|
105
|
+
});
|
|
106
|
+
it("checks cancellation between every file and returns the completed prefix", () => {
|
|
107
|
+
let checks = 0;
|
|
108
|
+
const result = takeBoundedReconcileSlice([
|
|
109
|
+
{ path: "notes/one", bytes: 1 },
|
|
110
|
+
{ path: "notes/two", bytes: 1 },
|
|
111
|
+
], { isCancelled: () => ++checks === 2 });
|
|
112
|
+
expect(result).toEqual({
|
|
113
|
+
entries: [{ path: "notes/one", bytes: 1 }],
|
|
114
|
+
bytes: 1,
|
|
115
|
+
yielded: true,
|
|
116
|
+
cancelled: true,
|
|
117
|
+
deferred: { path: "notes/two", bytes: 1 },
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
it("retains a generator remainder after yielding a bounded slice", () => {
|
|
121
|
+
function* inventory() {
|
|
122
|
+
yield { path: "notes/one", bytes: 1 };
|
|
123
|
+
yield { path: "notes/two", bytes: 1 };
|
|
124
|
+
yield { path: "notes/three", bytes: 1 };
|
|
125
|
+
}
|
|
126
|
+
const source = inventory();
|
|
127
|
+
const first = takeBoundedReconcileSlice(source, { maxEntries: 1 });
|
|
128
|
+
expect(first.deferred).toEqual({ path: "notes/two", bytes: 1 });
|
|
129
|
+
function* resumed() {
|
|
130
|
+
yield first.deferred;
|
|
131
|
+
yield* source;
|
|
132
|
+
}
|
|
133
|
+
expect(takeBoundedReconcileSlice(resumed(), { maxEntries: 10 }).entries).toEqual([
|
|
134
|
+
{ path: "notes/two", bytes: 1 },
|
|
135
|
+
{ path: "notes/three", bytes: 1 },
|
|
136
|
+
]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=reconcile-cursor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-cursor.test.js","sourceRoot":"","sources":["../../src/sync/reconcile-cursor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -80,6 +80,30 @@ export interface StateStoreRecoveryStats {
|
|
|
80
80
|
/** Largest single snapshot payload or WAL frame buffered during recovery. */
|
|
81
81
|
maxReadBytes: number;
|
|
82
82
|
}
|
|
83
|
+
/** A stable identity for one complete snapshot/WAL generation. */
|
|
84
|
+
export interface StateStoreGenerationIdentity {
|
|
85
|
+
generation: number;
|
|
86
|
+
lastRecordSequence: number;
|
|
87
|
+
walBytes: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A durable lease on an immutable source generation.
|
|
91
|
+
*
|
|
92
|
+
* Rotation normally keeps only a short rollback history. Migration uses this
|
|
93
|
+
* lease to make an older source generation part of that history until the
|
|
94
|
+
* copy/catch-up transaction has finished (or has explicitly been abandoned).
|
|
95
|
+
*/
|
|
96
|
+
export interface StateStoreGenerationPin {
|
|
97
|
+
readonly identity: StateStoreGenerationIdentity;
|
|
98
|
+
/** Durable pin file, persisted by long-running migration control state. */
|
|
99
|
+
readonly path: string;
|
|
100
|
+
release(): void;
|
|
101
|
+
}
|
|
102
|
+
/** One bounded value yielded from a keyed state projection. */
|
|
103
|
+
export interface StateStoreStateEntry {
|
|
104
|
+
key: string;
|
|
105
|
+
value: unknown;
|
|
106
|
+
}
|
|
83
107
|
export interface StateStoreRepairResult {
|
|
84
108
|
recoveredGeneration: number;
|
|
85
109
|
recoveredWalBytes: number;
|
|
@@ -153,6 +177,19 @@ export declare class StateStore<T> {
|
|
|
153
177
|
getGeneration(): number;
|
|
154
178
|
getLastRecordSequence(): number;
|
|
155
179
|
getRecoveryStats(): StateStoreRecoveryStats;
|
|
180
|
+
getGenerationIdentity(): StateStoreGenerationIdentity;
|
|
181
|
+
/**
|
|
182
|
+
* Persist a generation pin while holding append.lock. The pin is a tiny
|
|
183
|
+
* checksummed file in the store directory, so a concurrent compactor sees it
|
|
184
|
+
* before deciding which immutable generations may be pruned.
|
|
185
|
+
*/
|
|
186
|
+
pinCurrentGeneration(): StateStoreGenerationPin;
|
|
187
|
+
/**
|
|
188
|
+
* Iterate a keyed projection without exposing its mutable backing object.
|
|
189
|
+
* Each yielded row is cloned independently, allowing migration clients to
|
|
190
|
+
* keep projected WAL records bounded even when the source journal is huge.
|
|
191
|
+
*/
|
|
192
|
+
iterateStateEntries(path: readonly string[]): IterableIterator<StateStoreStateEntry>;
|
|
156
193
|
append(type: number, payload: unknown, flags?: number): StateStoreAppendResult;
|
|
157
194
|
/**
|
|
158
195
|
* Async lock acquisition for callback-originated work. The write itself
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/sync/state-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/sync/state-store.ts"],"names":[],"mappings":"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"}
|