@proteinjs/db-driver-spanner 1.12.3 → 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 (61) 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.d.ts.map +1 -1
  6. package/dist/generated/test/index.js +3 -1
  7. package/dist/generated/test/index.js.map +1 -1
  8. package/dist/src/SpannerConfig.d.ts +22 -0
  9. package/dist/src/SpannerConfig.d.ts.map +1 -1
  10. package/dist/src/SpannerDriver.d.ts +56 -9
  11. package/dist/src/SpannerDriver.d.ts.map +1 -1
  12. package/dist/src/SpannerDriver.js +229 -35
  13. package/dist/src/SpannerDriver.js.map +1 -1
  14. package/dist/src/SpannerLivenessMonitor.d.ts +25 -0
  15. package/dist/src/SpannerLivenessMonitor.d.ts.map +1 -1
  16. package/dist/src/SpannerLivenessMonitor.js +59 -4
  17. package/dist/src/SpannerLivenessMonitor.js.map +1 -1
  18. package/dist/test/ServiceUpdateVerbs.test.d.ts +2 -0
  19. package/dist/test/ServiceUpdateVerbs.test.d.ts.map +1 -0
  20. package/dist/test/ServiceUpdateVerbs.test.js +325 -0
  21. package/dist/test/ServiceUpdateVerbs.test.js.map +1 -0
  22. package/dist/test/SessionPoolExhaustion.test.d.ts +2 -0
  23. package/dist/test/SessionPoolExhaustion.test.d.ts.map +1 -0
  24. package/dist/test/SessionPoolExhaustion.test.js +230 -0
  25. package/dist/test/SessionPoolExhaustion.test.js.map +1 -0
  26. package/dist/test/SessionRecordTableQuery.test.d.ts +2 -0
  27. package/dist/test/SessionRecordTableQuery.test.d.ts.map +1 -0
  28. package/dist/test/SessionRecordTableQuery.test.js +185 -0
  29. package/dist/test/SessionRecordTableQuery.test.js.map +1 -0
  30. package/dist/test/SpannerLivenessMonitor.test.js +65 -0
  31. package/dist/test/SpannerLivenessMonitor.test.js.map +1 -1
  32. package/dist/test/SpannerOperationDeadline.test.d.ts +2 -0
  33. package/dist/test/SpannerOperationDeadline.test.d.ts.map +1 -0
  34. package/dist/test/SpannerOperationDeadline.test.js +227 -0
  35. package/dist/test/SpannerOperationDeadline.test.js.map +1 -0
  36. package/dist/test/TransactionSafety.test.d.ts +2 -0
  37. package/dist/test/TransactionSafety.test.d.ts.map +1 -0
  38. package/dist/test/TransactionSafety.test.js +325 -0
  39. package/dist/test/TransactionSafety.test.js.map +1 -0
  40. package/dist/test/index.d.ts +1 -0
  41. package/dist/test/index.d.ts.map +1 -1
  42. package/dist/test/index.js +1 -0
  43. package/dist/test/index.js.map +1 -1
  44. package/dist/test/util/serviceUpdateVerbsTestTables.d.ts +45 -0
  45. package/dist/test/util/serviceUpdateVerbsTestTables.d.ts.map +1 -0
  46. package/dist/test/util/serviceUpdateVerbsTestTables.js +100 -0
  47. package/dist/test/util/serviceUpdateVerbsTestTables.js.map +1 -0
  48. package/generated/index.ts +6 -9
  49. package/generated/test/index.ts +9 -10
  50. package/package.json +7 -6
  51. package/src/SpannerConfig.ts +22 -0
  52. package/src/SpannerDriver.ts +215 -28
  53. package/src/SpannerLivenessMonitor.ts +73 -5
  54. package/test/ServiceUpdateVerbs.test.ts +188 -0
  55. package/test/SessionPoolExhaustion.test.ts +127 -0
  56. package/test/SessionRecordTableQuery.test.ts +118 -0
  57. package/test/SpannerLivenessMonitor.test.ts +70 -0
  58. package/test/SpannerOperationDeadline.test.ts +156 -0
  59. package/test/TransactionSafety.test.ts +157 -0
  60. package/test/index.ts +1 -0
  61. package/test/util/serviceUpdateVerbsTestTables.ts +55 -0
