@proteinjs/db 1.32.0 → 1.32.2
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 +22 -0
- package/dist/src/schema/SchemaOperations.d.ts +14 -0
- package/dist/src/schema/SchemaOperations.d.ts.map +1 -1
- package/dist/src/schema/TableManager.d.ts +36 -0
- package/dist/src/schema/TableManager.d.ts.map +1 -1
- package/dist/src/schema/TableManager.js +147 -22
- package/dist/src/schema/TableManager.js.map +1 -1
- package/package.json +2 -2
- package/src/schema/SchemaOperations.ts +15 -0
- package/src/schema/TableManager.ts +89 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.32.2](https://github.com/proteinjs/db/compare/@proteinjs/db@1.32.1...@proteinjs/db@1.32.2) (2026-08-15)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* schema reconcile logs the concurrent-ALREADY_EXISTS tolerance loudly (WARN) ([8e95c92](https://github.com/proteinjs/db/commit/8e95c92c3757bd577048a269e28a072a2e045208))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [1.32.1](https://github.com/proteinjs/db/compare/@proteinjs/db@1.32.0...@proteinjs/db@1.32.1) (2026-08-15)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* schema reconcile tolerates concurrent ALREADY_EXISTS — verify-then-succeed, closes the multi-actor boot race ([ef6afa5](https://github.com/proteinjs/db/commit/ef6afa55690f6481435bc4356cf6cc301869e08f))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
6
28
|
# [1.32.0](https://github.com/proteinjs/db/compare/@proteinjs/db@1.31.0...@proteinjs/db@1.32.0) (2026-08-14)
|
|
7
29
|
|
|
8
30
|
|
|
@@ -8,6 +8,20 @@ export interface SchemaOperations {
|
|
|
8
8
|
*/
|
|
9
9
|
createTables(tables: Table<any>[]): Promise<void>;
|
|
10
10
|
alterTable(table: Table<any>, changes: TableChanges): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Classify a create/alter DDL error as the backend's "already exists" class — the loser's
|
|
13
|
+
* outcome when two actors concurrently create the same table/index or add the same column and
|
|
14
|
+
* the backend serializes the DDL so the object lands exactly once. Backend-specific (each driver
|
|
15
|
+
* owns its error codes/messages), so it is optional: a driver that does not implement it opts out
|
|
16
|
+
* of {@link TableManager}'s concurrent-reconcile tolerance and keeps the strict rethrow.
|
|
17
|
+
*
|
|
18
|
+
* MUST match on error CLASS (status code + a specific message class), never a loose substring —
|
|
19
|
+
* it decides whether a failure is eligible for verify-then-succeed, and a genuine failure that
|
|
20
|
+
* slipped into this class would be masked. The tolerance is still safe because TableManager
|
|
21
|
+
* re-reads and confirms the intended definition before treating it as success; this predicate is
|
|
22
|
+
* the first gate, not the whole guard.
|
|
23
|
+
*/
|
|
24
|
+
isAlreadyExistsError?(error: unknown): boolean;
|
|
11
25
|
}
|
|
12
26
|
interface Index {
|
|
13
27
|
name?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaOperations.d.ts","sourceRoot":"","sources":["../../../src/schema/SchemaOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"SchemaOperations.d.ts","sourceRoot":"","sources":["../../../src/schema/SchemaOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CAChD;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,0JAA0J;IAC1J,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,8BAA8B,EAAE,MAAM,EAAE,CAAC;IACzC,mBAAmB,EAAE,UAAU,EAAE,CAAC;IAClC,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,iBAAiB,EAAE,UAAU,EAAE,CAAC;IAChC,oCAAoC,EAAE,MAAM,EAAE,CAAC;IAC/C,kCAAkC,EAAE,MAAM,EAAE,CAAC;IAC7C,eAAe,EAAE,KAAK,EAAE,CAAC;IACzB,aAAa,EAAE,KAAK,EAAE,CAAC;CACxB"}
|
|
@@ -22,6 +22,42 @@ export declare class TableManager {
|
|
|
22
22
|
loadTables(): Promise<void>;
|
|
23
23
|
loadTable(table: Table<any>): Promise<void>;
|
|
24
24
|
private alterTableIfChanged;
|
|
25
|
+
/**
|
|
26
|
+
* Reconcile a create/alter DDL failure against a concurrent schema change, closing the
|
|
27
|
+
* check-then-act race in loadTable/loadTables.
|
|
28
|
+
*
|
|
29
|
+
* On a schema-changing release the migration Job, booting pods, and multiple replicas all run
|
|
30
|
+
* Db.init -> loadTables at once. Reconcile is check-then-act (read INFORMATION_SCHEMA -> decide
|
|
31
|
+
* create/alter -> apply DDL): two actors can both observe the same column/table as absent and
|
|
32
|
+
* both issue the CREATE/ALTER. The backend serializes DDL so the object lands EXACTLY once, but
|
|
33
|
+
* the loser's operation fails with an already-exists / duplicate-name error. Before this
|
|
34
|
+
* reconcile that error propagated out of Db.init — a booting pod with no unhandledRejection
|
|
35
|
+
* handler exited (CrashLoopBackOff) and the migration Job exited 1 (a spurious migration-gate
|
|
36
|
+
* failure).
|
|
37
|
+
*
|
|
38
|
+
* This is NOT a blanket swallow (that would mask real schema failures). Two independent gates
|
|
39
|
+
* must BOTH pass before a failure is treated as success:
|
|
40
|
+
* 1. CLASS — the driver's schema layer, which owns the backend's error codes/messages, must
|
|
41
|
+
* classify the error as the already-exists class ({@link SchemaOperations.isAlreadyExistsError}).
|
|
42
|
+
* A driver that does not implement the classifier always rethrows here.
|
|
43
|
+
* 2. INTENDED DEFINITION — a re-read of the live schema (the same metadata-backed detection
|
|
44
|
+
* getTableChanges uses) must confirm every table now exists AND has no remaining changes of
|
|
45
|
+
* the kind we attempted. A concurrent actor applying our EXACT change satisfies this; a
|
|
46
|
+
* genuine conflict (e.g. the column landed with a different type, so a column-type change is
|
|
47
|
+
* still outstanding) does not.
|
|
48
|
+
* If either gate fails, the ORIGINAL error propagates unchanged. Because every actor runs this
|
|
49
|
+
* same reconcile, it closes all three windows: migration-Job-vs-pod, pod-vs-pod, and
|
|
50
|
+
* multi-replica boot.
|
|
51
|
+
*
|
|
52
|
+
* OBSERVABILITY: this path is reached ONLY from the create/alter catch (the no-error happy path
|
|
53
|
+
* never calls it). Every outcome that reaches the intended-definition gate is logged LOUDLY at
|
|
54
|
+
* WARN — tolerance fired (treated as applied) OR the re-read failed (genuine conflict / still
|
|
55
|
+
* absent, re-throwing) — so an unexpected activation is visible in prod logs rather than silent.
|
|
56
|
+
*/
|
|
57
|
+
private reconcileConcurrentSchemaChange;
|
|
58
|
+
/** Concise, loggable reason from a schema-update error: the backend names the offending object
|
|
59
|
+
* in `details` (validation phase) or `message` (apply phase). */
|
|
60
|
+
private schemaErrorReason;
|
|
25
61
|
private validateDynamicReferenceColumns;
|
|
26
62
|
private shouldAlterTable;
|
|
27
63
|
private getTableChanges;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableManager.d.ts","sourceRoot":"","sources":["../../../src/schema/TableManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAa,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAMjC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;CAC3C;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA2F;IAClG,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,cAAc,CAAC;gBAGpC,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,CAAC,EAAE,cAAc;IAO3B,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAInC;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"TableManager.d.ts","sourceRoot":"","sources":["../../../src/schema/TableManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAa,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAMjC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;CAC3C;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA2F;IAClG,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,cAAc,CAAC;gBAGpC,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,CAAC,EAAE,cAAc;IAO3B,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAInC;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBnC,mBAAmB;IAajC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;YACW,+BAA+B;IAmC7C;sEACkE;IAClE,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,+BAA+B;IAwDvC,OAAO,CAAC,gBAAgB;YAgBV,eAAe;YA6Ff,kBAAkB;CA8CjC"}
|
|
@@ -69,7 +69,7 @@ var TableManager = /** @class */ (function () {
|
|
|
69
69
|
*/
|
|
70
70
|
TableManager.prototype.loadTables = function () {
|
|
71
71
|
return __awaiter(this, void 0, void 0, function () {
|
|
72
|
-
var tables, absentTables, existingTables, _i, tables_1, table, _a, existingTables_1, table;
|
|
72
|
+
var tables, absentTables, existingTables, _i, tables_1, table, error_1, _a, existingTables_1, table;
|
|
73
73
|
return __generator(this, function (_b) {
|
|
74
74
|
switch (_b.label) {
|
|
75
75
|
case 0:
|
|
@@ -95,33 +95,45 @@ var TableManager = /** @class */ (function () {
|
|
|
95
95
|
_i++;
|
|
96
96
|
return [3 /*break*/, 1];
|
|
97
97
|
case 4:
|
|
98
|
-
if (!(absentTables.length > 0)) return [3 /*break*/,
|
|
98
|
+
if (!(absentTables.length > 0)) return [3 /*break*/, 10];
|
|
99
99
|
this.logger.info({ message: "Creating tables: ".concat(absentTables.map(function (table) { return table.name; }).join(', ')) });
|
|
100
|
-
|
|
100
|
+
_b.label = 5;
|
|
101
101
|
case 5:
|
|
102
|
+
_b.trys.push([5, 7, , 9]);
|
|
103
|
+
return [4 /*yield*/, this.schemaOperations.createTables(absentTables)];
|
|
104
|
+
case 6:
|
|
105
|
+
_b.sent();
|
|
106
|
+
return [3 /*break*/, 9];
|
|
107
|
+
case 7:
|
|
108
|
+
error_1 = _b.sent();
|
|
109
|
+
return [4 /*yield*/, this.reconcileConcurrentSchemaChange(absentTables, error_1)];
|
|
110
|
+
case 8:
|
|
102
111
|
_b.sent();
|
|
112
|
+
return [3 /*break*/, 9];
|
|
113
|
+
case 9:
|
|
103
114
|
this.logger.info({ message: "Finished creating ".concat(absentTables.length, " tables") });
|
|
104
|
-
_b.label =
|
|
105
|
-
case
|
|
115
|
+
_b.label = 10;
|
|
116
|
+
case 10:
|
|
106
117
|
_a = 0, existingTables_1 = existingTables;
|
|
107
|
-
_b.label =
|
|
108
|
-
case
|
|
109
|
-
if (!(_a < existingTables_1.length)) return [3 /*break*/,
|
|
118
|
+
_b.label = 11;
|
|
119
|
+
case 11:
|
|
120
|
+
if (!(_a < existingTables_1.length)) return [3 /*break*/, 14];
|
|
110
121
|
table = existingTables_1[_a];
|
|
111
122
|
return [4 /*yield*/, this.alterTableIfChanged(table)];
|
|
112
|
-
case
|
|
123
|
+
case 12:
|
|
113
124
|
_b.sent();
|
|
114
|
-
_b.label =
|
|
115
|
-
case
|
|
125
|
+
_b.label = 13;
|
|
126
|
+
case 13:
|
|
116
127
|
_a++;
|
|
117
|
-
return [3 /*break*/,
|
|
118
|
-
case
|
|
128
|
+
return [3 /*break*/, 11];
|
|
129
|
+
case 14: return [2 /*return*/];
|
|
119
130
|
}
|
|
120
131
|
});
|
|
121
132
|
});
|
|
122
133
|
};
|
|
123
134
|
TableManager.prototype.loadTable = function (table) {
|
|
124
135
|
return __awaiter(this, void 0, void 0, function () {
|
|
136
|
+
var error_2;
|
|
125
137
|
return __generator(this, function (_a) {
|
|
126
138
|
switch (_a.label) {
|
|
127
139
|
case 0:
|
|
@@ -132,39 +144,152 @@ var TableManager = /** @class */ (function () {
|
|
|
132
144
|
return [4 /*yield*/, this.alterTableIfChanged(table)];
|
|
133
145
|
case 2:
|
|
134
146
|
_a.sent();
|
|
135
|
-
return [3 /*break*/,
|
|
147
|
+
return [3 /*break*/, 9];
|
|
136
148
|
case 3:
|
|
137
149
|
this.logger.info({ message: "Creating table: ".concat(table.name) });
|
|
138
|
-
|
|
150
|
+
_a.label = 4;
|
|
139
151
|
case 4:
|
|
152
|
+
_a.trys.push([4, 6, , 8]);
|
|
153
|
+
return [4 /*yield*/, this.schemaOperations.createTables([table])];
|
|
154
|
+
case 5:
|
|
155
|
+
_a.sent();
|
|
156
|
+
return [3 /*break*/, 8];
|
|
157
|
+
case 6:
|
|
158
|
+
error_2 = _a.sent();
|
|
159
|
+
return [4 /*yield*/, this.reconcileConcurrentSchemaChange([table], error_2)];
|
|
160
|
+
case 7:
|
|
140
161
|
_a.sent();
|
|
162
|
+
return [3 /*break*/, 8];
|
|
163
|
+
case 8:
|
|
141
164
|
this.logger.info({ message: "Finished creating table: ".concat(table.name) });
|
|
142
|
-
_a.label =
|
|
143
|
-
case
|
|
165
|
+
_a.label = 9;
|
|
166
|
+
case 9: return [2 /*return*/];
|
|
144
167
|
}
|
|
145
168
|
});
|
|
146
169
|
});
|
|
147
170
|
};
|
|
148
171
|
TableManager.prototype.alterTableIfChanged = function (table) {
|
|
149
172
|
return __awaiter(this, void 0, void 0, function () {
|
|
150
|
-
var tableChanges;
|
|
173
|
+
var tableChanges, error_3;
|
|
151
174
|
return __generator(this, function (_a) {
|
|
152
175
|
switch (_a.label) {
|
|
153
176
|
case 0: return [4 /*yield*/, this.getTableChanges(table)];
|
|
154
177
|
case 1:
|
|
155
178
|
tableChanges = _a.sent();
|
|
156
|
-
if (!this.shouldAlterTable(tableChanges)) return [3 /*break*/,
|
|
179
|
+
if (!this.shouldAlterTable(tableChanges)) return [3 /*break*/, 7];
|
|
157
180
|
this.logger.info({ message: "Altering table: ".concat(table.name) });
|
|
158
|
-
|
|
181
|
+
_a.label = 2;
|
|
159
182
|
case 2:
|
|
183
|
+
_a.trys.push([2, 4, , 6]);
|
|
184
|
+
return [4 /*yield*/, this.schemaOperations.alterTable(table, tableChanges)];
|
|
185
|
+
case 3:
|
|
160
186
|
_a.sent();
|
|
187
|
+
return [3 /*break*/, 6];
|
|
188
|
+
case 4:
|
|
189
|
+
error_3 = _a.sent();
|
|
190
|
+
return [4 /*yield*/, this.reconcileConcurrentSchemaChange([table], error_3)];
|
|
191
|
+
case 5:
|
|
192
|
+
_a.sent();
|
|
193
|
+
return [3 /*break*/, 6];
|
|
194
|
+
case 6:
|
|
161
195
|
this.logger.info({ message: "Finished altering table: ".concat(table.name) });
|
|
162
|
-
_a.label =
|
|
163
|
-
case
|
|
196
|
+
_a.label = 7;
|
|
197
|
+
case 7: return [2 /*return*/];
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Reconcile a create/alter DDL failure against a concurrent schema change, closing the
|
|
204
|
+
* check-then-act race in loadTable/loadTables.
|
|
205
|
+
*
|
|
206
|
+
* On a schema-changing release the migration Job, booting pods, and multiple replicas all run
|
|
207
|
+
* Db.init -> loadTables at once. Reconcile is check-then-act (read INFORMATION_SCHEMA -> decide
|
|
208
|
+
* create/alter -> apply DDL): two actors can both observe the same column/table as absent and
|
|
209
|
+
* both issue the CREATE/ALTER. The backend serializes DDL so the object lands EXACTLY once, but
|
|
210
|
+
* the loser's operation fails with an already-exists / duplicate-name error. Before this
|
|
211
|
+
* reconcile that error propagated out of Db.init — a booting pod with no unhandledRejection
|
|
212
|
+
* handler exited (CrashLoopBackOff) and the migration Job exited 1 (a spurious migration-gate
|
|
213
|
+
* failure).
|
|
214
|
+
*
|
|
215
|
+
* This is NOT a blanket swallow (that would mask real schema failures). Two independent gates
|
|
216
|
+
* must BOTH pass before a failure is treated as success:
|
|
217
|
+
* 1. CLASS — the driver's schema layer, which owns the backend's error codes/messages, must
|
|
218
|
+
* classify the error as the already-exists class ({@link SchemaOperations.isAlreadyExistsError}).
|
|
219
|
+
* A driver that does not implement the classifier always rethrows here.
|
|
220
|
+
* 2. INTENDED DEFINITION — a re-read of the live schema (the same metadata-backed detection
|
|
221
|
+
* getTableChanges uses) must confirm every table now exists AND has no remaining changes of
|
|
222
|
+
* the kind we attempted. A concurrent actor applying our EXACT change satisfies this; a
|
|
223
|
+
* genuine conflict (e.g. the column landed with a different type, so a column-type change is
|
|
224
|
+
* still outstanding) does not.
|
|
225
|
+
* If either gate fails, the ORIGINAL error propagates unchanged. Because every actor runs this
|
|
226
|
+
* same reconcile, it closes all three windows: migration-Job-vs-pod, pod-vs-pod, and
|
|
227
|
+
* multi-replica boot.
|
|
228
|
+
*
|
|
229
|
+
* OBSERVABILITY: this path is reached ONLY from the create/alter catch (the no-error happy path
|
|
230
|
+
* never calls it). Every outcome that reaches the intended-definition gate is logged LOUDLY at
|
|
231
|
+
* WARN — tolerance fired (treated as applied) OR the re-read failed (genuine conflict / still
|
|
232
|
+
* absent, re-throwing) — so an unexpected activation is visible in prod logs rather than silent.
|
|
233
|
+
*/
|
|
234
|
+
TableManager.prototype.reconcileConcurrentSchemaChange = function (tables, error) {
|
|
235
|
+
var _a, _b;
|
|
236
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
237
|
+
var tableNames, reason, _i, tables_2, table, remainingChanges;
|
|
238
|
+
return __generator(this, function (_c) {
|
|
239
|
+
switch (_c.label) {
|
|
240
|
+
case 0:
|
|
241
|
+
if (!((_b = (_a = this.schemaOperations).isAlreadyExistsError) === null || _b === void 0 ? void 0 : _b.call(_a, error))) {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
tableNames = tables.map(function (table) { return table.name; }).join(', ');
|
|
245
|
+
reason = this.schemaErrorReason(error);
|
|
246
|
+
_i = 0, tables_2 = tables;
|
|
247
|
+
_c.label = 1;
|
|
248
|
+
case 1:
|
|
249
|
+
if (!(_i < tables_2.length)) return [3 /*break*/, 5];
|
|
250
|
+
table = tables_2[_i];
|
|
251
|
+
return [4 /*yield*/, this.tableExists(table)];
|
|
252
|
+
case 2:
|
|
253
|
+
// A create that failed already-exists yet leaves the table absent is not the
|
|
254
|
+
// concurrent-winner case — surface the original error rather than masking it.
|
|
255
|
+
if (!(_c.sent())) {
|
|
256
|
+
this.logger.warn({
|
|
257
|
+
message: "[schema reconcile] caught ALREADY_EXISTS for table(s) '".concat(tableNames, "' but '").concat(table.name, "' is still absent on re-read \u2014 NOT a concurrent apply; re-throwing. reason: ").concat(reason),
|
|
258
|
+
});
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
return [4 /*yield*/, this.getTableChanges(table)];
|
|
262
|
+
case 3:
|
|
263
|
+
remainingChanges = _c.sent();
|
|
264
|
+
if (this.shouldAlterTable(remainingChanges)) {
|
|
265
|
+
// The object exists but the live schema still differs from the intended definition, so a
|
|
266
|
+
// concurrent actor did NOT apply our exact change (a genuine conflict). Propagate.
|
|
267
|
+
this.logger.warn({
|
|
268
|
+
message: "[schema reconcile] caught ALREADY_EXISTS for table '".concat(table.name, "' but the live schema does NOT match the intended definition on re-read (genuine conflict) \u2014 re-throwing. reason: ").concat(reason),
|
|
269
|
+
obj: { remainingChanges: remainingChanges },
|
|
270
|
+
});
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
_c.label = 4;
|
|
274
|
+
case 4:
|
|
275
|
+
_i++;
|
|
276
|
+
return [3 /*break*/, 1];
|
|
277
|
+
case 5:
|
|
278
|
+
this.logger.warn({
|
|
279
|
+
message: "[schema reconcile] tolerated concurrent ALREADY_EXISTS for table(s) '".concat(tableNames, "' \u2014 re-read verified the object present with the intended definition, treating as applied (a concurrent actor won the race). reason: ").concat(reason),
|
|
280
|
+
});
|
|
281
|
+
return [2 /*return*/];
|
|
164
282
|
}
|
|
165
283
|
});
|
|
166
284
|
});
|
|
167
285
|
};
|
|
286
|
+
/** Concise, loggable reason from a schema-update error: the backend names the offending object
|
|
287
|
+
* in `details` (validation phase) or `message` (apply phase). */
|
|
288
|
+
TableManager.prototype.schemaErrorReason = function (error) {
|
|
289
|
+
var _a, _b;
|
|
290
|
+
var candidate = error;
|
|
291
|
+
return String((_b = (_a = candidate === null || candidate === void 0 ? void 0 : candidate.details) !== null && _a !== void 0 ? _a : candidate === null || candidate === void 0 ? void 0 : candidate.message) !== null && _b !== void 0 ? _b : error);
|
|
292
|
+
};
|
|
168
293
|
TableManager.prototype.validateDynamicReferenceColumns = function (table) {
|
|
169
294
|
var isDynamicRefColumn = function (column) {
|
|
170
295
|
return typeof column.dynamicRefTableColName === 'string';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableManager.js","sourceRoot":"","sources":["../../../src/schema/TableManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableManager.js","sourceRoot":"","sources":["../../../src/schema/TableManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteinjs/db",
|
|
3
|
-
"version": "1.32.
|
|
3
|
+
"version": "1.32.2",
|
|
4
4
|
"main": "./dist/generated/index.js",
|
|
5
5
|
"types": "./dist/generated/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"ts-jest": "29.1.1",
|
|
67
67
|
"typescript": "5.2.2"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "744307f0dc93bb03bf9cecb76251a6848511b327"
|
|
70
70
|
}
|
|
@@ -9,6 +9,21 @@ export interface SchemaOperations {
|
|
|
9
9
|
*/
|
|
10
10
|
createTables(tables: Table<any>[]): Promise<void>;
|
|
11
11
|
alterTable(table: Table<any>, changes: TableChanges): Promise<void>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Classify a create/alter DDL error as the backend's "already exists" class — the loser's
|
|
15
|
+
* outcome when two actors concurrently create the same table/index or add the same column and
|
|
16
|
+
* the backend serializes the DDL so the object lands exactly once. Backend-specific (each driver
|
|
17
|
+
* owns its error codes/messages), so it is optional: a driver that does not implement it opts out
|
|
18
|
+
* of {@link TableManager}'s concurrent-reconcile tolerance and keeps the strict rethrow.
|
|
19
|
+
*
|
|
20
|
+
* MUST match on error CLASS (status code + a specific message class), never a loose substring —
|
|
21
|
+
* it decides whether a failure is eligible for verify-then-succeed, and a genuine failure that
|
|
22
|
+
* slipped into this class would be masked. The tolerance is still safe because TableManager
|
|
23
|
+
* re-reads and confirms the intended definition before treating it as success; this predicate is
|
|
24
|
+
* the first gate, not the whole guard.
|
|
25
|
+
*/
|
|
26
|
+
isAlreadyExistsError?(error: unknown): boolean;
|
|
12
27
|
}
|
|
13
28
|
|
|
14
29
|
interface Index {
|
|
@@ -55,7 +55,11 @@ export class TableManager {
|
|
|
55
55
|
|
|
56
56
|
if (absentTables.length > 0) {
|
|
57
57
|
this.logger.info({ message: `Creating tables: ${absentTables.map((table) => table.name).join(', ')}` });
|
|
58
|
-
|
|
58
|
+
try {
|
|
59
|
+
await this.schemaOperations.createTables(absentTables);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
await this.reconcileConcurrentSchemaChange(absentTables, error);
|
|
62
|
+
}
|
|
59
63
|
this.logger.info({ message: `Finished creating ${absentTables.length} tables` });
|
|
60
64
|
}
|
|
61
65
|
|
|
@@ -71,7 +75,11 @@ export class TableManager {
|
|
|
71
75
|
await this.alterTableIfChanged(table);
|
|
72
76
|
} else {
|
|
73
77
|
this.logger.info({ message: `Creating table: ${table.name}` });
|
|
74
|
-
|
|
78
|
+
try {
|
|
79
|
+
await this.schemaOperations.createTables([table]);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
await this.reconcileConcurrentSchemaChange([table], error);
|
|
82
|
+
}
|
|
75
83
|
this.logger.info({ message: `Finished creating table: ${table.name}` });
|
|
76
84
|
}
|
|
77
85
|
}
|
|
@@ -80,11 +88,89 @@ export class TableManager {
|
|
|
80
88
|
const tableChanges = await this.getTableChanges(table);
|
|
81
89
|
if (this.shouldAlterTable(tableChanges)) {
|
|
82
90
|
this.logger.info({ message: `Altering table: ${table.name}` });
|
|
83
|
-
|
|
91
|
+
try {
|
|
92
|
+
await this.schemaOperations.alterTable(table, tableChanges);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
await this.reconcileConcurrentSchemaChange([table], error);
|
|
95
|
+
}
|
|
84
96
|
this.logger.info({ message: `Finished altering table: ${table.name}` });
|
|
85
97
|
}
|
|
86
98
|
}
|
|
87
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Reconcile a create/alter DDL failure against a concurrent schema change, closing the
|
|
102
|
+
* check-then-act race in loadTable/loadTables.
|
|
103
|
+
*
|
|
104
|
+
* On a schema-changing release the migration Job, booting pods, and multiple replicas all run
|
|
105
|
+
* Db.init -> loadTables at once. Reconcile is check-then-act (read INFORMATION_SCHEMA -> decide
|
|
106
|
+
* create/alter -> apply DDL): two actors can both observe the same column/table as absent and
|
|
107
|
+
* both issue the CREATE/ALTER. The backend serializes DDL so the object lands EXACTLY once, but
|
|
108
|
+
* the loser's operation fails with an already-exists / duplicate-name error. Before this
|
|
109
|
+
* reconcile that error propagated out of Db.init — a booting pod with no unhandledRejection
|
|
110
|
+
* handler exited (CrashLoopBackOff) and the migration Job exited 1 (a spurious migration-gate
|
|
111
|
+
* failure).
|
|
112
|
+
*
|
|
113
|
+
* This is NOT a blanket swallow (that would mask real schema failures). Two independent gates
|
|
114
|
+
* must BOTH pass before a failure is treated as success:
|
|
115
|
+
* 1. CLASS — the driver's schema layer, which owns the backend's error codes/messages, must
|
|
116
|
+
* classify the error as the already-exists class ({@link SchemaOperations.isAlreadyExistsError}).
|
|
117
|
+
* A driver that does not implement the classifier always rethrows here.
|
|
118
|
+
* 2. INTENDED DEFINITION — a re-read of the live schema (the same metadata-backed detection
|
|
119
|
+
* getTableChanges uses) must confirm every table now exists AND has no remaining changes of
|
|
120
|
+
* the kind we attempted. A concurrent actor applying our EXACT change satisfies this; a
|
|
121
|
+
* genuine conflict (e.g. the column landed with a different type, so a column-type change is
|
|
122
|
+
* still outstanding) does not.
|
|
123
|
+
* If either gate fails, the ORIGINAL error propagates unchanged. Because every actor runs this
|
|
124
|
+
* same reconcile, it closes all three windows: migration-Job-vs-pod, pod-vs-pod, and
|
|
125
|
+
* multi-replica boot.
|
|
126
|
+
*
|
|
127
|
+
* OBSERVABILITY: this path is reached ONLY from the create/alter catch (the no-error happy path
|
|
128
|
+
* never calls it). Every outcome that reaches the intended-definition gate is logged LOUDLY at
|
|
129
|
+
* WARN — tolerance fired (treated as applied) OR the re-read failed (genuine conflict / still
|
|
130
|
+
* absent, re-throwing) — so an unexpected activation is visible in prod logs rather than silent.
|
|
131
|
+
*/
|
|
132
|
+
private async reconcileConcurrentSchemaChange(tables: Table<any>[], error: unknown): Promise<void> {
|
|
133
|
+
if (!this.schemaOperations.isAlreadyExistsError?.(error)) {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const tableNames = tables.map((table) => table.name).join(', ');
|
|
138
|
+
const reason = this.schemaErrorReason(error);
|
|
139
|
+
|
|
140
|
+
for (const table of tables) {
|
|
141
|
+
// A create that failed already-exists yet leaves the table absent is not the
|
|
142
|
+
// concurrent-winner case — surface the original error rather than masking it.
|
|
143
|
+
if (!(await this.tableExists(table))) {
|
|
144
|
+
this.logger.warn({
|
|
145
|
+
message: `[schema reconcile] caught ALREADY_EXISTS for table(s) '${tableNames}' but '${table.name}' is still absent on re-read — NOT a concurrent apply; re-throwing. reason: ${reason}`,
|
|
146
|
+
});
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const remainingChanges = await this.getTableChanges(table);
|
|
151
|
+
if (this.shouldAlterTable(remainingChanges)) {
|
|
152
|
+
// The object exists but the live schema still differs from the intended definition, so a
|
|
153
|
+
// concurrent actor did NOT apply our exact change (a genuine conflict). Propagate.
|
|
154
|
+
this.logger.warn({
|
|
155
|
+
message: `[schema reconcile] caught ALREADY_EXISTS for table '${table.name}' but the live schema does NOT match the intended definition on re-read (genuine conflict) — re-throwing. reason: ${reason}`,
|
|
156
|
+
obj: { remainingChanges },
|
|
157
|
+
});
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
this.logger.warn({
|
|
163
|
+
message: `[schema reconcile] tolerated concurrent ALREADY_EXISTS for table(s) '${tableNames}' — re-read verified the object present with the intended definition, treating as applied (a concurrent actor won the race). reason: ${reason}`,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Concise, loggable reason from a schema-update error: the backend names the offending object
|
|
168
|
+
* in `details` (validation phase) or `message` (apply phase). */
|
|
169
|
+
private schemaErrorReason(error: unknown): string {
|
|
170
|
+
const candidate = error as { details?: unknown; message?: unknown } | undefined;
|
|
171
|
+
return String(candidate?.details ?? candidate?.message ?? error);
|
|
172
|
+
}
|
|
173
|
+
|
|
88
174
|
private validateDynamicReferenceColumns(table: Table<any>): void {
|
|
89
175
|
const isDynamicRefColumn = (column: any): column is DynamicReferenceColumn<any> =>
|
|
90
176
|
typeof column.dynamicRefTableColName === 'string';
|