@proteinjs/db-driver-spanner 1.13.0 → 1.14.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/dist/generated/index.js +1 -1
  4. package/dist/generated/index.js.map +1 -1
  5. package/dist/generated/test/index.js +1 -1
  6. package/dist/generated/test/index.js.map +1 -1
  7. package/dist/src/SpannerConfig.d.ts +22 -0
  8. package/dist/src/SpannerConfig.d.ts.map +1 -1
  9. package/dist/src/SpannerDriver.d.ts +46 -11
  10. package/dist/src/SpannerDriver.d.ts.map +1 -1
  11. package/dist/src/SpannerDriver.js +170 -25
  12. package/dist/src/SpannerDriver.js.map +1 -1
  13. package/dist/src/SpannerLivenessMonitor.d.ts +25 -0
  14. package/dist/src/SpannerLivenessMonitor.d.ts.map +1 -1
  15. package/dist/src/SpannerLivenessMonitor.js +48 -2
  16. package/dist/src/SpannerLivenessMonitor.js.map +1 -1
  17. package/dist/test/SessionPoolExhaustion.test.d.ts +2 -0
  18. package/dist/test/SessionPoolExhaustion.test.d.ts.map +1 -0
  19. package/dist/test/SessionPoolExhaustion.test.js +230 -0
  20. package/dist/test/SessionPoolExhaustion.test.js.map +1 -0
  21. package/dist/test/SpannerLivenessMonitor.test.js +42 -0
  22. package/dist/test/SpannerLivenessMonitor.test.js.map +1 -1
  23. package/dist/test/SpannerOperationDeadline.test.d.ts +2 -0
  24. package/dist/test/SpannerOperationDeadline.test.d.ts.map +1 -0
  25. package/dist/test/SpannerOperationDeadline.test.js +227 -0
  26. package/dist/test/SpannerOperationDeadline.test.js.map +1 -0
  27. package/dist/test/TransactionSafety.test.d.ts +2 -0
  28. package/dist/test/TransactionSafety.test.d.ts.map +1 -0
  29. package/dist/test/TransactionSafety.test.js +325 -0
  30. package/dist/test/TransactionSafety.test.js.map +1 -0
  31. package/generated/index.ts +6 -9
  32. package/generated/test/index.ts +8 -11
  33. package/package.json +6 -5
  34. package/src/SpannerConfig.ts +22 -0
  35. package/src/SpannerDriver.ts +185 -27
  36. package/src/SpannerLivenessMonitor.ts +61 -3
  37. package/test/SessionPoolExhaustion.test.ts +127 -0
  38. package/test/SpannerLivenessMonitor.test.ts +55 -0
  39. package/test/SpannerOperationDeadline.test.ts +156 -0
  40. package/test/TransactionSafety.test.ts +157 -0
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ var db_1 = require("@proteinjs/db");
66
+ var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
67
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
68
+ var getDropTestTable_1 = require("./util/getDropTestTable");
69
+ var SpannerEmulatorProvisioner_1 = require("./util/SpannerEmulatorProvisioner");
70
+ require("../generated/test/index");
71
+ var WedgeEmployeeTestTable = /** @class */ (function (_super) {
72
+ __extends(WedgeEmployeeTestTable, _super);
73
+ function WedgeEmployeeTestTable() {
74
+ var _this = _super !== null && _super.apply(this, arguments) || this;
75
+ _this.name = 'db_test_pool_wedge_employee';
76
+ _this.columns = (0, db_1.withRecordColumns)({
77
+ name: new db_1.StringColumn('name'),
78
+ department: new db_1.StringColumn('department'),
79
+ });
80
+ return _this;
81
+ }
82
+ return WedgeEmployeeTestTable;
83
+ }(db_1.Table));
84
+ var employeeTable = new WedgeEmployeeTestTable();
85
+ // Local table — not in any reflection source graph, so thread getTable explicitly.
86
+ var getTable = function () { return employeeTable; };
87
+ var spannerConfig = {
88
+ projectId: 'proteinjs-test',
89
+ instanceName: 'proteinjs-test',
90
+ databaseName: 'test',
91
+ };
92
+ // max: 1 makes pool mechanics observable in miniature. This file must stay its own jest
93
+ // file — SpannerDriver.SPANNER_DB is a process-wide static, so the max-1 pool would leak
94
+ // into other suites.
95
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver(__assign(__assign({}, spannerConfig), { sessionPoolOptions: { max: 1, min: 1, acquireTimeout: 2000, fail: true } }), getTable);
96
+ var getSessionPool = function () {
97
+ var db = spannerDriver.getSpannerDb();
98
+ return db.pool_;
99
+ };
100
+ /**
101
+ * Pool mechanics at max=1 (plans/DB_PERF_PLAN.md P2):
102
+ * 1. The historical wedge — an operation inside a transaction acquiring a SECOND session while
103
+ * the transaction holds the only one — is DESIGNED OUT by the stateless transaction
104
+ * contract: every operation inside the body rides the held session, so the shape that
105
+ * bricked the process cannot be expressed. Proven here at max=1.
106
+ * 2. The exhaustion class that remains REAL — more concurrent transactions than sessions —
107
+ * is documented with two parallel transactions.
108
+ */
109
+ describe('Session pool at max=1 (wedge designed out; real exhaustion documented)', function () {
110
+ var dropTable = (0, getDropTestTable_1.getDropTestTable)(spannerDriver);
111
+ var preconstructedDb = new db_1.Db(spannerDriver, getTable, new db_transaction_context_1.TransactionContext());
112
+ var txnDb = new db_1.Db(spannerDriver, getTable, new db_transaction_context_1.TransactionContext());
113
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
114
+ var pool;
115
+ return __generator(this, function (_a) {
116
+ switch (_a.label) {
117
+ case 0: return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.ensureProvisioned(spannerConfig)];
118
+ case 1:
119
+ _a.sent();
120
+ return [4 /*yield*/, spannerDriver.createDbIfNotExists()];
121
+ case 2:
122
+ _a.sent();
123
+ pool = getSessionPool();
124
+ pool.options.fail = false;
125
+ return [4 /*yield*/, spannerDriver.getTableManager().loadTable(employeeTable)];
126
+ case 3:
127
+ _a.sent();
128
+ pool.options.fail = true;
129
+ return [2 /*return*/];
130
+ }
131
+ });
132
+ }); }, 60000);
133
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
134
+ return __generator(this, function (_a) {
135
+ switch (_a.label) {
136
+ case 0:
137
+ getSessionPool().options.fail = false; // teardown queries queue like setup's
138
+ return [4 /*yield*/, dropTable(employeeTable)];
139
+ case 1:
140
+ _a.sent();
141
+ return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.release()];
142
+ case 2:
143
+ _a.sent();
144
+ return [2 /*return*/];
145
+ }
146
+ });
147
+ }); }, 60000);
148
+ test('SpannerConfig.sessionPoolOptions reach the session pool', function () {
149
+ var pool = getSessionPool();
150
+ expect(pool.options.max).toBe(1);
151
+ expect(pool.options.min).toBe(1);
152
+ expect(pool.options.acquireTimeout).toBe(2000);
153
+ expect(pool.options.fail).toBe(true);
154
+ });
155
+ test('wedge DESIGNED OUT: at max=1, a pre-constructed Db inside a transaction rides the held session and just works', function () { return __awaiter(void 0, void 0, void 0, function () {
156
+ var employee, inserted, committed;
157
+ return __generator(this, function (_a) {
158
+ switch (_a.label) {
159
+ case 0:
160
+ employee = {
161
+ name: 'PoolWedgeDesignedOut',
162
+ department: 'Engineering',
163
+ };
164
+ return [4 /*yield*/, txnDb.runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () {
165
+ var emp, seen;
166
+ return __generator(this, function (_a) {
167
+ switch (_a.label) {
168
+ case 0: return [4 /*yield*/, txnDb.insert(employeeTable, employee)];
169
+ case 1:
170
+ emp = _a.sent();
171
+ return [4 /*yield*/, preconstructedDb.query(employeeTable, { name: employee.name })];
172
+ case 2:
173
+ seen = _a.sent();
174
+ expect(seen.length).toBe(1);
175
+ return [2 /*return*/, emp];
176
+ }
177
+ });
178
+ }); })];
179
+ case 1:
180
+ inserted = _a.sent();
181
+ return [4 /*yield*/, preconstructedDb.query(employeeTable, { id: inserted.id })];
182
+ case 2:
183
+ committed = _a.sent();
184
+ expect(committed.length).toBe(1);
185
+ return [4 /*yield*/, txnDb.delete(employeeTable, { id: inserted.id })];
186
+ case 3:
187
+ _a.sent();
188
+ return [2 /*return*/];
189
+ }
190
+ });
191
+ }); }, 30000);
192
+ test('real exhaustion class: a second PARALLEL transaction errors fast when the pool is spent (fail: true)', function () { return __awaiter(void 0, void 0, void 0, function () {
193
+ var releaseHold, holdGate, holder;
194
+ return __generator(this, function (_a) {
195
+ switch (_a.label) {
196
+ case 0:
197
+ holdGate = new Promise(function (resolve) { return (releaseHold = resolve); });
198
+ holder = txnDb.runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () {
199
+ return __generator(this, function (_a) {
200
+ switch (_a.label) {
201
+ case 0: return [4 /*yield*/, holdGate];
202
+ case 1:
203
+ _a.sent();
204
+ return [2 /*return*/, 'held'];
205
+ }
206
+ });
207
+ }); });
208
+ // Second transaction cannot get a session; with fail: true it errors immediately instead
209
+ // of joining the pool's silent infinite FIFO (the production-default hang this file's
210
+ // options exist to surface).
211
+ return [4 /*yield*/, expect(preconstructedDb.runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
212
+ return [2 /*return*/, 'never-runs'];
213
+ }); }); })).rejects.toMatchObject({
214
+ name: 'SessionPoolExhaustedError',
215
+ })];
216
+ case 1:
217
+ // Second transaction cannot get a session; with fail: true it errors immediately instead
218
+ // of joining the pool's silent infinite FIFO (the production-default hang this file's
219
+ // options exist to surface).
220
+ _a.sent();
221
+ releaseHold();
222
+ return [4 /*yield*/, expect(holder).resolves.toBe('held')];
223
+ case 2:
224
+ _a.sent();
225
+ return [2 /*return*/];
226
+ }
227
+ });
228
+ }); }, 30000);
229
+ });
230
+ //# sourceMappingURL=SessionPoolExhaustion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionPoolExhaustion.test.js","sourceRoot":"","sources":["../../test/SessionPoolExhaustion.test.ts"],"names":[],"mappings":"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"}
@@ -178,4 +178,46 @@ describe('SpannerLivenessMonitor', function () {
178
178
  });
