pipework 0.19.1 → 0.20.0
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/CHANGELOG.md +16 -0
- package/dist/data/query/sql/sql.d.ts.map +1 -1
- package/dist/data/query/sql/sql.js +103 -75
- package/dist/data/query/sql/sql.js.map +1 -1
- package/dist/test/fingerprint.d.ts +56 -0
- package/dist/test/fingerprint.d.ts.map +1 -0
- package/dist/test/fingerprint.js +84 -0
- package/dist/test/fingerprint.js.map +1 -0
- package/dist/test/namespace.d.ts +12 -0
- package/dist/test/namespace.d.ts.map +1 -1
- package/dist/test/namespace.js +16 -0
- package/dist/test/namespace.js.map +1 -1
- package/dist/test/reap.d.ts +3 -1
- package/dist/test/reap.d.ts.map +1 -1
- package/dist/test/reap.js +95 -2
- package/dist/test/reap.js.map +1 -1
- package/dist/test/setup.d.ts +8 -0
- package/dist/test/setup.d.ts.map +1 -1
- package/dist/test/setup.js +187 -53
- package/dist/test/setup.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.20.0
|
|
4
|
+
|
|
5
|
+
- **The test template is now shared across processes and keyed by its contents, so a suite pays for its migration stack once per run instead of once per test file.** The per-file test database has been a `CREATE DATABASE … WITH TEMPLATE` clone since 0.16 (#321), but the template it cloned from was cached in a module-local map and named after `process.pid` plus a per-process nonce. Both are process-scoped, and a consumer running vitest with `pool: 'forks'` and `isolate: true` gets a fresh process per test file — so every file did an unconditional `DROP DATABASE` / `CREATE DATABASE` / full migration replay for a byte-identical result. One reporting consumer measured 504 files × (111 migrations + extensions + framework tables); on a constrained box the suite did not finish at all.
|
|
6
|
+
|
|
7
|
+
A template is now named for the hash of everything that determines its contents: the migrations folder's bytes, the migrations table, the extensions, the trace and audit config, the connecting role, the pipework version, and the calendar day. Any process — in this run or a later one — that wants that exact content clones the template that is already there. Per-file **clone** databases are unchanged: still keyed by pid and run nonce, still dropped at teardown. Nothing about isolation between test files changes; only the read-only template stops being rebuilt.
|
|
8
|
+
|
|
9
|
+
Content keying makes invalidation automatic rather than manual. Edit a migration and the hash changes, so you ask for a template that does not exist yet and it is built; the old one is named something nobody will ask for again, and the reaper drops it. The day is part of the hash because trace and audit day partitions are provisioned relative to "today" — a template built yesterday is missing today's partitions.
|
|
10
|
+
|
|
11
|
+
Concurrency is handled with two advisory locks in the same family as the existing reap machinery. Every process holds a SHARE-mode lock on the template's content key for its whole life, and the reaper drops a template only under an EXCLUSIVE one, so a template can never be pulled out from under a process sitting between its readiness check and its clone. A separate EXCLUSIVE build lock means N processes starting together produce one template and one migration replay, not N. A template records a marker row as the last act of a successful build: a database without it is the wreckage of a builder that died mid-migration, and is rebuilt rather than cloned.
|
|
12
|
+
|
|
13
|
+
There is deliberately no fallback. If the shared template cannot be built or validated, test setup fails loudly — quietly reverting to a private per-process build would re-hide exactly the cost this removes. Issue #340.
|
|
14
|
+
|
|
15
|
+
- **Test databases and templates now live in separate namespaces**: clones stay under `<project>_test_`, templates move to `<project>_tmpl_`. The app role a test connects as is content-keyed to its template (`<project>_app_<database>_<fingerprint>`) rather than carrying a pid. If you assert on these names, they have changed. Old-format leftovers from previous runs are reaped normally.
|
|
16
|
+
|
|
17
|
+
- **Fix: `pipe.sql` no longer overflows the stack or spends quadratic time on deeply composed queries.** Building a query by folding fragments — `acc = sql\`${acc} union all ${next}\`` — nests one `SQL` per fragment, and the builder recursed once per level: past a few thousand fragments it died with `RangeError: Maximum call stack size exceeded`, and before reaching that limit it accumulated the query text with repeated `+=` across the recursion, which is quadratic in total string work. One reported case burned 26 minutes at 100% CPU and 44 GB RSS before throwing. The builder now traverses with an explicit work stack and joins the text once, so depth costs heap instead of call frames and assembly is linear. A 200,000-fragment composition builds in well under a second. Emitted SQL, parameter order, and typings are unchanged. Issue #339.
|
|
18
|
+
|
|
3
19
|
## 0.19.1
|
|
4
20
|
|
|
5
21
|
- **Fix: `pipework check` no longer exits 0 when `pipework.config.ts` cannot be loaded.** A config file that exists but throws on import — a missing `DATABASE_URL`, a bad import, any evaluation error — was swallowed by a bare `catch` in module-scope resolution. `check` then fell back to filesystem discovery, and in a package with no `pnpm-workspace.yaml` that resolves to *no* modules, so lint, type check, doctrine and the flow checks never ran and the run still printed `All checks passed` and exited 0. As a gate, that is the worst possible failure direction: a broken config, or any environment that cannot resolve one, passed silently, and nothing distinguished "lint ran clean" from "lint never ran". The load failure is now its own reported step (`Config load`) that fails the run; the remaining steps still execute so one run surfaces everything it can, but none of them can green it. Issue #335.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAM,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAW,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,kBAAkB;IAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,CAAwB;CAC5D;AAED,MAAM,MAAM,KAAK,GACd,MAAM,GACN,KAAK,GACL,IAAI,GACJ,SAAS,GACT,IAAI,GACJ,KAAK,GACL,WAAW,GACX,GAAG,CAAC;AAEP,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACjD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,iBAAiB,CAAC;IACrF,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErG,MAAM,WAAW,KAAK;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK;IAC9C,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IAC1B,MAAM,IAAI,GAAG,CAAC;IACd,mBAAmB,CAAC,IAAI,OAAO,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,20 +16,6 @@ export class FakePrimitiveParam {
|
|
|
16
16
|
export function isSQLWrapper(value) {
|
|
17
17
|
return value !== null && value !== undefined && typeof value.getSQL === 'function';
|
|
18
18
|
}
|
|
19
|
-
function mergeQueries(queries) {
|
|
20
|
-
const result = { sql: '', params: [] };
|
|
21
|
-
for (const query of queries) {
|
|
22
|
-
result.sql += query.sql;
|
|
23
|
-
result.params.push(...query.params);
|
|
24
|
-
if (query.typings?.length) {
|
|
25
|
-
if (!result.typings) {
|
|
26
|
-
result.typings = [];
|
|
27
|
-
}
|
|
28
|
-
result.typings.push(...query.typings);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
19
|
export class StringChunk {
|
|
34
20
|
static [entityKind] = 'StringChunk';
|
|
35
21
|
value;
|
|
@@ -79,122 +65,164 @@ export class SQL {
|
|
|
79
65
|
paramStartIndex: _config.paramStartIndex || { value: 0 },
|
|
80
66
|
});
|
|
81
67
|
const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, } = config;
|
|
82
|
-
|
|
68
|
+
// Traversal is iterative, not recursive: composed queries nest one `SQL`
|
|
69
|
+
// per fragment, so folding N fragments together produces depth-N nesting
|
|
70
|
+
// and self-recursion here blows the stack well before Postgres would
|
|
71
|
+
// object to the query. The work stack keeps depth off the call stack, and
|
|
72
|
+
// collecting the text in an array joined once at the end keeps the string
|
|
73
|
+
// work linear instead of quadratic.
|
|
74
|
+
const stack = [];
|
|
75
|
+
const pushChunks = (source, frameInlineParams) => {
|
|
76
|
+
for (let i = source.length - 1; i >= 0; i--) {
|
|
77
|
+
stack.push({ chunk: source[i], inlineParams: frameInlineParams });
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const sqlParts = [];
|
|
81
|
+
const params = [];
|
|
82
|
+
let typings;
|
|
83
|
+
const pushTyping = (typing) => {
|
|
84
|
+
if (!typings) {
|
|
85
|
+
typings = [];
|
|
86
|
+
}
|
|
87
|
+
typings.push(typing);
|
|
88
|
+
};
|
|
89
|
+
pushChunks(chunks, inlineParams ?? false);
|
|
90
|
+
while (stack.length > 0) {
|
|
91
|
+
const frame = stack.pop();
|
|
92
|
+
const chunk = frame.chunk;
|
|
93
|
+
const frameInlineParams = frame.inlineParams;
|
|
83
94
|
if (is(chunk, StringChunk)) {
|
|
84
|
-
|
|
95
|
+
sqlParts.push(chunk.value.join(''));
|
|
96
|
+
continue;
|
|
85
97
|
}
|
|
86
98
|
if (is(chunk, Name)) {
|
|
87
|
-
|
|
99
|
+
sqlParts.push(escapeName(chunk.value));
|
|
100
|
+
continue;
|
|
88
101
|
}
|
|
89
102
|
if (chunk === undefined) {
|
|
90
|
-
|
|
103
|
+
continue;
|
|
91
104
|
}
|
|
92
105
|
if (Array.isArray(chunk)) {
|
|
93
|
-
const
|
|
106
|
+
const expanded = [new StringChunk('(')];
|
|
94
107
|
for (const [i, p] of chunk.entries()) {
|
|
95
|
-
|
|
108
|
+
expanded.push(p);
|
|
96
109
|
if (i < chunk.length - 1) {
|
|
97
|
-
|
|
110
|
+
expanded.push(new StringChunk(', '));
|
|
98
111
|
}
|
|
99
112
|
}
|
|
100
|
-
|
|
101
|
-
|
|
113
|
+
expanded.push(new StringChunk(')'));
|
|
114
|
+
pushChunks(expanded, frameInlineParams);
|
|
115
|
+
continue;
|
|
102
116
|
}
|
|
103
117
|
if (is(chunk, SQL)) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
inlineParams: inlineParams || chunk.shouldInlineParams,
|
|
107
|
-
});
|
|
118
|
+
pushChunks(chunk.queryChunks, frameInlineParams || chunk.shouldInlineParams);
|
|
119
|
+
continue;
|
|
108
120
|
}
|
|
109
121
|
if (is(chunk, Table)) {
|
|
110
122
|
const schemaName = chunk[Table.Symbol.Schema];
|
|
111
123
|
const tableName = chunk[Table.Symbol.Name];
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
params: [],
|
|
117
|
-
};
|
|
124
|
+
sqlParts.push(schemaName === undefined || chunk[IsAlias]
|
|
125
|
+
? escapeName(tableName)
|
|
126
|
+
: escapeName(schemaName) + '.' + escapeName(tableName));
|
|
127
|
+
continue;
|
|
118
128
|
}
|
|
119
129
|
if (is(chunk, Column)) {
|
|
120
130
|
const columnName = casing.getColumnCasing(chunk);
|
|
121
131
|
if (_config.invokeSource === 'indexes') {
|
|
122
|
-
|
|
132
|
+
sqlParts.push(escapeName(columnName));
|
|
133
|
+
continue;
|
|
123
134
|
}
|
|
124
135
|
const schemaName = chunk.table[Table.Symbol.Schema];
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
params: [],
|
|
131
|
-
};
|
|
136
|
+
sqlParts.push(chunk.table[IsAlias] || schemaName === undefined
|
|
137
|
+
? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)
|
|
138
|
+
: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'
|
|
139
|
+
+ escapeName(columnName));
|
|
140
|
+
continue;
|
|
132
141
|
}
|
|
133
142
|
if (is(chunk, View)) {
|
|
134
143
|
const schemaName = chunk[ViewBaseConfig].schema;
|
|
135
144
|
const viewName = chunk[ViewBaseConfig].name;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
params: [],
|
|
141
|
-
};
|
|
145
|
+
sqlParts.push(schemaName === undefined || chunk[ViewBaseConfig].isAlias
|
|
146
|
+
? escapeName(viewName)
|
|
147
|
+
: escapeName(schemaName) + '.' + escapeName(viewName));
|
|
148
|
+
continue;
|
|
142
149
|
}
|
|
143
150
|
if (is(chunk, Param)) {
|
|
144
151
|
if (is(chunk.value, Placeholder)) {
|
|
145
|
-
|
|
152
|
+
sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
|
|
153
|
+
params.push(chunk);
|
|
154
|
+
pushTyping('none');
|
|
155
|
+
continue;
|
|
146
156
|
}
|
|
147
157
|
const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
|
|
148
158
|
if (is(mappedValue, SQL)) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (inlineParams) {
|
|
152
|
-
return { sql: this.mapInlineParam(mappedValue, config), params: [] };
|
|
159
|
+
stack.push({ chunk: mappedValue, inlineParams: frameInlineParams });
|
|
160
|
+
continue;
|
|
153
161
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
162
|
+
if (frameInlineParams) {
|
|
163
|
+
sqlParts.push(this.mapInlineParam(mappedValue, config));
|
|
164
|
+
continue;
|
|
157
165
|
}
|
|
158
|
-
|
|
166
|
+
sqlParts.push(escapeParam(paramStartIndex.value++, mappedValue));
|
|
167
|
+
params.push(mappedValue);
|
|
168
|
+
pushTyping(prepareTyping ? prepareTyping(chunk.encoder) : 'none');
|
|
169
|
+
continue;
|
|
159
170
|
}
|
|
160
171
|
if (is(chunk, Placeholder)) {
|
|
161
|
-
|
|
172
|
+
sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
|
|
173
|
+
params.push(chunk);
|
|
174
|
+
pushTyping('none');
|
|
175
|
+
continue;
|
|
162
176
|
}
|
|
163
177
|
if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
|
|
164
|
-
|
|
178
|
+
sqlParts.push(escapeName(chunk.fieldAlias));
|
|
179
|
+
continue;
|
|
165
180
|
}
|
|
166
181
|
if (is(chunk, Subquery)) {
|
|
167
182
|
if (chunk._.isWith) {
|
|
168
|
-
|
|
183
|
+
sqlParts.push(escapeName(chunk._.alias));
|
|
184
|
+
continue;
|
|
169
185
|
}
|
|
170
|
-
|
|
186
|
+
pushChunks([
|
|
171
187
|
new StringChunk('('),
|
|
172
188
|
chunk._.sql,
|
|
173
189
|
new StringChunk(') '),
|
|
174
190
|
new Name(chunk._.alias),
|
|
175
|
-
],
|
|
191
|
+
], frameInlineParams);
|
|
192
|
+
continue;
|
|
176
193
|
}
|
|
177
194
|
if (isPgEnum(chunk)) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
195
|
+
sqlParts.push(chunk.schema
|
|
196
|
+
? escapeName(chunk.schema) + '.' + escapeName(chunk.enumName)
|
|
197
|
+
: escapeName(chunk.enumName));
|
|
198
|
+
continue;
|
|
182
199
|
}
|
|
183
200
|
if (isSQLWrapper(chunk)) {
|
|
184
201
|
if (chunk.shouldOmitSQLParens?.()) {
|
|
185
|
-
|
|
202
|
+
stack.push({ chunk: chunk.getSQL(), inlineParams: frameInlineParams });
|
|
186
203
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
204
|
+
else {
|
|
205
|
+
pushChunks([
|
|
206
|
+
new StringChunk('('),
|
|
207
|
+
chunk.getSQL(),
|
|
208
|
+
new StringChunk(')'),
|
|
209
|
+
], frameInlineParams);
|
|
210
|
+
}
|
|
211
|
+
continue;
|
|
192
212
|
}
|
|
193
|
-
if (
|
|
194
|
-
|
|
213
|
+
if (frameInlineParams) {
|
|
214
|
+
sqlParts.push(this.mapInlineParam(chunk, config));
|
|
215
|
+
continue;
|
|
195
216
|
}
|
|
196
|
-
|
|
197
|
-
|
|
217
|
+
sqlParts.push(escapeParam(paramStartIndex.value++, chunk));
|
|
218
|
+
params.push(chunk);
|
|
219
|
+
pushTyping('none');
|
|
220
|
+
}
|
|
221
|
+
const query = { sql: sqlParts.join(''), params };
|
|
222
|
+
if (typings) {
|
|
223
|
+
query.typings = typings;
|
|
224
|
+
}
|
|
225
|
+
return query;
|
|
198
226
|
}
|
|
199
227
|
mapInlineParam(chunk, { escapeString }) {
|
|
200
228
|
if (chunk === null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/data/query/sql/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Blueprint } from '../core/config/schema.js';
|
|
2
|
+
import type { ResolvedDatabase } from '../core/config/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Everything that determines a template's contents. Serialized and hashed;
|
|
5
|
+
* anything omitted here is something two runs may disagree about while still
|
|
6
|
+
* sharing a template, so omissions are the way stale reuse happens.
|
|
7
|
+
*/
|
|
8
|
+
export interface TemplateInputs {
|
|
9
|
+
/** Which configured database this template stands in for. */
|
|
10
|
+
readonly databaseName: string;
|
|
11
|
+
/**
|
|
12
|
+
* The role that builds — and therefore owns — the template.
|
|
13
|
+
*
|
|
14
|
+
* `CREATE DATABASE ... WITH TEMPLATE` requires ownership of the template, so
|
|
15
|
+
* a template is only shareable among processes connecting as the same role.
|
|
16
|
+
* Keying on the owner means a second role builds its own rather than failing
|
|
17
|
+
* to clone, or worse, trying to drop a database it does not own.
|
|
18
|
+
*/
|
|
19
|
+
readonly owner: string;
|
|
20
|
+
readonly extensions: readonly string[];
|
|
21
|
+
readonly migrationTable: string;
|
|
22
|
+
/** Hash of the migrations folder's contents, or `null` when unmigrated. */
|
|
23
|
+
readonly migrations: string | null;
|
|
24
|
+
/** Framework-table provisioning depends on these blueprint sections. */
|
|
25
|
+
readonly trace: unknown;
|
|
26
|
+
readonly audit: unknown;
|
|
27
|
+
/** Framework tables ride the default database only. */
|
|
28
|
+
readonly isDefaultDatabase: boolean;
|
|
29
|
+
/** Trace/audit day partitions are provisioned relative to the current day. */
|
|
30
|
+
readonly partitionDay: string;
|
|
31
|
+
/** Internal definitions and emitted DDL travel with the pipework version. */
|
|
32
|
+
readonly pipeworkVersion: string;
|
|
33
|
+
readonly formatVersion: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Hash a migrations folder's contents: every file's path relative to the folder
|
|
37
|
+
* and its bytes, in a stable order. Path names are included so a rename is a
|
|
38
|
+
* change; a missing or unreadable folder hashes as absent.
|
|
39
|
+
*/
|
|
40
|
+
export declare function hashMigrationsFolder(folder: string): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Collect the content inputs for one configured database's template.
|
|
43
|
+
*
|
|
44
|
+
* `partitionDay` is the current UTC date. Trace and audit partitions are
|
|
45
|
+
* created per day with a lead window, so a template built yesterday is missing
|
|
46
|
+
* today's partitions — keying on the day makes that invalidation automatic
|
|
47
|
+
* instead of a stale-data bug that only shows up after midnight.
|
|
48
|
+
*/
|
|
49
|
+
export declare function templateInputs(databaseName: string, dbConfig: ResolvedDatabase, blueprint: Blueprint, isDefaultDatabase: boolean, today: Date): TemplateInputs;
|
|
50
|
+
/**
|
|
51
|
+
* The template's content fingerprint: 16 lowercase hex chars. Deliberately
|
|
52
|
+
* wider than the 12-char per-run nonce so a template name can never be mistaken
|
|
53
|
+
* for a run-owned database name.
|
|
54
|
+
*/
|
|
55
|
+
export declare function templateFingerprint(inputs: TemplateInputs): string;
|
|
56
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/test/fingerprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAiB/D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,uDAAuD;IACvD,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BlE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,OAAO,EAC1B,KAAK,EAAE,IAAI,GACV,cAAc,CAchB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join, relative, sep } from 'node:path';
|
|
4
|
+
import { VERSION } from '../core/runtime/broker.js';
|
|
5
|
+
// The template is keyed by its CONTENT, not by the run that happened to build
|
|
6
|
+
// it. Every input that changes what ends up inside a template database is
|
|
7
|
+
// folded into one hash, and that hash becomes the template's name — so a
|
|
8
|
+
// migration edit does not invalidate a template, it simply asks for a
|
|
9
|
+
// different one, and the stale one is reaped because nobody asks for it again.
|
|
10
|
+
//
|
|
11
|
+
// Content keying is what lets a template outlive the process that built it:
|
|
12
|
+
// a vitest run with `pool: 'forks'` + `isolate: true` gives every test file a
|
|
13
|
+
// fresh process, and a per-process key (pid, run nonce) meant every one of them
|
|
14
|
+
// replayed the whole migration stack. Issue #340.
|
|
15
|
+
/** Bump when pipework changes the SHAPE of what it puts in a template. */
|
|
16
|
+
const TEMPLATE_FORMAT_VERSION = 1;
|
|
17
|
+
/**
|
|
18
|
+
* Hash a migrations folder's contents: every file's path relative to the folder
|
|
19
|
+
* and its bytes, in a stable order. Path names are included so a rename is a
|
|
20
|
+
* change; a missing or unreadable folder hashes as absent.
|
|
21
|
+
*/
|
|
22
|
+
export function hashMigrationsFolder(folder) {
|
|
23
|
+
const files = [];
|
|
24
|
+
const walk = (dir) => {
|
|
25
|
+
let entries;
|
|
26
|
+
try {
|
|
27
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
|
|
33
|
+
const full = join(dir, entry.name);
|
|
34
|
+
if (entry.isDirectory())
|
|
35
|
+
walk(full);
|
|
36
|
+
else if (entry.isFile())
|
|
37
|
+
files.push(full);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
walk(folder);
|
|
41
|
+
if (files.length === 0)
|
|
42
|
+
return null;
|
|
43
|
+
const hash = createHash('sha256');
|
|
44
|
+
for (const file of files) {
|
|
45
|
+
// Normalize the separator so the same tree hashes alike on any platform.
|
|
46
|
+
hash.update(relative(folder, file).split(sep).join('/'));
|
|
47
|
+
hash.update('\0');
|
|
48
|
+
hash.update(readFileSync(file));
|
|
49
|
+
hash.update('\0');
|
|
50
|
+
}
|
|
51
|
+
return hash.digest('hex');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Collect the content inputs for one configured database's template.
|
|
55
|
+
*
|
|
56
|
+
* `partitionDay` is the current UTC date. Trace and audit partitions are
|
|
57
|
+
* created per day with a lead window, so a template built yesterday is missing
|
|
58
|
+
* today's partitions — keying on the day makes that invalidation automatic
|
|
59
|
+
* instead of a stale-data bug that only shows up after midnight.
|
|
60
|
+
*/
|
|
61
|
+
export function templateInputs(databaseName, dbConfig, blueprint, isDefaultDatabase, today) {
|
|
62
|
+
return {
|
|
63
|
+
databaseName,
|
|
64
|
+
owner: new URL(dbConfig.url).username,
|
|
65
|
+
extensions: [...dbConfig.extensions].sort(),
|
|
66
|
+
migrationTable: dbConfig.migrationTable,
|
|
67
|
+
migrations: dbConfig.migrations === undefined ? null : hashMigrationsFolder(dbConfig.migrations),
|
|
68
|
+
trace: blueprint.trace ?? null,
|
|
69
|
+
audit: blueprint.audit ?? null,
|
|
70
|
+
isDefaultDatabase,
|
|
71
|
+
partitionDay: today.toISOString().slice(0, 10),
|
|
72
|
+
pipeworkVersion: VERSION,
|
|
73
|
+
formatVersion: TEMPLATE_FORMAT_VERSION,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The template's content fingerprint: 16 lowercase hex chars. Deliberately
|
|
78
|
+
* wider than the 12-char per-run nonce so a template name can never be mistaken
|
|
79
|
+
* for a run-owned database name.
|
|
80
|
+
*/
|
|
81
|
+
export function templateFingerprint(inputs) {
|
|
82
|
+
return createHash('sha256').update(JSON.stringify(inputs)).digest('hex').slice(0, 16);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/test/fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/test/namespace.d.ts
CHANGED
|
@@ -10,10 +10,22 @@ export declare function projectNamespace(): string;
|
|
|
10
10
|
export declare function testDbPrefix(): string;
|
|
11
11
|
/** Prefix for this project's per-run runtime (app) roles: `<project>_app_`. */
|
|
12
12
|
export declare function appRolePrefix(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Prefix for this project's shared, content-keyed templates: `<project>_tmpl_`.
|
|
15
|
+
*
|
|
16
|
+
* Templates sit in their own prefix rather than under `testDbPrefix()` because
|
|
17
|
+
* they have a different lifecycle and a different reaping rule: a per-run clone
|
|
18
|
+
* dies with its run, a template deliberately outlives every run that uses it
|
|
19
|
+
* and is dropped only once no run wants it. Separate prefixes keep the reaper's
|
|
20
|
+
* two passes from having to tell the names apart by shape. Issue #340.
|
|
21
|
+
*/
|
|
22
|
+
export declare function templateDbPrefix(): string;
|
|
13
23
|
/**
|
|
14
24
|
* `LIKE` pattern matching every per-run test database of THIS project, with the
|
|
15
25
|
* prefix underscores escaped so they match literally. The reaper uses it to
|
|
16
26
|
* scope its sweep to its own namespace and never another project's databases.
|
|
17
27
|
*/
|
|
18
28
|
export declare function testDbLikePattern(): string;
|
|
29
|
+
/** `LIKE` pattern matching every shared template of THIS project. */
|
|
30
|
+
export declare function templateDbLikePattern(): string;
|
|
19
31
|
//# sourceMappingURL=namespace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUrG;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUrG;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
package/dist/test/namespace.js
CHANGED
|
@@ -54,6 +54,18 @@ export function testDbPrefix() {
|
|
|
54
54
|
export function appRolePrefix() {
|
|
55
55
|
return `${projectNamespace()}_app_`;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Prefix for this project's shared, content-keyed templates: `<project>_tmpl_`.
|
|
59
|
+
*
|
|
60
|
+
* Templates sit in their own prefix rather than under `testDbPrefix()` because
|
|
61
|
+
* they have a different lifecycle and a different reaping rule: a per-run clone
|
|
62
|
+
* dies with its run, a template deliberately outlives every run that uses it
|
|
63
|
+
* and is dropped only once no run wants it. Separate prefixes keep the reaper's
|
|
64
|
+
* two passes from having to tell the names apart by shape. Issue #340.
|
|
65
|
+
*/
|
|
66
|
+
export function templateDbPrefix() {
|
|
67
|
+
return `${projectNamespace()}_tmpl_`;
|
|
68
|
+
}
|
|
57
69
|
/**
|
|
58
70
|
* `LIKE` pattern matching every per-run test database of THIS project, with the
|
|
59
71
|
* prefix underscores escaped so they match literally. The reaper uses it to
|
|
@@ -62,4 +74,8 @@ export function appRolePrefix() {
|
|
|
62
74
|
export function testDbLikePattern() {
|
|
63
75
|
return `${testDbPrefix().replace(/_/g, '\\_')}%`;
|
|
64
76
|
}
|
|
77
|
+
/** `LIKE` pattern matching every shared template of THIS project. */
|
|
78
|
+
export function templateDbLikePattern() {
|
|
79
|
+
return `${templateDbPrefix().replace(/_/g, '\\_')}%`;
|
|
80
|
+
}
|
|
65
81
|
//# sourceMappingURL=namespace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,oBAAoB;AACpB,4EAA4E;AAC5E,oEAAoE;AACpE,gFAAgF;AAChF,wDAAwD;AAExD,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B,EAAE,OAA2B;IAC3F,MAAM,GAAG,GAAG,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW;QAC9E,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO;YAC1D,CAAC,CAAC,UAAU,CAAA;IACd,0EAA0E;IAC1E,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAA;AACpD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC;QACH,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC,IAAI,CAAA;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,gBAAgB,EAAE,OAAO,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/test/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,oBAAoB;AACpB,4EAA4E;AAC5E,oEAAoE;AACpE,gFAAgF;AAChF,wDAAwD;AAExD,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA+B,EAAE,OAA2B;IAC3F,MAAM,GAAG,GAAG,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW;QAC9E,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO;YAC1D,CAAC,CAAC,UAAU,CAAA;IACd,0EAA0E;IAC1E,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAA;AACpD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,OAA2B,CAAA;IAC/B,IAAI,CAAC;QACH,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAuB,CAAC,IAAI,CAAA;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,gBAAgB,EAAE,OAAO,CAAA;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,gBAAgB,EAAE,QAAQ,CAAA;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAClD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,gBAAgB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AACtD,CAAC"}
|
package/dist/test/reap.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface ReapResult {
|
|
|
10
10
|
* SIGKILL, reboot). The reaper reads "lock is free" as "owning run is dead".
|
|
11
11
|
*/
|
|
12
12
|
export declare function runLockKey(nonce: string): bigint;
|
|
13
|
+
export declare function templateUseKey(fingerprint: string): bigint;
|
|
14
|
+
export declare function templateBuildKey(fingerprint: string): bigint;
|
|
13
15
|
/** Admin (`/postgres`) connection URL for a database URL. */
|
|
14
16
|
export declare function getAdminUrl(databaseUrl: string): string;
|
|
15
17
|
/**
|
|
@@ -24,7 +26,7 @@ export declare function getAdminUrl(databaseUrl: string): string;
|
|
|
24
26
|
* Both conditions only ever make the reaper more conservative, so it can
|
|
25
27
|
* never drop a database belonging to a live or still-provisioning run.
|
|
26
28
|
*/
|
|
27
|
-
export declare function reapOrphanTestDatabases(admin: postgres.Sql): Promise<ReapResult>;
|
|
29
|
+
export declare function reapOrphanTestDatabases(admin: postgres.Sql, liveTemplates?: ReadonlySet<string>): Promise<ReapResult>;
|
|
28
30
|
/**
|
|
29
31
|
* Reap orphan test databases across every Postgres server referenced by the
|
|
30
32
|
* manifold's database config. Used by `pipework test --reap`.
|
package/dist/test/reap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAgBnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AA0BD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIvD;AAcD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,QAAQ,CAAC,GAAG,EACnB,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAC7C,OAAO,CAAC,UAAU,CAAC,CA2BrB;AA4DD;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBzF"}
|
package/dist/test/reap.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
import postgres from 'postgres';
|
|
2
3
|
import { quoteIdentifier } from '../data/db/identifiers.js';
|
|
3
|
-
import { testDbPrefix, appRolePrefix, testDbLikePattern } from './namespace.js';
|
|
4
|
+
import { testDbPrefix, appRolePrefix, testDbLikePattern, templateDbPrefix, templateDbLikePattern, } from './namespace.js';
|
|
4
5
|
// Per-run test database and role names end with `_<pid>_<nonce>`, where the
|
|
5
6
|
// nonce is 12 random hex chars. The reaper recovers the nonce from a database
|
|
6
7
|
// name to rebuild that run's advisory-lock key.
|
|
@@ -14,6 +15,35 @@ const NONCE_SUFFIX = /_([0-9a-f]{12})$/;
|
|
|
14
15
|
export function runLockKey(nonce) {
|
|
15
16
|
return BigInt('0x' + nonce);
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Advisory-lock keys for a shared template, derived from its content
|
|
20
|
+
* fingerprint. Both are salted hashes truncated to 60 bits, which keeps them
|
|
21
|
+
* inside a signed `bigint` and makes an accidental collision with a 48-bit run
|
|
22
|
+
* lock key or with each other a non-event.
|
|
23
|
+
*
|
|
24
|
+
* Two keys, because the two things being coordinated are different:
|
|
25
|
+
*
|
|
26
|
+
* - the USE key is taken in SHARE mode by every process that intends to clone
|
|
27
|
+
* the template, for that process's whole life, and in EXCLUSIVE mode by the
|
|
28
|
+
* reaper. That is what stops a reaper from dropping a template between
|
|
29
|
+
* another process's readiness check and its `CREATE DATABASE ... WITH
|
|
30
|
+
* TEMPLATE`: the reaper simply cannot get the lock while anyone holds it.
|
|
31
|
+
* - the BUILD key is taken in EXCLUSIVE mode only while building, so that N
|
|
32
|
+
* processes starting at once produce one template and one migration replay
|
|
33
|
+
* rather than N. It is separate because advisory locks do not upgrade from
|
|
34
|
+
* share to exclusive, and a builder must keep its own pin while it builds.
|
|
35
|
+
*
|
|
36
|
+
* Issue #340.
|
|
37
|
+
*/
|
|
38
|
+
function templateLockKey(salt, fingerprint) {
|
|
39
|
+
return BigInt('0x' + createHash('sha256').update(`${salt}:${fingerprint}`).digest('hex').slice(0, 15));
|
|
40
|
+
}
|
|
41
|
+
export function templateUseKey(fingerprint) {
|
|
42
|
+
return templateLockKey('pipework-template-use', fingerprint);
|
|
43
|
+
}
|
|
44
|
+
export function templateBuildKey(fingerprint) {
|
|
45
|
+
return templateLockKey('pipework-template-build', fingerprint);
|
|
46
|
+
}
|
|
17
47
|
/** Admin (`/postgres`) connection URL for a database URL. */
|
|
18
48
|
export function getAdminUrl(databaseUrl) {
|
|
19
49
|
const url = new URL(databaseUrl);
|
|
@@ -23,6 +53,12 @@ export function getAdminUrl(databaseUrl) {
|
|
|
23
53
|
function pairedRoleName(datname) {
|
|
24
54
|
return appRolePrefix() + datname.slice(testDbPrefix().length);
|
|
25
55
|
}
|
|
56
|
+
/** A shared template's app role is content-keyed the same way the template is. */
|
|
57
|
+
function pairedTemplateRoleName(datname) {
|
|
58
|
+
return appRolePrefix() + datname.slice(templateDbPrefix().length);
|
|
59
|
+
}
|
|
60
|
+
/** Content fingerprint trailing a shared template's name: 16 lowercase hex. */
|
|
61
|
+
const TEMPLATE_FINGERPRINT_SUFFIX = /_([0-9a-f]{16})$/;
|
|
26
62
|
/**
|
|
27
63
|
* Drop test databases left behind by runs that never reached teardown
|
|
28
64
|
* (Ctrl-C, timeout, crash). A database is reaped only when BOTH hold:
|
|
@@ -35,7 +71,7 @@ function pairedRoleName(datname) {
|
|
|
35
71
|
* Both conditions only ever make the reaper more conservative, so it can
|
|
36
72
|
* never drop a database belonging to a live or still-provisioning run.
|
|
37
73
|
*/
|
|
38
|
-
export async function reapOrphanTestDatabases(admin) {
|
|
74
|
+
export async function reapOrphanTestDatabases(admin, liveTemplates = new Set()) {
|
|
39
75
|
const rows = await admin `
|
|
40
76
|
SELECT datname, numbackends
|
|
41
77
|
FROM pg_stat_database
|
|
@@ -61,6 +97,63 @@ export async function reapOrphanTestDatabases(admin) {
|
|
|
61
97
|
}
|
|
62
98
|
}
|
|
63
99
|
}
|
|
100
|
+
droppedDatabases.push(...(await reapStaleTemplates(admin, liveTemplates)).droppedDatabases);
|
|
101
|
+
return { droppedDatabases };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Drop shared templates nobody wants any more.
|
|
105
|
+
*
|
|
106
|
+
* A template is deliberately long-lived — it survives the run that built it, so
|
|
107
|
+
* the next run clones instead of replaying migrations (#340) — which means
|
|
108
|
+
* "left behind by a dead run" is no longer a reason to drop one. The two
|
|
109
|
+
* reasons that remain:
|
|
110
|
+
*
|
|
111
|
+
* - it is not in `liveTemplates`, the set of content keys the calling run
|
|
112
|
+
* actually intends to use. Editing a migration changes the key, so the
|
|
113
|
+
* template built from the old migrations is named something nobody will ask
|
|
114
|
+
* for again. That is what makes invalidation automatic rather than manual.
|
|
115
|
+
* - nobody holds its use lock, in any mode. Every process that intends to
|
|
116
|
+
* clone a template holds that lock in SHARE mode for its whole life, so
|
|
117
|
+
* failing to take it EXCLUSIVE means no live process is cloning from it —
|
|
118
|
+
* including no process sitting between a readiness check and its `CREATE
|
|
119
|
+
* DATABASE ... WITH TEMPLATE`.
|
|
120
|
+
*
|
|
121
|
+
* `numbackends = 0` is required as well, for the same conservatism as clones.
|
|
122
|
+
*
|
|
123
|
+
* An empty `liveTemplates` — what `pipework test --reap` passes — therefore
|
|
124
|
+
* means "drop every template not currently in use", which is the right reading
|
|
125
|
+
* of an explicit cleanup command.
|
|
126
|
+
*/
|
|
127
|
+
async function reapStaleTemplates(admin, liveTemplates) {
|
|
128
|
+
const rows = await admin `
|
|
129
|
+
SELECT datname, numbackends
|
|
130
|
+
FROM pg_stat_database
|
|
131
|
+
WHERE datname LIKE ${templateDbLikePattern()}
|
|
132
|
+
`;
|
|
133
|
+
const droppedDatabases = [];
|
|
134
|
+
for (const { datname, numbackends } of rows) {
|
|
135
|
+
if (numbackends > 0)
|
|
136
|
+
continue;
|
|
137
|
+
if (liveTemplates.has(datname))
|
|
138
|
+
continue;
|
|
139
|
+
const fingerprint = TEMPLATE_FINGERPRINT_SUFFIX.exec(datname)?.[1];
|
|
140
|
+
// A name in the template namespace without a fingerprint was not written by
|
|
141
|
+
// this scheme. Leave it alone rather than guess at its owner.
|
|
142
|
+
if (fingerprint === undefined)
|
|
143
|
+
continue;
|
|
144
|
+
const key = templateUseKey(fingerprint);
|
|
145
|
+
if (!(await tryAcquire(admin, key)))
|
|
146
|
+
continue;
|
|
147
|
+
try {
|
|
148
|
+
if (await dropDatabase(admin, datname)) {
|
|
149
|
+
droppedDatabases.push(datname);
|
|
150
|
+
await dropRole(admin, pairedTemplateRoleName(datname));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await admin `SELECT pg_advisory_unlock(${key.toString()}::bigint)`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
64
157
|
return { droppedDatabases };
|
|
65
158
|
}
|
|
66
159
|
/**
|
package/dist/test/reap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"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"}
|
package/dist/test/setup.d.ts
CHANGED
|
@@ -17,4 +17,12 @@ export declare function withTemplateRetry<T>(attempt: () => Promise<T>, sleep?:
|
|
|
17
17
|
export declare function teardownTestDatabases(): Promise<void>;
|
|
18
18
|
export declare function getTestDatabase(name: string): TestDatabase | undefined;
|
|
19
19
|
export declare function getTestDatabases(): ReadonlyMap<string, TestDatabase>;
|
|
20
|
+
/**
|
|
21
|
+
* Forget the in-process template cache, so the next `setupTestDatabases` takes
|
|
22
|
+
* the same path a freshly-forked worker takes: shared lock, readiness check,
|
|
23
|
+
* clone. This is how a single process can prove the cross-process claim — that
|
|
24
|
+
* a second fork reuses the template rather than rebuilding it — without
|
|
25
|
+
* actually forking. Test-only. Issue #340.
|
|
26
|
+
*/
|
|
27
|
+
export declare function forgetTemplateCacheForTests(): void;
|
|
20
28
|
//# sourceMappingURL=setup.d.ts.map
|
package/dist/test/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAWnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAoED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAqD/F;AAiSD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAyD,EAC5F,QAAQ,GAAE,SAAS,MAAM,EAA6B,GACrD,OAAO,CAAC,CAAC,CAAC,CASZ;AA4ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
package/dist/test/setup.js
CHANGED
|
@@ -7,8 +7,13 @@ import { applyMigrations } from '../data/migrate/apply.js';
|
|
|
7
7
|
import { missingQueueTables, queueTableMessage } from '../core/validation/queue-tables.js';
|
|
8
8
|
import { probeRlsRole, rlsProbeTarget, rlsRoleMessage } from '../core/validation/rls-role.js';
|
|
9
9
|
import { provisionFrameworkTables } from '../data/migrate/provision-framework.js';
|
|
10
|
-
import { getAdminUrl, reapOrphanTestDatabases, runLockKey } from './reap.js';
|
|
11
|
-
import { testDbPrefix, appRolePrefix } from './namespace.js';
|
|
10
|
+
import { getAdminUrl, reapOrphanTestDatabases, runLockKey, templateBuildKey, templateUseKey } from './reap.js';
|
|
11
|
+
import { testDbPrefix, appRolePrefix, templateDbPrefix } from './namespace.js';
|
|
12
|
+
import { templateFingerprint, templateInputs } from './fingerprint.js';
|
|
13
|
+
// Marker table written inside a template as the last act of a successful build.
|
|
14
|
+
// A template database that exists without this row is the wreckage of a builder
|
|
15
|
+
// that died mid-migration: it must be rebuilt, never cloned.
|
|
16
|
+
const TEMPLATE_MARKER_TABLE = 'pipework_test_template';
|
|
12
17
|
const testDatabases = new Map();
|
|
13
18
|
const templates = new Map();
|
|
14
19
|
let adminClient = null;
|
|
@@ -19,18 +24,20 @@ const runNonce = randomBytes(6).toString('hex');
|
|
|
19
24
|
let lockClient = null;
|
|
20
25
|
let reaped = false;
|
|
21
26
|
let workerShutdownArmed = false;
|
|
22
|
-
function templateDbName(baseName) {
|
|
23
|
-
return `${
|
|
27
|
+
function templateDbName(baseName, fingerprint) {
|
|
28
|
+
return `${templateDbPrefix()}${baseName}_${fingerprint}`;
|
|
24
29
|
}
|
|
25
30
|
function testDbName(baseName) {
|
|
26
31
|
return `${testDbPrefix()}${baseName}_${process.pid}_${runNonce}`;
|
|
27
32
|
}
|
|
28
33
|
// The app role is named to match what the orphan reaper derives from the
|
|
29
|
-
// *template* database name (`reap.ts` `
|
|
30
|
-
// every per-file clone, so when the reaper
|
|
31
|
-
// this role with it.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
// *template* database name (`reap.ts` `pairedTemplateRoleName`): the template
|
|
35
|
+
// outlives every per-file clone and every run, so when the reaper finally drops
|
|
36
|
+
// a stale template it drops this role with it. The role must be content-keyed
|
|
37
|
+
// too — its grants are baked into the template's catalog by OID, so a template
|
|
38
|
+
// shared across processes needs a role shared across processes.
|
|
39
|
+
function appRoleName(baseName, fingerprint) {
|
|
40
|
+
return `${appRolePrefix()}${baseName}_${fingerprint}`;
|
|
34
41
|
}
|
|
35
42
|
export async function setupTestDatabases(instance) {
|
|
36
43
|
const databases = [...instance.config.databases()];
|
|
@@ -50,25 +57,42 @@ export async function setupTestDatabases(instance) {
|
|
|
50
57
|
throw new Error(`[pipework] Test bootstrap failed:\n\n ${rlsRoleMessage(name, probe)}\n`);
|
|
51
58
|
}
|
|
52
59
|
}
|
|
60
|
+
// Template identities are pure functions of config and migration content, so
|
|
61
|
+
// they are computed before any connection opens — the reaper needs the set of
|
|
62
|
+
// templates this run intends to use before it decides which templates are
|
|
63
|
+
// stale enough to drop.
|
|
64
|
+
const today = new Date();
|
|
65
|
+
const defaultName = instance.config.databaseNames()[0];
|
|
66
|
+
const plans = databases.map(([name, dbConfig]) => {
|
|
67
|
+
const fingerprint = templateFingerprint(templateInputs(name, dbConfig, instance.config.raw, name === defaultName, today));
|
|
68
|
+
return {
|
|
69
|
+
name,
|
|
70
|
+
dbConfig,
|
|
71
|
+
fingerprint,
|
|
72
|
+
templateDb: templateDbName(name, fingerprint),
|
|
73
|
+
appRole: appRoleName(name, fingerprint),
|
|
74
|
+
isDefaultDatabase: name === defaultName,
|
|
75
|
+
};
|
|
76
|
+
});
|
|
53
77
|
const firstDb = databases[0];
|
|
54
78
|
if (firstDb !== undefined) {
|
|
55
|
-
await prepareRun(getAdminUrl(firstDb[1].url));
|
|
79
|
+
await prepareRun(getAdminUrl(firstDb[1].url), new Set(plans.map(plan => plan.templateDb)));
|
|
56
80
|
}
|
|
57
|
-
for (const
|
|
58
|
-
const template = await ensureTemplate(instance,
|
|
59
|
-
const testDb = await cloneTestDatabase(name, dbConfig, template);
|
|
60
|
-
testDatabases.set(name, testDb);
|
|
81
|
+
for (const plan of plans) {
|
|
82
|
+
const template = await ensureTemplate(instance, plan);
|
|
83
|
+
const testDb = await cloneTestDatabase(plan.name, plan.dbConfig, template);
|
|
84
|
+
testDatabases.set(plan.name, testDb);
|
|
61
85
|
}
|
|
62
86
|
return testDatabases;
|
|
63
87
|
}
|
|
64
88
|
// Acquire this run's advisory lock and reap orphans before provisioning. The
|
|
65
89
|
// lock is taken before the first CREATE DATABASE so a concurrent run's reaper
|
|
66
90
|
// can never mistake this run's freshly-created, backend-less databases — the
|
|
67
|
-
// per-
|
|
91
|
+
// per-run clones included — for orphans. It is held on a dedicated
|
|
68
92
|
// connection (idle/lifetime timeouts off) so Postgres releases it only when
|
|
69
93
|
// this process dies, and is never unlocked per file: the template outlives
|
|
70
94
|
// every file's database, so the lock that protects it must outlive them too.
|
|
71
|
-
async function prepareRun(adminUrl) {
|
|
95
|
+
async function prepareRun(adminUrl, liveTemplates) {
|
|
72
96
|
if (adminClient === null) {
|
|
73
97
|
adminClient = postgres(adminUrl, { max: 1, onnotice: () => { } });
|
|
74
98
|
}
|
|
@@ -80,23 +104,127 @@ async function prepareRun(adminUrl) {
|
|
|
80
104
|
if (!reaped) {
|
|
81
105
|
reaped = true;
|
|
82
106
|
try {
|
|
83
|
-
await reapOrphanTestDatabases(adminClient);
|
|
107
|
+
await reapOrphanTestDatabases(adminClient, liveTemplates);
|
|
84
108
|
}
|
|
85
109
|
catch {
|
|
86
110
|
// Reaping is best effort — never let stale-orphan cleanup break setup.
|
|
87
111
|
}
|
|
88
112
|
}
|
|
89
113
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Get the shared template for one database, building it only if no process has
|
|
116
|
+
* built it yet.
|
|
117
|
+
*
|
|
118
|
+
* The protocol, in order, and the order is the point:
|
|
119
|
+
*
|
|
120
|
+
* 1. Take a SHARED advisory lock on the template's content key, on this run's
|
|
121
|
+
* lifetime connection. That pins the template: the reaper drops a template
|
|
122
|
+
* only under an EXCLUSIVE lock, so from here until this process dies, no
|
|
123
|
+
* reaper can pull the template out from under a clone.
|
|
124
|
+
* 2. Ask whether the template is ready. Because the pin is already held, a
|
|
125
|
+
* `yes` cannot go stale.
|
|
126
|
+
* 3. If not ready, take an EXCLUSIVE lock on the separate BUILD key and ask
|
|
127
|
+
* again — a concurrent builder may have finished while we waited — then
|
|
128
|
+
* build. Two processes starting together therefore converge on one
|
|
129
|
+
* template, and the loser pays a wait rather than a second migration replay.
|
|
130
|
+
*
|
|
131
|
+
* There is deliberately no fallback: if the shared template cannot be built or
|
|
132
|
+
* validated, setup fails loudly. Quietly reverting to a private per-process
|
|
133
|
+
* build would re-hide exactly the cost this exists to remove. Issue #340.
|
|
134
|
+
*/
|
|
135
|
+
async function ensureTemplate(instance, plan) {
|
|
136
|
+
const cached = templates.get(plan.name);
|
|
94
137
|
if (cached !== undefined)
|
|
95
138
|
return cached;
|
|
96
|
-
const
|
|
139
|
+
const useKey = templateUseKey(plan.fingerprint).toString();
|
|
140
|
+
const buildKey = templateBuildKey(plan.fingerprint).toString();
|
|
141
|
+
await lockClient `SELECT pg_advisory_lock_shared(${useKey}::bigint)`;
|
|
142
|
+
if (!await templateIsReady(plan)) {
|
|
143
|
+
await lockClient `SELECT pg_advisory_lock(${buildKey}::bigint)`;
|
|
144
|
+
try {
|
|
145
|
+
if (!await templateIsReady(plan)) {
|
|
146
|
+
await buildTemplate(instance, plan);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await lockClient `SELECT pg_advisory_unlock(${buildKey}::bigint)`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Checked on every process, not just the one that happened to build. A
|
|
154
|
+
// template is keyed by the migrations that made it; the QUEUES a manifold
|
|
155
|
+
// registers are not part of that key, so two instances can legitimately share
|
|
156
|
+
// one template while disagreeing about which queue tables must exist. Running
|
|
157
|
+
// this only inside the build would make the check depend on who got there
|
|
158
|
+
// first — which is to say, it would silently stop running.
|
|
159
|
+
await assertQueueTables(instance, plan);
|
|
160
|
+
const template = {
|
|
161
|
+
templateDb: plan.templateDb,
|
|
162
|
+
appRole: plan.appRole,
|
|
163
|
+
fingerprint: plan.fingerprint,
|
|
164
|
+
};
|
|
165
|
+
templates.set(plan.name, template);
|
|
166
|
+
return template;
|
|
167
|
+
}
|
|
168
|
+
// D2 loudness at test bootstrap: a registered queue whose table did not come
|
|
169
|
+
// out of the migrations would otherwise fail at first insert, deep in a test.
|
|
170
|
+
// Checked on the database queue migrations are emitted into — the sole
|
|
171
|
+
// database, or the declared defaultDatabase (same rule as startup validation).
|
|
172
|
+
async function assertQueueTables(instance, plan) {
|
|
173
|
+
const declaredNames = instance.config.databaseNames();
|
|
174
|
+
const queueDbName = declaredNames.length === 1 ? declaredNames[0] : instance.config.raw.defaultDatabase;
|
|
175
|
+
if (plan.name !== queueDbName)
|
|
176
|
+
return;
|
|
177
|
+
const missing = await missingQueueTables(siblingUrl(plan.dbConfig, plan.templateDb));
|
|
178
|
+
if (missing.length > 0) {
|
|
179
|
+
throw new Error(`[pipework] Test bootstrap failed:\n\n` +
|
|
180
|
+
missing.map(table => ` ${queueTableMessage(table, plan.name)}`).join('\n') + '\n');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Connection URL for a database on the same server as `dbConfig.url`. */
|
|
184
|
+
function siblingUrl(dbConfig, database) {
|
|
185
|
+
const url = new URL(dbConfig.url);
|
|
186
|
+
url.pathname = `/${database}`;
|
|
187
|
+
return url.toString();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Is this template complete and usable?
|
|
191
|
+
*
|
|
192
|
+
* A missing database, an unreachable one, or one without the marker row all
|
|
193
|
+
* answer `false` — the caller then rebuilds it under the exclusive build lock.
|
|
194
|
+
* That is recovery from a half-built template, not a fallback to per-process
|
|
195
|
+
* building: the result is still the one shared template every process uses.
|
|
196
|
+
*/
|
|
197
|
+
async function templateIsReady(plan) {
|
|
198
|
+
const client = postgres(siblingUrl(plan.dbConfig, plan.templateDb), {
|
|
199
|
+
max: 1,
|
|
200
|
+
onnotice: () => { },
|
|
201
|
+
connect_timeout: 10,
|
|
202
|
+
});
|
|
203
|
+
try {
|
|
204
|
+
const rows = await client `
|
|
205
|
+
SELECT fingerprint FROM ${client(TEMPLATE_MARKER_TABLE)} LIMIT 1
|
|
206
|
+
`;
|
|
207
|
+
return rows[0]?.fingerprint === plan.fingerprint;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Database absent, still being built, or missing its marker table.
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
await client.end();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Build one shared template from scratch. Runs under the exclusive build lock,
|
|
218
|
+
// with this process's shared use-lock already held. Issue #321, #340.
|
|
219
|
+
async function buildTemplate(instance, plan) {
|
|
220
|
+
const { dbConfig } = plan;
|
|
221
|
+
const templateDb = plan.templateDb;
|
|
97
222
|
const templateIdent = quoteIdentifier(templateDb, 'database');
|
|
98
223
|
const admin = drizzle(adminClient);
|
|
99
|
-
|
|
224
|
+
// A template database that exists at this point failed its readiness check —
|
|
225
|
+
// the leftovers of a builder that died. Drop and start over.
|
|
226
|
+
await closeTemplateClients(admin, templateDb);
|
|
227
|
+
await withTemplateRetry(() => admin.execute(sql.raw(`DROP DATABASE IF EXISTS ${templateIdent}`)));
|
|
100
228
|
await admin.execute(sql.raw(`CREATE DATABASE ${templateIdent}`));
|
|
101
229
|
// #325: a test database is dropped or rolled back — durable commits are pure
|
|
102
230
|
// overhead. `synchronous_commit` is a per-database setting and does not copy
|
|
@@ -121,21 +249,6 @@ async function ensureTemplate(instance, name, dbConfig) {
|
|
|
121
249
|
unloggedTables: true,
|
|
122
250
|
});
|
|
123
251
|
}
|
|
124
|
-
// D2 loudness at test bootstrap: a registered queue whose table did not come
|
|
125
|
-
// out of the migrations above would otherwise fail at first insert, deep in
|
|
126
|
-
// a test. Checked on the database queue migrations are emitted into — the
|
|
127
|
-
// sole database, or the declared defaultDatabase (same rule as startup
|
|
128
|
-
// validation).
|
|
129
|
-
const declaredNames = instance.config.databaseNames();
|
|
130
|
-
const queueDbName = declaredNames.length === 1 ? declaredNames[0] : instance.config.raw.defaultDatabase;
|
|
131
|
-
if (name === queueDbName) {
|
|
132
|
-
const missing = await missingQueueTables(templateUrlStr);
|
|
133
|
-
if (missing.length > 0) {
|
|
134
|
-
await templateClient.end();
|
|
135
|
-
throw new Error(`[pipework] Test bootstrap failed:\n\n` +
|
|
136
|
-
missing.map(table => ` ${queueTableMessage(table, name)}`).join('\n') + '\n');
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
252
|
// Framework-owned partitioned tables (trace family) are kept out of app
|
|
140
253
|
// migrations (#313) — pipework creates them and their day partitions here so
|
|
141
254
|
// a traced test never hits a missing relation or a missing partition.
|
|
@@ -144,15 +257,21 @@ async function ensureTemplate(instance, name, dbConfig) {
|
|
|
144
257
|
errorRetentionDays: instance.config.trace.errorRetentionDays,
|
|
145
258
|
auditRetentionDays: instance.config.audit.retentionDays,
|
|
146
259
|
partitionLeadDays: instance.config.trace.partitionLeadDays,
|
|
147
|
-
},
|
|
260
|
+
}, plan.isDefaultDatabase);
|
|
261
|
+
// The marker is written last, and its presence is what makes this template
|
|
262
|
+
// clonable by any other process. Everything above must have succeeded first;
|
|
263
|
+
// a builder that dies before this point leaves a database that every reader
|
|
264
|
+
// correctly refuses to clone.
|
|
265
|
+
await templateDbHandle.execute(sql.raw(`CREATE TABLE ${quoteIdentifier(TEMPLATE_MARKER_TABLE, 'table')} (` +
|
|
266
|
+
`fingerprint text PRIMARY KEY, built_at timestamptz NOT NULL DEFAULT now(), builder_pid integer NOT NULL)`));
|
|
267
|
+
await templateDbHandle.execute(sql `
|
|
268
|
+
INSERT INTO ${sql.identifier(TEMPLATE_MARKER_TABLE)} (fingerprint, builder_pid)
|
|
269
|
+
VALUES (${plan.fingerprint}, ${process.pid})
|
|
270
|
+
`);
|
|
148
271
|
await templateClient.end();
|
|
149
|
-
|
|
150
|
-
await provisionTemplateRole(adminClient, templateUrlStr, appRole);
|
|
151
|
-
const template = { templateDb, appRole };
|
|
152
|
-
templates.set(name, template);
|
|
153
|
-
return template;
|
|
272
|
+
await provisionTemplateRole(adminClient, templateUrlStr, plan.appRole);
|
|
154
273
|
}
|
|
155
|
-
// Clone one test file's database from the
|
|
274
|
+
// Clone one test file's database from the shared template. A clone copies
|
|
156
275
|
// the template's tables, partitions, and in-database grants; only the cluster
|
|
157
276
|
// catalog's CONNECT privilege has to be re-granted on the new database. Issue #321.
|
|
158
277
|
async function cloneTestDatabase(name, dbConfig, template) {
|
|
@@ -182,12 +301,16 @@ async function cloneTestDatabase(name, dbConfig, template) {
|
|
|
182
301
|
database: dbName,
|
|
183
302
|
};
|
|
184
303
|
}
|
|
185
|
-
// Close
|
|
186
|
-
//
|
|
304
|
+
// Close straggler client connections to the template so the clone can proceed.
|
|
305
|
+
// Three guards keep this from aborting the clone — or from sabotaging a peer:
|
|
187
306
|
// - `backend_type = 'client backend'` excludes background workers. An
|
|
188
307
|
// autovacuum worker attaches to every database and runs as superuser, and a
|
|
189
308
|
// non-superuser test role cannot signal it — targeting it would raise
|
|
190
309
|
// `permission denied to terminate process` (42501) and abort the statement.
|
|
310
|
+
// - `state = 'idle'` excludes backends doing work. The template is now shared
|
|
311
|
+
// across processes (#340), so an active backend may be another run's
|
|
312
|
+
// builder or readiness check rather than a leak of ours; an idle one is
|
|
313
|
+
// doing nothing and its owner reconnects transparently.
|
|
191
314
|
// - best-effort: if a client backend is still unkillable (owned by a role we
|
|
192
315
|
// cannot signal), swallow it. The `CREATE` retry waits out whatever remains.
|
|
193
316
|
async function closeTemplateClients(admin, templateDb) {
|
|
@@ -198,6 +321,7 @@ async function closeTemplateClients(admin, templateDb) {
|
|
|
198
321
|
WHERE datname = ${templateDb}
|
|
199
322
|
AND pid <> pg_backend_pid()
|
|
200
323
|
AND backend_type = 'client backend'
|
|
324
|
+
AND state = 'idle'
|
|
201
325
|
`);
|
|
202
326
|
}
|
|
203
327
|
catch {
|
|
@@ -255,9 +379,9 @@ async function provisionTemplateRole(client, templateUrl, roleName) {
|
|
|
255
379
|
}
|
|
256
380
|
// Close this run's persistent admin and lock connections. Releasing
|
|
257
381
|
// `lockClient` drops the run's advisory lock — so this runs exactly once, at
|
|
258
|
-
// worker shutdown, never per file:
|
|
259
|
-
//
|
|
260
|
-
//
|
|
382
|
+
// worker shutdown, never per file: these connections hold the run's advisory
|
|
383
|
+
// lock and this run's shared pin on every template it uses, and both must
|
|
384
|
+
// outlive every file in the worker.
|
|
261
385
|
async function closeRunConnections() {
|
|
262
386
|
if (adminClient !== null) {
|
|
263
387
|
await adminClient.end();
|
|
@@ -288,9 +412,9 @@ function armWorkerShutdown() {
|
|
|
288
412
|
});
|
|
289
413
|
}
|
|
290
414
|
}
|
|
291
|
-
// Drop this file's clones. The
|
|
292
|
-
//
|
|
293
|
-
//
|
|
415
|
+
// Drop this file's clones. The shared template and its app role deliberately
|
|
416
|
+
// outlive teardown — the next file, the next process, and the next run all
|
|
417
|
+
// reuse it, and a reaper drops it only once its content key goes stale (#340). The run's admin and lock
|
|
294
418
|
// connections also survive: `lockClient` holds the advisory lock that protects
|
|
295
419
|
// the live template from a sibling worker's reaper, so it must stay open for
|
|
296
420
|
// the worker's whole life — `armWorkerShutdown` closes both once, at worker
|
|
@@ -324,4 +448,14 @@ export function getTestDatabase(name) {
|
|
|
324
448
|
export function getTestDatabases() {
|
|
325
449
|
return testDatabases;
|
|
326
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* Forget the in-process template cache, so the next `setupTestDatabases` takes
|
|
453
|
+
* the same path a freshly-forked worker takes: shared lock, readiness check,
|
|
454
|
+
* clone. This is how a single process can prove the cross-process claim — that
|
|
455
|
+
* a second fork reuses the template rather than rebuilding it — without
|
|
456
|
+
* actually forking. Test-only. Issue #340.
|
|
457
|
+
*/
|
|
458
|
+
export function forgetTemplateCacheForTests() {
|
|
459
|
+
templates.clear();
|
|
460
|
+
}
|
|
327
461
|
//# sourceMappingURL=setup.js.map
|
package/dist/test/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"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"}
|