@@ -102,7 +102,7 @@ var SpannerDriver = /** @class */ (function () {
102
102
  };
103
103
  SpannerDriver.prototype.getSpannerDb = function () {
104
104
  if (!SpannerDriver.SPANNER_DB) {
105
- SpannerDriver.SPANNER_DB = this.getSpannerInstance().database(this.config.databaseName);
105
+ SpannerDriver.SPANNER_DB = this.getSpannerInstance().database(this.config.databaseName, this.config.sessionPoolOptions);
106
106
  SpannerDriver.LIVENESS_MONITOR = new SpannerLivenessMonitor_1.SpannerLivenessMonitor(SpannerDriver.SPANNER_DB).start();
107
107
  }
108
108
  return SpannerDriver.SPANNER_DB;
@@ -210,10 +210,14 @@ var SpannerDriver = /** @class */ (function () {
210
210
  case 1:
211
211
  _b.trys.push([1, 3, , 4]);
212
212
  this.logger.debug({ message: "Executing query", obj: { sql: sql, params: namedParams } });
213
- return [4 /*yield*/, this.logIfStalled('spanner query', sql, runner.run({
213
+ return [4 /*yield*/, this.withDeadline('spanner query', sql, runner.run({
214
214
  sql: sql,
215
215
  params: namedParams === null || namedParams === void 0 ? void 0 : namedParams.params,
216
216
  types: namedParams === null || namedParams === void 0 ? void 0 : namedParams.types,
217
+ // The gRPC deadline is what actually cancels the RPC on a dead channel: the stream
218
+ // errors, the library ends the snapshot, and the borrowed session RETURNS to the
219
+ // pool. The withDeadline race alone would fail the caller but leak the session.
220
+ gaxOptions: { timeout: this.operationDeadlineMs() },
217
221
  }))];
218
222
  case 2:
219
223
  rows = (_b.sent())[0];
@@ -251,23 +255,35 @@ var SpannerDriver = /** @class */ (function () {
251
255
  if (!transaction) return [3 /*break*/, 2];
252
256
  return [4 /*yield*/, this.executeDml(generateStatement, transaction)];
253
257
  case 1: return [2 /*return*/, _a.sent()];
254
- case 2: return [4 /*yield*/, this.logIfStalled('spanner dml transaction', '(runTransactionAsync)', this.getSpannerDb().runTransactionAsync(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
255
- var rowCount;
258
+ case 2: return [4 /*yield*/, this.withDeadline('spanner dml transaction', '(runTransactionAsync)', this.getSpannerDb().runTransactionAsync(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
259
+ var rowCount, error_2;
256
260
  return __generator(this, function (_a) {
257
261
  switch (_a.label) {
258
- case 0: return [4 /*yield*/, this.executeDml(generateStatement, transaction)];
262
+ case 0:
263
+ _a.trys.push([0, 3, , 5]);
264
+ return [4 /*yield*/, this.executeDml(generateStatement, transaction)];
259
265
  case 1:
260
266
  rowCount = _a.sent();
261
- return [4 /*yield*/, transaction.commit()];
267
+ return [4 /*yield*/, this.commit(transaction)];
262
268
  case 2:
263
269
  _a.sent();
264
270
  return [2 /*return*/, rowCount];
271
+ case 3:
272
+ error_2 = _a.sent();
273
+ return [4 /*yield*/, this.rollbackQuietly(transaction)];
274
+ case 4:
275
+ _a.sent();
276
+ throw error_2;
277
+ case 5: return [2 /*return*/];
265
278
  }
266
279
  });
267
280
  }); }))];
268
281
  case 3:
269
282
  // Stalls in the transaction wrapper itself (session acquisition / begin / commit) happen
270
- // OUTSIDE executeDml's instrumentation — wrap the whole round trip too.
283
+ // OUTSIDE executeDml's instrumentation — wrap the whole round trip too. Every await inside
284
+ // the run function is deadline-bounded (dml, commit, rollback): the run function therefore
285
+ // ALWAYS settles, which is what makes runTransactionAsync's own `finally` release the
286
+ // transaction's session back to the pool on a dead channel.
271
287
  return [2 /*return*/, _a.sent()];
272
288
  }
273
289
  });
@@ -275,7 +291,7 @@ var SpannerDriver = /** @class */ (function () {
275
291
  };
276
292
  SpannerDriver.prototype.executeDml = function (generateStatement, runner) {
277
293
  return __awaiter(this, void 0, void 0, function () {
278
- var _a, sql, namedParams, startTime, rowCount, durationMs, error_2, durationMs;
294
+ var _a, sql, namedParams, startTime, rowCount, durationMs, error_3, durationMs;
279
295
  return __generator(this, function (_b) {
280
296
  switch (_b.label) {
281
297
  case 0:
@@ -290,10 +306,13 @@ var SpannerDriver = /** @class */ (function () {
290
306
  case 1:
291
307
  _b.trys.push([1, 3, , 4]);
292
308
  this.logger.debug({ message: "Executing dml", obj: { sql: sql, params: namedParams } });
293
- return [4 /*yield*/, this.logIfStalled('spanner dml', sql, runner.runUpdate({
309
+ return [4 /*yield*/, this.withDeadline('spanner dml', sql, runner.runUpdate({
294
310
  sql: sql,
295
311
  params: namedParams === null || namedParams === void 0 ? void 0 : namedParams.params,
296
312
  types: namedParams === null || namedParams === void 0 ? void 0 : namedParams.types,
313
+ // gRPC deadline: cancels the RPC on a dead channel so the transaction's run function
314
+ // settles and the library releases the session (see runDml).
315
+ gaxOptions: { timeout: this.operationDeadlineMs() },
297
316
  }))];
298
317
  case 2:
299
318
  rowCount = (_b.sent())[0];
@@ -304,14 +323,14 @@ var SpannerDriver = /** @class */ (function () {
304
323
  });
305
324
  return [2 /*return*/, rowCount];
306
325
  case 3:
307
- error_2 = _b.sent();
326
+ error_3 = _b.sent();
308
327
  durationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
309
328
  this.logger.error({
310
329
  message: "Failed when executing dml",
311
- obj: { sql: sql, params: namedParams, errorDetails: error_2.details, durationMs: durationMs },
330
+ obj: { sql: sql, params: namedParams, errorDetails: error_3.details, durationMs: durationMs },
312
331
  });
313
- SpannerDriver.LIVENESS_MONITOR.reportError(error_2);
314
- throw error_2;
332
+ SpannerDriver.LIVENESS_MONITOR.reportError(error_3);
333
+ throw error_3;
315
334
  case 4: return [2 /*return*/];
316
335
  }
317
336
  });
@@ -327,17 +346,26 @@ var SpannerDriver = /** @class */ (function () {
327
346
  var _this = this;
328
347
  return __generator(this, function (_a) {
329
348
  switch (_a.label) {
330
- case 0: return [4 /*yield*/, this.logIfStalled('spanner transaction', '(runTransactionAsync)', this.getSpannerDb().runTransactionAsync(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
331
- var result;
349
+ case 0: return [4 /*yield*/, this.withDeadline('spanner transaction', '(runTransactionAsync)', this.getSpannerDb().runTransactionAsync(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
350
+ var result, error_4;
332
351
  return __generator(this, function (_a) {
333
352
  switch (_a.label) {
334
- case 0: return [4 /*yield*/, fn(transaction)];
353
+ case 0:
354
+ _a.trys.push([0, 3, , 5]);
355
+ return [4 /*yield*/, fn(transaction)];
335
356
  case 1:
336
357
  result = _a.sent();
337
- return [4 /*yield*/, transaction.commit()];
358
+ return [4 /*yield*/, this.commit(transaction)];
338
359
  case 2:
339
360
  _a.sent();
340
361
  return [2 /*return*/, result];
362
+ case 3:
363
+ error_4 = _a.sent();
364
+ return [4 /*yield*/, this.rollbackQuietly(transaction)];
365
+ case 4:
366
+ _a.sent();
367
+ throw error_4;
368
+ case 5: return [2 /*return*/];
341
369
  }
342
370
  });
343
371
  }); }))];
@@ -347,28 +375,89 @@ var SpannerDriver = /** @class */ (function () {
347
375
  });
348
376
  };
349
377
  /**
350
- * Stall diagnostics (2026-07-10 flow-hang investigation): background flow tasks intermittently
351
- * wedge between model calls with every model-layer guard silent — the remaining awaits on that
352
- * path are Spanner ops, and this client has NO acquire/read timeouts (a wedged session/gRPC
353
- * stream waits forever). Logs ops still pending at 30s and 120s — with the op and statement —
354
- * then keeps waiting: pure diagnosis, zero behavior change.
378
+ * Deadline-bounded commit: a commit hanging on a dead channel would otherwise keep the
379
+ * transaction's run function pending forever, and with it the session (runTransactionAsync
380
+ * only releases the session once the run function settles).
381
+ */
382
+ SpannerDriver.prototype.commit = function (transaction) {
383
+ return __awaiter(this, void 0, void 0, function () {
384
+ return __generator(this, function (_a) {
385
+ switch (_a.label) {
386
+ case 0: return [4 /*yield*/, this.withDeadline('spanner commit', '(commit)', transaction.commit({ gaxOptions: { timeout: this.operationDeadlineMs() } }))];
387
+ case 1:
388
+ _a.sent();
389
+ return [2 /*return*/];
390
+ }
391
+ });
392
+ });
393
+ };
394
+ /**
395
+ * Release a transaction whose work errored. The client library's runner does NOT roll back on
396
+ * non-retryable errors — it just rethrows — so a thrown `fn` (e.g. an application rollback, or
397
+ * a failed statement) left the read-write transaction OPEN until session timeout. Real Spanner
398
+ * tolerates that (locks expire); the emulator serializes on its single read-write transaction,
399
+ * so one leaked transaction blocks every subsequent DDL with FAILED_PRECONDITION ("a
400
+ * read-write transaction is already in progress") — poisoning whole test runs. Rollback of an
401
+ * already-invalid transaction (e.g. ABORTED, about to be retried by the runner with a fresh
402
+ * transaction, or one whose commit was already called) is expected to fail; that failure is
403
+ * logged at debug and swallowed so the ORIGINAL error — the one that carries retry semantics —
404
+ * always propagates. Deadline-bounded like commit: an unbounded rollback on a dead channel
405
+ * would keep the run function (and its session) pending forever.
406
+ */
407
+ SpannerDriver.prototype.rollbackQuietly = function (transaction) {
408
+ return __awaiter(this, void 0, void 0, function () {
409
+ var rollbackError_1;
410
+ return __generator(this, function (_a) {
411
+ switch (_a.label) {
412
+ case 0:
413
+ _a.trys.push([0, 2, , 3]);
414
+ return [4 /*yield*/, this.withDeadline('spanner rollback', '(rollback)', transaction.rollback({ timeout: this.operationDeadlineMs() }))];
415
+ case 1:
416
+ _a.sent();
417
+ return [3 /*break*/, 3];
418
+ case 2:
419
+ rollbackError_1 = _a.sent();
420
+ this.logger.debug({ message: "Rollback after transaction error failed", obj: { rollbackError: rollbackError_1 } });
421
+ return [3 /*break*/, 3];
422
+ case 3: return [2 /*return*/];
423
+ }
424
+ });
425
+ });
426
+ };
427
+ /**
428
+ * The one choke point every query/dml/transaction op awaits through. Two jobs:
429
+ *
430
+ * 1. Stall diagnostics (2026-07-10 flow-hang investigation): logs ops still pending at 30s
431
+ * and 120s with the op and statement.
432
+ * 2. OP DEADLINE (2026-08-06 overnight wedge): an op that has not settled by
433
+ * `operationDeadlineMs` (default 60s) FAILS with an error naming the deadline instead of
434
+ * hanging forever on a dead gRPC channel. This race covers hangs the gRPC deadline cannot
435
+ * see (session-pool acquisition, library internals before the RPC starts); the
436
+ * wire-level cancellation + session return is the gRPC deadline attached per call
437
+ * (`gaxOptions.timeout`, same value) — see the call sites. Deadline failures feed the
438
+ * channel-death recycle counter; any success resets it.
355
439
  */
356
- SpannerDriver.prototype.logIfStalled = function (op, sql, promise, timeoutMs) {
440
+ SpannerDriver.prototype.withDeadline = function (op, sql, promise) {
357
441
  var _this = this;
358
442
  var _a, _b;
359
- if (timeoutMs === void 0) { timeoutMs = 30000; }
443
+ // Pool gauge (P4a): every op passes through here, so this is where waiting-on-the-pool
444
+ // becomes visible (throttled inside the monitor). The monitor exists by now — all ops
445
+ // require getSpannerDb() first.
446
+ SpannerDriver.LIVENESS_MONITOR.logPoolPressure();
447
+ var deadlineMs = this.operationDeadlineMs();
448
+ var generation = SpannerDriver.CLIENT_GENERATION;
360
449
  var settled = false;
361
450
  var logStall = function (afterMs) {
362
451
  return _this.logger.error({
363
452
  message: "Spanner op stalled: ".concat(op),
364
- obj: { afterMs: afterMs, sql: String(sql).slice(0, 200) },
453
+ obj: { afterMs: afterMs, sql: String(sql).slice(0, 200), pool: SpannerDriver.LIVENESS_MONITOR.poolStats() },
365
454
  });
366
455
  };
367
456
  var t1 = setTimeout(function () {
368
457
  if (!settled) {
369
- logStall(timeoutMs);
458
+ logStall(30000);
370
459
  }
371
- }, timeoutMs);
460
+ }, 30000);
372
461
  var t2 = setTimeout(function () {
373
462
  if (!settled) {
374
463
  logStall(120000);
@@ -376,18 +465,115 @@ var SpannerDriver = /** @class */ (function () {
376
465
  }, 120000);
377
466
  (_a = t1.unref) === null || _a === void 0 ? void 0 : _a.call(t1);
378
467
  (_b = t2.unref) === null || _b === void 0 ? void 0 : _b.call(t2);
379
- return Promise.resolve(promise).finally(function () {
380
- settled = true;
381
- clearTimeout(t1);
382
- clearTimeout(t2);
468
+ return new Promise(function (resolve, reject) {
469
+ var _a;
470
+ var clear = function () {
471
+ settled = true;
472
+ clearTimeout(t1);
473
+ clearTimeout(t2);
474
+ clearTimeout(deadlineTimer);
475
+ };
476
+ var deadlineTimer = setTimeout(function () {
477
+ if (settled) {
478
+ return;
479
+ }
480
+ clear();
481
+ _this.logger.error({
482
+ message: "Spanner op exceeded its ".concat(deadlineMs, "ms deadline: ").concat(op, " \u2014 failing the op"),
483
+ obj: { sql: String(sql).slice(0, 200), pool: SpannerDriver.LIVENESS_MONITOR.poolStats() },
484
+ });
485
+ _this.recordDeadlineFailure(generation);
486
+ // Deliberately no grpc `code` on this error: the liveness monitor's probe/exit
487
+ // escalation stays owned by genuine grpc errors; hang-shaped death is owned by the
488
+ // recycle counter.
489
+ reject(new Error("Spanner op exceeded its ".concat(deadlineMs, "ms deadline: ").concat(op, " (configure via SpannerConfig.operationDeadlineMs)")));
490
+ }, deadlineMs);
491
+ (_a = deadlineTimer.unref) === null || _a === void 0 ? void 0 : _a.call(deadlineTimer);
492
+ Promise.resolve(promise).then(function (value) {
493
+ if (settled) {
494
+ return; // deadline already failed the caller; the library handles the late settle
495
+ }
496
+ clear();
497
+ _this.recordOpSuccess(generation);
498
+ resolve(value);
499
+ }, function (error) {
500
+ if (settled) {
501
+ return;
502
+ }
503
+ clear();
504
+ // A grpc DEADLINE_EXCEEDED (code 4) is the same dead-channel signal arriving via the
505
+ // per-call gRPC deadline — classification for the one counter, not a second path.
506
+ if ((error === null || error === void 0 ? void 0 : error.code) === 4) {
507
+ _this.recordDeadlineFailure(generation);
508
+ }
509
+ reject(error);
510
+ });
511
+ });
512
+ };
513
+ // ── Channel-death recycle (one owner for the process-wide client) ─────────
514
+ SpannerDriver.prototype.recordOpSuccess = function (generation) {
515
+ if (generation !== SpannerDriver.CLIENT_GENERATION) {
516
+ return; // outcome from a recycled client says nothing about the fresh channel
517
+ }
518
+ SpannerDriver.CONSECUTIVE_DEADLINE_FAILURES = 0;
519
+ };
520
+ SpannerDriver.prototype.recordDeadlineFailure = function (generation) {
521
+ if (generation !== SpannerDriver.CLIENT_GENERATION) {
522
+ return;
523
+ }
524
+ SpannerDriver.CONSECUTIVE_DEADLINE_FAILURES += 1;
525
+ if (SpannerDriver.CONSECUTIVE_DEADLINE_FAILURES < this.deadlineFailuresBeforeRecycle()) {
526
+ return;
527
+ }
528
+ // Reset BEFORE recycling: the counter and generation swap happen in this same synchronous
529
+ // frame, so a burst of ops all timing out together triggers exactly one recycle.
530
+ SpannerDriver.CONSECUTIVE_DEADLINE_FAILURES = 0;
531
+ this.recycleClient();
532
+ };
533
+ /**
534
+ * Drop the process-wide Spanner client so the next op builds a fresh client/channel — the
535
+ * categorical cure for a dead gRPC channel (Mac sleep, NAT drop) that deadlines every op.
536
+ * The old liveness monitor is stopped so its probe/exit escalation can't kill the process
537
+ * for a channel we just abandoned; LIVENESS_MONITOR itself stays pointed at it (stopped)
538
+ * until getSpannerDb() installs the new client's monitor, keeping in-flight ops' error
539
+ * paths callable.
540
+ */
541
+ SpannerDriver.prototype.recycleClient = function () {
542
+ this.logger.error({
543
+ message: "Recycling Spanner client after ".concat(this.deadlineFailuresBeforeRecycle(), " consecutive op-deadline failures (dead gRPC channel suspected) \u2014 a fresh client/channel will be created on the next op"),
383
544
  });
545
+ SpannerDriver.CLIENT_GENERATION += 1;
546
+ var oldMonitor = SpannerDriver.LIVENESS_MONITOR;
547
+ var oldDb = SpannerDriver.SPANNER_DB;
548
+ var oldSpanner = SpannerDriver.SPANNER;
549
+ SpannerDriver.SPANNER = undefined;
550
+ SpannerDriver.SPANNER_INSTANCE = undefined;
551
+ SpannerDriver.SPANNER_DB = undefined;
552
+ oldMonitor === null || oldMonitor === void 0 ? void 0 : oldMonitor.stop();
553
+ // Best-effort teardown of the old client: session deletes are themselves RPCs on the very
554
+ // channel we believe is dead — the recycle must not depend on them succeeding.
555
+ void (oldDb === null || oldDb === void 0 ? void 0 : oldDb.close().catch(function () { return undefined; }));
556
+ try {
557
+ oldSpanner === null || oldSpanner === void 0 ? void 0 : oldSpanner.close();
558
+ }
559
+ catch (_a) {
560
+ // already torn down
561
+ }
562
+ };
563
+ SpannerDriver.prototype.operationDeadlineMs = function () {
564
+ var _a;
565
+ return (_a = this.config.operationDeadlineMs) !== null && _a !== void 0 ? _a : 60000;
566
+ };
567
+ SpannerDriver.prototype.deadlineFailuresBeforeRecycle = function () {
568
+ var _a;
569
+ return (_a = this.config.deadlineFailuresBeforeRecycle) !== null && _a !== void 0 ? _a : 3;
384
570
  };
385
571
  /**
386
572
  * Execute a schema write operation.
387
573
  */
388
574
  SpannerDriver.prototype.runUpdateSchema = function (sql) {
389
575
  return __awaiter(this, void 0, void 0, function () {
390
- var startTime, operation, durationMs, error_3, durationMs;
576
+ var startTime, operation, durationMs, error_5, durationMs;
391
577
  return __generator(this, function (_a) {
392
578
  switch (_a.label) {
393
579
  case 0:
@@ -406,18 +592,26 @@ var SpannerDriver = /** @class */ (function () {
406
592
  this.logger.debug({ message: "Schema update executed", obj: { sql: sql, durationMs: durationMs } });
407
593
  return [3 /*break*/, 5];
408
594
  case 4:
409
- error_3 = _a.sent();
595
+ error_5 = _a.sent();
410
596
  durationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
411
597
  this.logger.error({
412
598
  message: "Failed when executing schema update",
413
- obj: { sql: sql, errorDetails: error_3.details, durationMs: durationMs },
599
+ obj: { sql: sql, errorDetails: error_5.details, durationMs: durationMs },
414
600
  });
415
- throw error_3;
601
+ throw error_5;
416
602
  case 5: return [2 /*return*/];
417
603
  }
418
604
  });
419
605
  });
420
606
  };
607
+ /**
608
+ * Channel-death recycle accounting (2026-08-06 overnight wedge). Ops are tagged with the
609
+ * generation of the client they started on; only same-generation outcomes touch the counter,
610
+ * so a burst of deadline failures from the OLD (recycled) channel can never spuriously
611
+ * recycle the fresh one.
612
+ */
613
+ SpannerDriver.CLIENT_GENERATION = 0;
614
+ SpannerDriver.CONSECUTIVE_DEADLINE_FAILURES = 0;
421
615
  return SpannerDriver;
422
616
  }());
423
617
  exports.SpannerDriver = SpannerDriver;
@@ -1 +1 @@
1
- {"version":3,"file":"SpannerDriver.js","sourceRoot":"","sources":["../../src/SpannerDriver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpannerDriver.js","sourceRoot":"","sources":["../../src/SpannerDriver.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,42 @@
1
1
  import { Database } from '@google-cloud/spanner';
2
+ /** Session pool gauge (P4a): the four numbers that make pool exhaustion observable. */
3
+ export type SpannerSessionPoolStats = {
4
+ size: number;
5
+ available: number;
6
+ borrowed: number;
7
+ totalWaiters: number;
8
+ };
2
9
  export declare class SpannerLivenessMonitor {
3
10
  private db;
4
11
  private static readonly PROBE_SQL;
5
12
  private static readonly PROBE_TIMEOUT_MS;
6
13
  /** delay before each attempt; 5 attempts spanning ~2 min (fast failures) to ~4.5 min (30s-deadline failures) */
7
14
  private static readonly PROBE_DELAYS_MS;
15
+ /** waiters > 0 is the wedge signature — warn on sight, but at most once per interval per process */
16
+ private static readonly POOL_PRESSURE_WARN_INTERVAL_MS;
8
17
  private logger;
9
18
  private checkInFlight;
19
+ private stopped;
20
+ private lastPoolPressureWarnMs;
10
21
  constructor(db: Database);
11
22
  /** Attach the single 'error' listener; called once when the Database singleton is created. */
12
23
  start(): this;
24
+ /**
25
+ * Retire this monitor when its client is recycled (channel-death recycle in SpannerDriver):
26
+ * a stopped monitor must never escalate to process exit for a channel the driver has already
27
+ * abandoned — the replacement client gets a fresh monitor.
28
+ */
29
+ stop(): void;
13
30
  /** Called from driver catch blocks; probes only for connectivity-shaped errors. */
14
31
  reportError(error: any): void;
32
+ poolStats(): SpannerSessionPoolStats;
33
+ /**
34
+ * Warn whenever operations are queued waiting on the session pool (the silent-wedge
35
+ * signature — with an infinite acquireTimeout a wedged pool otherwise produces no signal at
36
+ * all). Called by the driver as ops are issued; throttled so a contended burst emits one
37
+ * line per interval, not one per queued op.
38
+ */
39
+ logPoolPressure(nowMs?: number): void;
15
40
  private verifyLiveness;
16
41
  private probe;
17
42
  private sleep;
@@ -1 +1 @@
1
- {"version":3,"file":"SpannerLivenessMonitor.d.ts","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjD,qBAAa,sBAAsB;IAQrB,OAAO,CAAC,EAAE;IAPtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAc;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAClD,gHAAgH;IAChH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAC7E,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,aAAa,CAAS;gBAEV,EAAE,EAAE,QAAQ;IAEhC,8FAA8F;IAC9F,KAAK,IAAI,IAAI;IAWb,mFAAmF;IACnF,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;YASf,cAAc;YA4Bd,KAAK;IAOnB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"SpannerLivenessMonitor.d.ts","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,uBAAuB,CAAC;AAgB9D,uFAAuF;AACvF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,qBAAa,sBAAsB;IAYrB,OAAO,CAAC,EAAE;IAXtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAc;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAClD,gHAAgH;IAChH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAC7E,oGAAoG;IACpG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAU;IAChE,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,sBAAsB,CAA4B;gBAEtC,EAAE,EAAE,QAAQ;IAEhC,8FAA8F;IAC9F,KAAK,IAAI,IAAI;IAcb;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAIZ,mFAAmF;IACnF,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAO7B,SAAS,IAAI,uBAAuB;IAKpC;;;;;OAKG;IACH,eAAe,CAAC,KAAK,SAAa,GAAG,IAAI;YAmB3B,cAAc;YAkCd,KAAK;IAOnB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;CAGb"}
@@ -40,32 +40,79 @@ exports.SpannerLivenessMonitor = void 0;
40
40
  var logger_1 = require("@proteinjs/logger");
41
41
  /** grpc status codes that indicate connectivity trouble rather than an application error */
42
42
  var CONNECTIVITY_GRPC_CODES = [4 /* DEADLINE_EXCEEDED */, 14 /* UNAVAILABLE */];
43
+ /**
44
+ * Restart-requested exit code — the supervision contract shared with @proteinjs/build's
45
+ * serve-package (ServePackageSupervisor.RESTART_REQUEST_EXIT_CODE): a supervised process
46
+ * exiting with this code is respawned with bounded backoff instead of being treated as a plain
47
+ * failure (which the supervisor mirrors, i.e. stays down). Orchestrators that restart on any
48
+ * nonzero exit (systemd, Kubernetes) treat it like any other failure code, so it is safe
49
+ * everywhere. Hard-coded by design: the contract crosses a process boundary, like a signal.
50
+ */
51
+ var RESTART_REQUEST_EXIT_CODE = 86;
43
52
  var SpannerLivenessMonitor = /** @class */ (function () {
44
53
  function SpannerLivenessMonitor(db) {
45
54
  this.db = db;
46
55
  this.logger = new logger_1.Logger({ name: this.constructor.name });
47
56
  this.checkInFlight = false;
57
+ this.stopped = false;
58
+ this.lastPoolPressureWarnMs = Number.NEGATIVE_INFINITY;
48
59
  }
49
60
  /** Attach the single 'error' listener; called once when the Database singleton is created. */
50
61
  SpannerLivenessMonitor.prototype.start = function () {
51
62
  var _this = this;
52
63
  this.db.on('error', function (error) {
53
64
  var _a;
65
+ if (_this.stopped) {
66
+ return;
67
+ }
54
68
  _this.logger.warn({
55
69
  message: "Spanner session pool emitted a background error; verifying db connectivity",
56
- obj: { code: error === null || error === void 0 ? void 0 : error.code, errorDetails: (_a = error === null || error === void 0 ? void 0 : error.details) !== null && _a !== void 0 ? _a : String(error) },
70
+ obj: { code: error === null || error === void 0 ? void 0 : error.code, errorDetails: (_a = error === null || error === void 0 ? void 0 : error.details) !== null && _a !== void 0 ? _a : String(error), pool: _this.poolStats() },
57
71
  });
58
72
  void _this.verifyLiveness();
59
73
  });
60
74
  return this;
61
75
  };
76
+ /**
77
+ * Retire this monitor when its client is recycled (channel-death recycle in SpannerDriver):
78
+ * a stopped monitor must never escalate to process exit for a channel the driver has already
79
+ * abandoned — the replacement client gets a fresh monitor.
80
+ */
81
+ SpannerLivenessMonitor.prototype.stop = function () {
82
+ this.stopped = true;
83
+ };
62
84
  /** Called from driver catch blocks; probes only for connectivity-shaped errors. */
63
85
  SpannerLivenessMonitor.prototype.reportError = function (error) {
64
- if (!CONNECTIVITY_GRPC_CODES.includes(error === null || error === void 0 ? void 0 : error.code)) {
86
+ if (this.stopped || !CONNECTIVITY_GRPC_CODES.includes(error === null || error === void 0 ? void 0 : error.code)) {
65
87
  return;
66
88
  }
67
89
  void this.verifyLiveness();
68
90
  };
91
+ SpannerLivenessMonitor.prototype.poolStats = function () {
92
+ var pool = this.db.pool_;
93
+ return { size: pool.size, available: pool.available, borrowed: pool.borrowed, totalWaiters: pool.totalWaiters };
94
+ };
95
+ /**
96
+ * Warn whenever operations are queued waiting on the session pool (the silent-wedge
97
+ * signature — with an infinite acquireTimeout a wedged pool otherwise produces no signal at
98
+ * all). Called by the driver as ops are issued; throttled so a contended burst emits one
99
+ * line per interval, not one per queued op.
100
+ */
101
+ SpannerLivenessMonitor.prototype.logPoolPressure = function (nowMs) {
102
+ if (nowMs === void 0) { nowMs = Date.now(); }
103
+ var stats = this.poolStats();
104
+ if (stats.totalWaiters === 0) {
105
+ return;
106
+ }
107
+ if (nowMs - this.lastPoolPressureWarnMs < SpannerLivenessMonitor.POOL_PRESSURE_WARN_INTERVAL_MS) {
108
+ return;
109
+ }
110
+ this.lastPoolPressureWarnMs = nowMs;
111
+ this.logger.warn({
112
+ message: "Spanner session pool under pressure: operations are waiting for a session",
113
+ obj: stats,
114
+ });
115
+ };
69
116
  // --- helpers last ---
70
117
  SpannerLivenessMonitor.prototype.verifyLiveness = function () {
71
118
  var _a;
@@ -88,6 +135,9 @@ var SpannerLivenessMonitor = /** @class */ (function () {
88
135
  return [4 /*yield*/, this.sleep(SpannerLivenessMonitor.PROBE_DELAYS_MS[attempt])];
89
136
  case 3:
90
137
  _b.sent();
138
+ if (this.stopped) {
139
+ return [2 /*return*/]; // client recycled mid-cycle — this channel's fate no longer matters
140
+ }
91
141
  _b.label = 4;
92
142
  case 4:
93
143
  _b.trys.push([4, 6, , 7]);
@@ -107,8 +157,11 @@ var SpannerLivenessMonitor = /** @class */ (function () {
107
157
  attempt++;
108
158
  return [3 /*break*/, 2];
109
159
  case 8:
160
+ if (this.stopped) {
161
+ return [2 /*return*/];
162
+ }
110
163
  this.logger.error({
111
- message: "Db unreachable after sustained probing; exiting so supervision can restart into a valid state",
164
+ message: "Db unreachable after sustained probing; exiting restart-requested (code ".concat(RESTART_REQUEST_EXIT_CODE, ") so supervision respawns into a valid state"),
112
165
  });
113
166
  this.exit();
114
167
  return [3 /*break*/, 10];
@@ -139,12 +192,14 @@ var SpannerLivenessMonitor = /** @class */ (function () {
139
192
  return new Promise(function (resolve) { return setTimeout(resolve, ms); });
140
193
  };
141
194
  SpannerLivenessMonitor.prototype.exit = function () {
142
- process.exit(1);
195
+ process.exit(RESTART_REQUEST_EXIT_CODE);
143
196
  };
144
197
  SpannerLivenessMonitor.PROBE_SQL = 'SELECT 1';
145
198
  SpannerLivenessMonitor.PROBE_TIMEOUT_MS = 10000;
146
199
  /** delay before each attempt; 5 attempts spanning ~2 min (fast failures) to ~4.5 min (30s-deadline failures) */
147
200
  SpannerLivenessMonitor.PROBE_DELAYS_MS = [0, 5000, 15000, 30000, 60000];
201
+ /** waiters > 0 is the wedge signature — warn on sight, but at most once per interval per process */
202
+ SpannerLivenessMonitor.POOL_PRESSURE_WARN_INTERVAL_MS = 10000;
148
203
  return SpannerLivenessMonitor;
149
204
  }());
150
205
  exports.SpannerLivenessMonitor = SpannerLivenessMonitor;
@@ -1 +1 @@
1
- {"version":3,"file":"SpannerLivenessMonitor.js","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpannerLivenessMonitor.js","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=ServiceUpdateVerbs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceUpdateVerbs.test.d.ts","sourceRoot":"","sources":["../../test/ServiceUpdateVerbs.test.ts"],"names":[],"mappings":"AAmBA,OAAO,yBAAyB,CAAC"}