audit-tools 0.39.4 → 0.39.6
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/shared/quota/claimRegistry.d.ts.map +1 -1
- package/dist/shared/quota/claimRegistry.js +20 -48
- package/dist/shared/quota/claimRegistry.js.map +1 -1
- package/dist/shared/quota/recordStore.d.ts +25 -0
- package/dist/shared/quota/recordStore.d.ts.map +1 -0
- package/dist/shared/quota/recordStore.js +65 -0
- package/dist/shared/quota/recordStore.js.map +1 -0
- package/dist/shared/quota/reservationLedger.d.ts.map +1 -1
- package/dist/shared/quota/reservationLedger.js +19 -43
- package/dist/shared/quota/reservationLedger.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claimRegistry.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/claimRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claimRegistry.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/claimRegistry.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AA6B5C;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAM,MAAyB,EACrD,OAAO,GAAE,MAAsB;IAMjC,OAAO,CAAC,OAAO;IAIf;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAejE;;;;;;;;;;;;;OAaG;IACG,SAAS,CACb,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAuB3E;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAexD;;;;;;;;;OASG;IACG,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBjF;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrE;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnE;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBvC,4EAA4E;IACtE,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC;IAIrC;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;IAYzC;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAOlD"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { withFileLock, STALE_LOCK_MS } from "./fileLock.js";
|
|
3
|
-
import {
|
|
4
|
-
function mintOwnerToken() {
|
|
5
|
-
return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
6
|
-
}
|
|
2
|
+
import { mintToken, readRecordMap, writeRecordMap } from "./recordStore.js";
|
|
7
3
|
function isClaimRecord(value) {
|
|
8
4
|
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
9
5
|
return false;
|
|
@@ -13,42 +9,18 @@ function isClaimRecord(value) {
|
|
|
13
9
|
typeof obj.heartbeatAt === "number" &&
|
|
14
10
|
Number.isFinite(obj.heartbeatAt));
|
|
15
11
|
}
|
|
16
|
-
// Read the registry, degrading ANY malformed/absent state to an empty map
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
12
|
+
// Read the registry, degrading ANY malformed/absent state to an empty map (the
|
|
13
|
+
// shared store substrate does the degrading). A corrupt registry must never throw
|
|
14
|
+
// into the dispatch loop — at worst a claim is re-granted, which the
|
|
15
|
+
// lock-serialized write then makes consistent again. Only well-formed individual
|
|
16
|
+
// records are retained; junk entries are dropped silently.
|
|
20
17
|
async function readClaimMap(registryPath) {
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
raw = await readFile(registryPath, "utf8");
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return {};
|
|
27
|
-
}
|
|
28
|
-
let parsed;
|
|
29
|
-
try {
|
|
30
|
-
parsed = JSON.parse(raw);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return {};
|
|
34
|
-
}
|
|
35
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
36
|
-
return {};
|
|
37
|
-
const out = {};
|
|
38
|
-
for (const [nodeId, record] of Object.entries(parsed)) {
|
|
39
|
-
if (isClaimRecord(record))
|
|
40
|
-
out[nodeId] = record;
|
|
41
|
-
}
|
|
42
|
-
return out;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Atomic (temp + rename, via the shared `writeJsonFile`). `readClaimMap` degrades
|
|
46
|
-
* malformed content to `{}` — "no node is claimed" — so a torn registry lets two
|
|
47
|
-
* dispatch loops claim the same node. Same fail-open class as INV-QD-15.
|
|
48
|
-
*/
|
|
49
|
-
async function writeClaimMap(registryPath, claims) {
|
|
50
|
-
await writeJsonFile(registryPath, claims);
|
|
18
|
+
return readRecordMap(registryPath, (record) => isClaimRecord(record) ? record : undefined);
|
|
51
19
|
}
|
|
20
|
+
// Writes go straight to `writeRecordMap` (atomic temp + rename). The fail-open
|
|
21
|
+
// direction that matters here: `readClaimMap` degrades malformed content to `{}` —
|
|
22
|
+
// "no node is claimed" — so a torn registry lets two dispatch loops claim the same
|
|
23
|
+
// node. Same class as INV-QD-15.
|
|
52
24
|
/**
|
|
53
25
|
* File-backed claim registry. The caller owns the path (and may point two
|
|
54
26
|
* coordinators at the same file — that is the whole point). Every mutating op
|
|
@@ -89,9 +61,9 @@ export class ClaimRegistry {
|
|
|
89
61
|
if (existing && !this.isStale(existing, now)) {
|
|
90
62
|
return { acquired: false, heldBy: existing.ownerToken };
|
|
91
63
|
}
|
|
92
|
-
const ownerToken =
|
|
64
|
+
const ownerToken = mintToken();
|
|
93
65
|
claims[nodeId] = { ownerToken, poolId, heartbeatAt: now };
|
|
94
|
-
await
|
|
66
|
+
await writeRecordMap(this.registryPath, claims);
|
|
95
67
|
return { acquired: true, ownerToken };
|
|
96
68
|
});
|
|
97
69
|
}
|
|
@@ -122,13 +94,13 @@ export class ClaimRegistry {
|
|
|
122
94
|
if (existing && !this.isStale(existing, now) && existing.poolId !== poolId) {
|
|
123
95
|
continue;
|
|
124
96
|
}
|
|
125
|
-
const ownerToken =
|
|
97
|
+
const ownerToken = mintToken();
|
|
126
98
|
claims[nodeId] = { ownerToken, poolId, heartbeatAt: now };
|
|
127
99
|
granted.push(nodeId);
|
|
128
100
|
ownerTokenByNode[nodeId] = ownerToken;
|
|
129
101
|
}
|
|
130
102
|
if (granted.length > 0)
|
|
131
|
-
await
|
|
103
|
+
await writeRecordMap(this.registryPath, claims);
|
|
132
104
|
return { granted, ownerTokenByNode };
|
|
133
105
|
});
|
|
134
106
|
}
|
|
@@ -150,7 +122,7 @@ export class ClaimRegistry {
|
|
|
150
122
|
}
|
|
151
123
|
}
|
|
152
124
|
if (removed > 0)
|
|
153
|
-
await
|
|
125
|
+
await writeRecordMap(this.registryPath, claims);
|
|
154
126
|
return removed;
|
|
155
127
|
});
|
|
156
128
|
}
|
|
@@ -176,7 +148,7 @@ export class ClaimRegistry {
|
|
|
176
148
|
}
|
|
177
149
|
}
|
|
178
150
|
if (released.length > 0)
|
|
179
|
-
await
|
|
151
|
+
await writeRecordMap(this.registryPath, claims);
|
|
180
152
|
return released;
|
|
181
153
|
});
|
|
182
154
|
}
|
|
@@ -193,7 +165,7 @@ export class ClaimRegistry {
|
|
|
193
165
|
if (!existing || existing.ownerToken !== ownerToken)
|
|
194
166
|
return false;
|
|
195
167
|
existing.heartbeatAt = this.now();
|
|
196
|
-
await
|
|
168
|
+
await writeRecordMap(this.registryPath, claims);
|
|
197
169
|
return true;
|
|
198
170
|
});
|
|
199
171
|
}
|
|
@@ -209,7 +181,7 @@ export class ClaimRegistry {
|
|
|
209
181
|
if (!existing || existing.ownerToken !== ownerToken)
|
|
210
182
|
return false;
|
|
211
183
|
delete claims[nodeId];
|
|
212
|
-
await
|
|
184
|
+
await writeRecordMap(this.registryPath, claims);
|
|
213
185
|
return true;
|
|
214
186
|
});
|
|
215
187
|
}
|
|
@@ -231,7 +203,7 @@ export class ClaimRegistry {
|
|
|
231
203
|
}
|
|
232
204
|
}
|
|
233
205
|
if (reclaimed.length > 0)
|
|
234
|
-
await
|
|
206
|
+
await writeRecordMap(this.registryPath, claims);
|
|
235
207
|
return reclaimed;
|
|
236
208
|
});
|
|
237
209
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claimRegistry.js","sourceRoot":"","sources":["../../../src/shared/quota/claimRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claimRegistry.js","sourceRoot":"","sources":["../../../src/shared/quota/claimRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opaque, process-unique token. Both stores minted this identically: a claim's
|
|
3
|
+
* `ownerToken` and a lease's `leaseId` are the same kind of thing — a value only
|
|
4
|
+
* the minting caller can present back to release what it took.
|
|
5
|
+
*/
|
|
6
|
+
export declare function mintToken(): string;
|
|
7
|
+
/**
|
|
8
|
+
* Read a `Record<string, T>` JSON store, degrading ANY malformed or absent state
|
|
9
|
+
* to an empty map. A corrupt store must never throw into the dispatch loop; the
|
|
10
|
+
* failure direction is fail-open (a claim re-granted / a reservation missed),
|
|
11
|
+
* the same class as INV-QD-15.
|
|
12
|
+
*
|
|
13
|
+
* `pick` decides what a key's value becomes, returning `undefined` to drop the
|
|
14
|
+
* key entirely. It is a PICK rather than a type guard on purpose: the ledger
|
|
15
|
+
* filters junk leases out of an array and keeps the survivors, so a whole-value
|
|
16
|
+
* guard would wrongly discard a key over one bad element.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readRecordMap<T>(path: string, pick: (value: unknown) => T | undefined): Promise<Record<string, T>>;
|
|
19
|
+
/**
|
|
20
|
+
* Atomic (temp + rename, via the shared `writeJsonFile`). A truncating in-place
|
|
21
|
+
* write would leave a permanently-torn store behind a crash mid-write, which the
|
|
22
|
+
* readers above then degrade to `{}`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function writeRecordMap<T>(path: string, map: Record<string, T>): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=recordStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordStore.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/recordStore.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAoB5B;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { writeJsonFile } from "../io/json.js";
|
|
3
|
+
// The JSON-map store substrate shared by claimRegistry (nodeId → claim) and
|
|
4
|
+
// reservationLedger (resourceKey → leases[]). Both had byte-copied the token
|
|
5
|
+
// mint and the atomic write, and both spell the same read→parse→degrade→filter
|
|
6
|
+
// skeleton. Only the per-key admission differs, so that is the parameter.
|
|
7
|
+
//
|
|
8
|
+
// What deliberately does NOT live here: the domain guards and the two classes.
|
|
9
|
+
// A claim (single grant, heartbeat staleness) and a lease (multi-per-key, cost
|
|
10
|
+
// summation, TTL) are different domain objects, and `withFileLock` is already
|
|
11
|
+
// single-sourced in ./fileLock.js — neither store carries lock scaffolding of
|
|
12
|
+
// its own.
|
|
13
|
+
/**
|
|
14
|
+
* Opaque, process-unique token. Both stores minted this identically: a claim's
|
|
15
|
+
* `ownerToken` and a lease's `leaseId` are the same kind of thing — a value only
|
|
16
|
+
* the minting caller can present back to release what it took.
|
|
17
|
+
*/
|
|
18
|
+
export function mintToken() {
|
|
19
|
+
return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Read a `Record<string, T>` JSON store, degrading ANY malformed or absent state
|
|
23
|
+
* to an empty map. A corrupt store must never throw into the dispatch loop; the
|
|
24
|
+
* failure direction is fail-open (a claim re-granted / a reservation missed),
|
|
25
|
+
* the same class as INV-QD-15.
|
|
26
|
+
*
|
|
27
|
+
* `pick` decides what a key's value becomes, returning `undefined` to drop the
|
|
28
|
+
* key entirely. It is a PICK rather than a type guard on purpose: the ledger
|
|
29
|
+
* filters junk leases out of an array and keeps the survivors, so a whole-value
|
|
30
|
+
* guard would wrongly discard a key over one bad element.
|
|
31
|
+
*/
|
|
32
|
+
export async function readRecordMap(path, pick) {
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = await readFile(path, "utf8");
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
48
|
+
return {};
|
|
49
|
+
const out = {};
|
|
50
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
51
|
+
const kept = pick(value);
|
|
52
|
+
if (kept !== undefined)
|
|
53
|
+
out[key] = kept;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Atomic (temp + rename, via the shared `writeJsonFile`). A truncating in-place
|
|
59
|
+
* write would leave a permanently-torn store behind a crash mid-write, which the
|
|
60
|
+
* readers above then degrade to `{}`.
|
|
61
|
+
*/
|
|
62
|
+
export async function writeRecordMap(path, map) {
|
|
63
|
+
await writeJsonFile(path, map);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=recordStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordStore.js","sourceRoot":"","sources":["../../../src/shared/quota/recordStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,0EAA0E;AAC1E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,8EAA8E;AAC9E,WAAW;AAEX;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAuC;IAEvC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtF,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,GAAsB;IAEtB,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reservationLedger.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reservationLedger.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAe;IAC9B,qIAAqI;IACrI,WAAW,EAAE,MAAM,CAAC;IACpB,uGAAuG;IACvG,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wFAAwF;IACxF,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC;;;;;;;;;;OAUG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AA+FpD;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,MAAyB,EACrD,YAAY,GAAE,MAAsB;IAMtC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAqDtD;;;;;;;;OAQG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlD,4FAA4F;IACtF,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvD;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;CAOrC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { tmpdir } from "node:os";
|
|
3
2
|
import { dirname, join } from "node:path";
|
|
4
|
-
import { writeJsonFile } from "../io/json.js";
|
|
5
3
|
import { withFileLock, STALE_LOCK_MS } from "./fileLock.js";
|
|
4
|
+
import { mintToken, readRecordMap, writeRecordMap } from "./recordStore.js";
|
|
6
5
|
import { getQuotaStatePath } from "./state.js";
|
|
7
6
|
// Shared, lock-guarded token-reservation ledger — the proactive layer of the
|
|
8
7
|
// dispatch admission-control model (spec/dispatch-quota.md).
|
|
@@ -44,9 +43,6 @@ import { getQuotaStatePath } from "./state.js";
|
|
|
44
43
|
* can depress headroom (20 min — the task-claims execution-lease envelope).
|
|
45
44
|
*/
|
|
46
45
|
export const DISPATCH_LEASE_TTL_MS = 20 * 60_000;
|
|
47
|
-
function mintLeaseId() {
|
|
48
|
-
return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
49
|
-
}
|
|
50
46
|
function isLease(value) {
|
|
51
47
|
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
52
48
|
return false;
|
|
@@ -62,43 +58,23 @@ function isLease(value) {
|
|
|
62
58
|
// ledger must never throw into the dispatch loop — at worst a reservation is missed
|
|
63
59
|
// (over-admission), which the reactive floor still catches. Only well-formed leases
|
|
64
60
|
// are retained; junk is dropped silently.
|
|
61
|
+
// The pick FILTERS junk leases out of a key's array and keeps the survivors,
|
|
62
|
+
// dropping the key only when nothing well-formed remains. That is why the shared
|
|
63
|
+
// substrate takes a pick rather than a type guard: a whole-value guard would
|
|
64
|
+
// discard an entire resource key over one malformed lease.
|
|
65
65
|
async function readLedger(ledgerPath) {
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
raw = await readFile(ledgerPath, "utf8");
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
return {};
|
|
72
|
-
}
|
|
73
|
-
let parsed;
|
|
74
|
-
try {
|
|
75
|
-
parsed = JSON.parse(raw);
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
return {};
|
|
79
|
-
}
|
|
80
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
81
|
-
return {};
|
|
82
|
-
const out = {};
|
|
83
|
-
for (const [resourceKey, leases] of Object.entries(parsed)) {
|
|
66
|
+
return readRecordMap(ledgerPath, (leases) => {
|
|
84
67
|
if (!Array.isArray(leases))
|
|
85
|
-
|
|
68
|
+
return undefined;
|
|
86
69
|
const kept = leases.filter(isLease);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
return out;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Atomic (temp + rename, via the shared `writeJsonFile`). A truncating in-place
|
|
94
|
-
* write leaves a permanently-torn ledger behind a crash mid-write, and `readLedger`
|
|
95
|
-
* degrades malformed content to `{}` — i.e. "zero outstanding leases" — so the
|
|
96
|
-
* failure direction is over-admission. Same fail-open class as the quota-state
|
|
97
|
-
* torn read (INV-QD-15).
|
|
98
|
-
*/
|
|
99
|
-
async function writeLedger(ledgerPath, ledger) {
|
|
100
|
-
await writeJsonFile(ledgerPath, ledger);
|
|
70
|
+
return kept.length > 0 ? kept : undefined;
|
|
71
|
+
});
|
|
101
72
|
}
|
|
73
|
+
// Writes go straight to `writeRecordMap` (atomic temp + rename) — a truncating
|
|
74
|
+
// in-place write would leave a permanently-torn ledger behind a crash mid-write,
|
|
75
|
+
// and `readLedger` degrades malformed content to `{}`, i.e. "zero outstanding
|
|
76
|
+
// leases", so the failure direction is over-admission. Same fail-open class as the
|
|
77
|
+
// quota-state torn read (INV-QD-15).
|
|
102
78
|
/** Sum of non-expired leases for a key. Expired leases (crashed consumers) don't count. */
|
|
103
79
|
function sumOutstanding(leases, now) {
|
|
104
80
|
if (!leases)
|
|
@@ -241,16 +217,16 @@ export class ReservationLedger {
|
|
|
241
217
|
if (!admitted) {
|
|
242
218
|
// Persist the prune even on a blocked admission so expired leases don't
|
|
243
219
|
// linger and depress headroom for the next attempt.
|
|
244
|
-
await
|
|
220
|
+
await writeRecordMap(this.ledgerPath, ledger);
|
|
245
221
|
return { admitted: false, leaseId: null, constraints: outcomes, binding, anyOutstanding };
|
|
246
222
|
}
|
|
247
|
-
const leaseId =
|
|
223
|
+
const leaseId = mintToken();
|
|
248
224
|
const expiresAt = now + ttl;
|
|
249
225
|
for (const outcome of outcomes) {
|
|
250
226
|
const lease = { leaseId, cost: outcome.cost, poolId: input.poolId, expiresAt };
|
|
251
227
|
ledger[outcome.resourceKey] = [...(ledger[outcome.resourceKey] ?? []), lease];
|
|
252
228
|
}
|
|
253
|
-
await
|
|
229
|
+
await writeRecordMap(this.ledgerPath, ledger);
|
|
254
230
|
return { admitted: true, leaseId, constraints: outcomes, binding, anyOutstanding };
|
|
255
231
|
});
|
|
256
232
|
}
|
|
@@ -278,7 +254,7 @@ export class ReservationLedger {
|
|
|
278
254
|
else
|
|
279
255
|
delete ledger[resourceKey];
|
|
280
256
|
}
|
|
281
|
-
await
|
|
257
|
+
await writeRecordMap(this.ledgerPath, ledger);
|
|
282
258
|
return removed;
|
|
283
259
|
});
|
|
284
260
|
}
|
|
@@ -300,7 +276,7 @@ export class ReservationLedger {
|
|
|
300
276
|
const now = this.now();
|
|
301
277
|
const { ledger, dropped } = pruneExpired(await readLedger(this.ledgerPath), now);
|
|
302
278
|
if (dropped > 0)
|
|
303
|
-
await
|
|
279
|
+
await writeRecordMap(this.ledgerPath, ledger);
|
|
304
280
|
return dropped;
|
|
305
281
|
});
|
|
306
282
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reservationLedger.js","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reservationLedger.js","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"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"}
|