179
179
  }); });
180
180
  });
181
+ describe('SpannerLivenessMonitor pool gauge (P4a)', function () {
182
+ var fakePool = { size: 25, available: 20, borrowed: 5, totalWaiters: 0 };
183
+ var monitor;
184
+ var warnLogSpy;
185
+ beforeEach(function () {
186
+ fakePool.size = 25;
187
+ fakePool.available = 20;
188
+ fakePool.borrowed = 5;
189
+ fakePool.totalWaiters = 0;
190
+ monitor = new db_driver_spanner_1.SpannerLivenessMonitor({ pool_: fakePool });
191
+ warnLogSpy = jest.spyOn(monitor.logger, 'warn').mockImplementation(function () { });
192
+ });
193
+ afterEach(function () {
194
+ jest.restoreAllMocks();
195
+ });
196
+ test('poolStats surfaces the four pool numbers', function () {
197
+ expect(monitor.poolStats()).toEqual({ size: 25, available: 20, borrowed: 5, totalWaiters: 0 });
198
+ });
199
+ test('no waiters: no pressure warning', function () {
200
+ monitor.logPoolPressure(1000);
201
+ expect(warnLogSpy).not.toHaveBeenCalled();
202
+ });
203
+ test('waiters > 0: warns with the four pool numbers', function () {
204
+ fakePool.available = 0;
205
+ fakePool.borrowed = 25;
206
+ fakePool.totalWaiters = 3;
207
+ monitor.logPoolPressure(1000);
208
+ expect(warnLogSpy).toHaveBeenCalledTimes(1);
209
+ expect(warnLogSpy).toHaveBeenCalledWith(expect.objectContaining({
210
+ message: expect.stringContaining('session pool under pressure'),
211
+ obj: { size: 25, available: 0, borrowed: 25, totalWaiters: 3 },
212
+ }));
213
+ });
214
+ test('pressure warnings are throttled to one per interval', function () {
215
+ fakePool.totalWaiters = 3;
216
+ monitor.logPoolPressure(1000);
217
+ monitor.logPoolPressure(2000); // within the 10s interval — suppressed
218
+ expect(warnLogSpy).toHaveBeenCalledTimes(1);
219
+ monitor.logPoolPressure(11000); // interval elapsed — warns again
220
+ expect(warnLogSpy).toHaveBeenCalledTimes(2);
221
+ });
222
+ });
181
223
  //# sourceMappingURL=SpannerLivenessMonitor.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpannerLivenessMonitor.test.js","sourceRoot":"","sources":["../../test/SpannerLivenessMonitor.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpannerLivenessMonitor.test.js","sourceRoot":"","sources":["../../test/SpannerLivenessMonitor.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kEAAsE;AActE,kEAAkE;AAClE,IAAM,mBAAmB,GAAG,MAAO,CAAC;AAEpC,QAAQ,CAAC,wBAAwB,EAAE;IACjC,IAAI,OAA+B,CAAC;IACpC,IAAI,SAA2B,CAAC;IAChC,IAAI,QAA0B,CAAC;IAC/B,IAAI,OAAyB,CAAC;IAC9B,IAAI,WAA6B,CAAC;IAElC,UAAU,CAAC;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,0CAAsB,CAAC,EAAc,CAAC,CAAC;QACrD,SAAS,GAAG,OAAsC,CAAC;QACnD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAc,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAc,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,cAAO,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,cAAO,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,cAAO,CAAC,CAAC,CAAC;QAClE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,cAAO,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE;;;;;oBACzD,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAEhC,KAAK,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;oBACzC,qBAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAA;;oBAAtC,SAAsC,CAAC;oBACvC,qBAAM,KAAK,EAAA;;oBAAX,SAAW,CAAC;oBAEZ,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBACvC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;SAC7C,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE;;;;;oBACzD,QAAQ;yBACL,qBAAqB,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;yBAC7D,qBAAqB,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;yBAC7D,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAE1B,KAAK,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;oBACzC,qBAAM,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAA;;oBAAxD,SAAwD,CAAC;oBACzD,qBAAM,KAAK,EAAA;;oBAAX,SAAW,CAAC;oBAEZ,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBACvC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;SAC7C,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE;;;;;oBACrE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;oBAE7D,KAAK,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;oBACzC,qBAAM,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAA;;oBAAxD,SAAwD,CAAC;oBACzD,qBAAM,KAAK,EAAA;;oBAAX,SAAW,CAAC;oBAEZ,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,wCAAwC,CAAC,EAAE,CAAC,CACxG,CAAC;;;;SACH,CAAC,CAAC;IAEH,IAAI,CAAC,2GAA2G,EAAE;;;;;oBAChH,yFAAyF;oBACzF,0FAA0F;oBAC1F,4EAA4E;oBAC5E,OAAO,CAAC,WAAW,EAAE,CAAC;oBAChB,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,cAAM,OAAA,SAAS,EAAT,CAAS,CAAU,CAAC,CAAC;oBAClG,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAExD,KAAK,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;oBACzC,qBAAM,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAA;;oBAAxD,SAAwD,CAAC;oBACzD,qBAAM,KAAK,EAAA;;oBAAX,SAAW,CAAC;oBAEZ,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;;;;SACjD,CAAC,CAAC;IAEH,IAAI,CAAC,mFAAmF,EAAE;;;;oBACxF,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAEtC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxF,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBACpF,qBAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAA;;oBAAtC,SAAsC,CAAC;oBAEvC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBACvC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;SAC7C,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE;;;;oBAC5C,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAEtC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrF,qBAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAA;;oBAAtC,SAAsC,CAAC;oBAEvC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBACxC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;;;;SACxC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE;IAClD,IAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC3E,IAAI,OAA+B,CAAC;IACpC,IAAI,UAA4B,CAAC;IAEjC,UAAU,CAAC;QACT,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;QACnB,QAAQ,CAAC,SAAS,GAAG,EAAE,CAAC;QACxB,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtB,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;QAC1B,OAAO,GAAG,IAAI,0CAAsB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAyB,CAAC,CAAC;QACjF,UAAU,GAAG,IAAI,CAAC,KAAK,CAAE,OAAuC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,cAAO,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE;QAC/C,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE;QACtC,OAAO,CAAC,eAAe,CAAC,IAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE;QACpD,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;QACvB,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;QACvB,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;QAE1B,OAAO,CAAC,eAAe,CAAC,IAAK,CAAC,CAAC;QAE/B,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC;YAC/D,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;SAC/D,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE;QAC1D,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;QAE1B,OAAO,CAAC,eAAe,CAAC,IAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,eAAe,CAAC,IAAK,CAAC,CAAC,CAAC,uCAAuC;QACvE,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE5C,OAAO,CAAC,eAAe,CAAC,KAAM,CAAC,CAAC,CAAC,iCAAiC;QAClE,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SpannerOperationDeadline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpannerOperationDeadline.test.d.ts","sourceRoot":"","sources":["../../test/SpannerOperationDeadline.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
51
+ var statics = db_driver_spanner_1.SpannerDriver;
52
+ var fakeMonitor = {
53
+ logPoolPressure: function () { return undefined; },
54
+ poolStats: function () { return ({ size: 0, available: 0, borrowed: 0, totalWaiters: 0 }); },
55
+ reportError: function () { return undefined; },
56
+ stop: function () { return undefined; },
57
+ };
58
+ var hang = function () { return new Promise(function () { return undefined; }); };
59
+ var generateStatement = (function () { return ({ sql: 'UPDATE t SET x = 1', namedParams: { params: {} } }); });
60
+ var waitFor = function (condition, timeoutMs, label) { return __awaiter(void 0, void 0, void 0, function () {
61
+ var deadline;
62
+ return __generator(this, function (_a) {
63
+ switch (_a.label) {
64
+ case 0:
65
+ deadline = Date.now() + timeoutMs;
66
+ _a.label = 1;
67
+ case 1:
68
+ if (!(Date.now() < deadline)) return [3 /*break*/, 3];
69
+ if (condition()) {
70
+ return [2 /*return*/];
71
+ }
72
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 25); })];
73
+ case 2:
74
+ _a.sent();
75
+ return [3 /*break*/, 1];
76
+ case 3: throw new Error("Timed out waiting for: ".concat(label));
77
+ }
78
+ });
79
+ }); };
80
+ var makeDriver = function (config, db) {
81
+ statics.SPANNER_DB = db;
82
+ statics.LIVENESS_MONITOR = fakeMonitor;
83
+ var driver = new db_driver_spanner_1.SpannerDriver(__assign({ projectId: 'fake', instanceName: 'fake', databaseName: 'fake' }, config));
84
+ // deadline/error logs are expected output of these tests — keep the run quiet
85
+ jest.spyOn(driver.logger, 'error').mockImplementation(function () { return undefined; });
86
+ jest.spyOn(driver.logger, 'warn').mockImplementation(function () { return undefined; });
87
+ return driver;
88
+ };
89
+ describe('Spanner op deadlines', function () {
90
+ beforeEach(function () {
91
+ statics.CLIENT_GENERATION = 0;
92
+ statics.CONSECUTIVE_DEADLINE_FAILURES = 0;
93
+ });
94
+ afterEach(function () {
95
+ statics.SPANNER = undefined;
96
+ statics.SPANNER_INSTANCE = undefined;
97
+ statics.SPANNER_DB = undefined;
98
+ statics.LIVENESS_MONITOR = undefined;
99
+ statics.CONSECUTIVE_DEADLINE_FAILURES = 0;
100
+ jest.restoreAllMocks();
101
+ });
102
+ test('a hanging query op fails at the deadline with an error naming it, carrying the same gRPC deadline', function () { return __awaiter(void 0, void 0, void 0, function () {
103
+ var run, driver;
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0:
107
+ run = jest.fn(function (_request) { return hang(); });
108
+ driver = makeDriver({ operationDeadlineMs: 150, deadlineFailuresBeforeRecycle: 99 }, { run: run });
109
+ return [4 /*yield*/, expect(driver.runQuery(generateStatement)).rejects.toThrow(/150ms deadline.*spanner query/)];
110
+ case 1:
111
+ _a.sent();
112
+ // The gRPC deadline on the request is the lever that cancels the RPC on a dead channel —
113
+ // the library's stream error path is what returns the borrowed session to the pool.
114
+ expect(run.mock.calls[0][0]).toMatchObject({ gaxOptions: { timeout: 150 } });
115
+ return [2 /*return*/];
116
+ }
117
+ });
118
+ }); }, 5000);
119
+ test('a dml transaction hung on a dead channel (dml AND rollback hang) still RETURNS its session', function () { return __awaiter(void 0, void 0, void 0, function () {
120
+ var released, transaction, db, driver;
121
+ return __generator(this, function (_a) {
122
+ switch (_a.label) {
123
+ case 0:
124
+ released = [];
125
+ transaction = {
126
+ runUpdate: jest.fn(function () { return hang(); }),
127
+ rollback: jest.fn(function () { return hang(); }),
128
+ commit: jest.fn(function () { return hang(); }),
129
+ };
130
+ db = {
131
+ runTransactionAsync: function (fn) { return __awaiter(void 0, void 0, void 0, function () {
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0:
135
+ _a.trys.push([0, , 2, 3]);
136
+ return [4 /*yield*/, fn(transaction)];
137
+ case 1: return [2 /*return*/, _a.sent()];
138
+ case 2:
139
+ released.push('session');
140
+ return [7 /*endfinally*/];
141
+ case 3: return [2 /*return*/];
142
+ }
143
+ });
144
+ }); },
145
+ };
146
+ driver = makeDriver({ operationDeadlineMs: 150, deadlineFailuresBeforeRecycle: 99 }, db);
147
+ return [4 /*yield*/, expect(driver.runDml(generateStatement)).rejects.toThrow(/deadline/)];
148
+ case 1:
149
+ _a.sent();
150
+ // dml deadline (~150ms) → bounded rollback deadline (~150ms more) → run function settles
151
+ // → the library's finally releases the session. A leak shows up as this wait timing out.
152
+ return [4 /*yield*/, waitFor(function () { return released.length === 1; }, 2000, 'session returned to the pool')];
153
+ case 2:
154
+ // dml deadline (~150ms) → bounded rollback deadline (~150ms more) → run function settles
155
+ // → the library's finally releases the session. A leak shows up as this wait timing out.
156
+ _a.sent();
157
+ expect(transaction.rollback).toHaveBeenCalled();
158
+ return [2 /*return*/];
159
+ }
160
+ });
161
+ }); }, 5000);
162
+ test('channel-death recycle: 3 consecutive deadline failures recycle the client once; success resets the count', function () { return __awaiter(void 0, void 0, void 0, function () {
163
+ var hangOps, db, driver, recycleSpy, failingOp;
164
+ return __generator(this, function (_a) {
165
+ switch (_a.label) {
166
+ case 0:
167
+ hangOps = true;
168
+ db = { run: jest.fn(function () { return (hangOps ? hang() : Promise.resolve([[]])); }) };
169
+ driver = makeDriver({ operationDeadlineMs: 100, deadlineFailuresBeforeRecycle: 3 }, db);
170
+ recycleSpy = jest.spyOn(driver, 'recycleClient').mockImplementation(function () {
171
+ statics.CLIENT_GENERATION += 1;
172
+ });
173
+ failingOp = function () { return expect(driver.runQuery(generateStatement)).rejects.toThrow(/deadline/); };
174
+ return [4 /*yield*/, failingOp()];
175
+ case 1:
176
+ _a.sent();
177
+ return [4 /*yield*/, failingOp()];
178
+ case 2:
179
+ _a.sent();
180
+ expect(recycleSpy).not.toHaveBeenCalled();
181
+ // Any success resets the consecutive count.
182
+ hangOps = false;
183
+ return [4 /*yield*/, driver.runQuery(generateStatement)];
184
+ case 3:
185
+ _a.sent();
186
+ expect(statics.CONSECUTIVE_DEADLINE_FAILURES).toBe(0);
187
+ hangOps = true;
188
+ return [4 /*yield*/, failingOp()];
189
+ case 4:
190
+ _a.sent();
191
+ return [4 /*yield*/, failingOp()];
192
+ case 5:
193
+ _a.sent();
194
+ expect(recycleSpy).not.toHaveBeenCalled(); // the reset really pushed the threshold out
195
+ return [4 /*yield*/, failingOp()];
196
+ case 6:
197
+ _a.sent();
198
+ expect(recycleSpy).toHaveBeenCalledTimes(1); // 3rd consecutive failure → one recycle
199
+ expect(statics.CONSECUTIVE_DEADLINE_FAILURES).toBe(0);
200
+ return [2 /*return*/];
201
+ }
202
+ });
203
+ }); }, 10000);
204
+ test('deadline failures from a recycled (stale-generation) client never count against the fresh channel', function () { return __awaiter(void 0, void 0, void 0, function () {
205
+ var db, driver, recycleSpy, pending;
206
+ return __generator(this, function (_a) {
207
+ switch (_a.label) {
208
+ case 0:
209
+ db = { run: jest.fn(function () { return hang(); }) };
210
+ driver = makeDriver({ operationDeadlineMs: 100, deadlineFailuresBeforeRecycle: 1 }, db);
211
+ recycleSpy = jest.spyOn(driver, 'recycleClient').mockImplementation(function () {
212
+ statics.CLIENT_GENERATION += 1;
213
+ });
214
+ pending = expect(driver.runQuery(generateStatement)).rejects.toThrow(/deadline/);
215
+ // The client is recycled while the op is in flight — its failure belongs to the old channel.
216
+ statics.CLIENT_GENERATION += 1;
217
+ return [4 /*yield*/, pending];
218
+ case 1:
219
+ _a.sent();
220
+ expect(recycleSpy).not.toHaveBeenCalled();
221
+ expect(statics.CONSECUTIVE_DEADLINE_FAILURES).toBe(0);
222
+ return [2 /*return*/];
223
+ }
224
+ });
225
+ }); }, 5000);
226
+ });
227
+ //# sourceMappingURL=SpannerOperationDeadline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpannerOperationDeadline.test.js","sourceRoot":"","sources":["../../test/SpannerOperationDeadline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=TransactionSafety.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionSafety.test.d.ts","sourceRoot":"","sources":["../../test/TransactionSafety.test.ts"],"names":[],"mappings":"AAKA,OAAO,yBAAyB,CAAC"}