@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.
- package/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +1 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/src/SpannerConfig.d.ts +22 -0
- package/dist/src/SpannerConfig.d.ts.map +1 -1
- package/dist/src/SpannerDriver.d.ts +46 -11
- package/dist/src/SpannerDriver.d.ts.map +1 -1
- package/dist/src/SpannerDriver.js +170 -25
- package/dist/src/SpannerDriver.js.map +1 -1
- package/dist/src/SpannerLivenessMonitor.d.ts +25 -0
- package/dist/src/SpannerLivenessMonitor.d.ts.map +1 -1
- package/dist/src/SpannerLivenessMonitor.js +48 -2
- package/dist/src/SpannerLivenessMonitor.js.map +1 -1
- package/dist/test/SessionPoolExhaustion.test.d.ts +2 -0
- package/dist/test/SessionPoolExhaustion.test.d.ts.map +1 -0
- package/dist/test/SessionPoolExhaustion.test.js +230 -0
- package/dist/test/SessionPoolExhaustion.test.js.map +1 -0
- package/dist/test/SpannerLivenessMonitor.test.js +42 -0
- package/dist/test/SpannerLivenessMonitor.test.js.map +1 -1
- package/dist/test/SpannerOperationDeadline.test.d.ts +2 -0
- package/dist/test/SpannerOperationDeadline.test.d.ts.map +1 -0
- package/dist/test/SpannerOperationDeadline.test.js +227 -0
- package/dist/test/SpannerOperationDeadline.test.js.map +1 -0
- package/dist/test/TransactionSafety.test.d.ts +2 -0
- package/dist/test/TransactionSafety.test.d.ts.map +1 -0
- package/dist/test/TransactionSafety.test.js +325 -0
- package/dist/test/TransactionSafety.test.js.map +1 -0
- package/generated/index.ts +6 -9
- package/generated/test/index.ts +8 -11
- package/package.json +6 -5
- package/src/SpannerConfig.ts +22 -0
- package/src/SpannerDriver.ts +185 -27
- package/src/SpannerLivenessMonitor.ts +61 -3
- package/test/SessionPoolExhaustion.test.ts +127 -0
- package/test/SpannerLivenessMonitor.test.ts +55 -0
- package/test/SpannerOperationDeadline.test.ts +156 -0
- package/test/TransactionSafety.test.ts +157 -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.
|
|
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,7 +255,7 @@ 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.
|
|
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 () {
|
|
255
259
|
var rowCount, error_2;
|
|
256
260
|
return __generator(this, function (_a) {
|
|
257
261
|
switch (_a.label) {
|
|
@@ -260,7 +264,7 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
260
264
|
return [4 /*yield*/, this.executeDml(generateStatement, transaction)];
|
|
261
265
|
case 1:
|
|
262
266
|
rowCount = _a.sent();
|
|
263
|
-
return [4 /*yield*/,
|
|
267
|
+
return [4 /*yield*/, this.commit(transaction)];
|
|
264
268
|
case 2:
|
|
265
269
|
_a.sent();
|
|
266
270
|
return [2 /*return*/, rowCount];
|
|
@@ -276,7 +280,10 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
276
280
|
}); }))];
|
|
277
281
|
case 3:
|
|
278
282
|
// Stalls in the transaction wrapper itself (session acquisition / begin / commit) happen
|
|
279
|
-
// 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.
|
|
280
287
|
return [2 /*return*/, _a.sent()];
|
|
281
288
|
}
|
|
282
289
|
});
|
|
@@ -299,10 +306,13 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
299
306
|
case 1:
|
|
300
307
|
_b.trys.push([1, 3, , 4]);
|
|
301
308
|
this.logger.debug({ message: "Executing dml", obj: { sql: sql, params: namedParams } });
|
|
302
|
-
return [4 /*yield*/, this.
|
|
309
|
+
return [4 /*yield*/, this.withDeadline('spanner dml', sql, runner.runUpdate({
|
|
303
310
|
sql: sql,
|
|
304
311
|
params: namedParams === null || namedParams === void 0 ? void 0 : namedParams.params,
|
|
305
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() },
|
|
306
316
|
}))];
|
|
307
317
|
case 2:
|
|
308
318
|
rowCount = (_b.sent())[0];
|
|
@@ -336,7 +346,7 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
336
346
|
var _this = this;
|
|
337
347
|
return __generator(this, function (_a) {
|
|
338
348
|
switch (_a.label) {
|
|
339
|
-
case 0: return [4 /*yield*/, this.
|
|
349
|
+
case 0: return [4 /*yield*/, this.withDeadline('spanner transaction', '(runTransactionAsync)', this.getSpannerDb().runTransactionAsync(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
|
|
340
350
|
var result, error_4;
|
|
341
351
|
return __generator(this, function (_a) {
|
|
342
352
|
switch (_a.label) {
|
|
@@ -345,7 +355,7 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
345
355
|
return [4 /*yield*/, fn(transaction)];
|
|
346
356
|
case 1:
|
|
347
357
|
result = _a.sent();
|
|
348
|
-
return [4 /*yield*/,
|
|
358
|
+
return [4 /*yield*/, this.commit(transaction)];
|
|
349
359
|
case 2:
|
|
350
360
|
_a.sent();
|
|
351
361
|
return [2 /*return*/, result];
|
|
@@ -365,6 +375,23 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
365
375
|
});
|
|
366
376
|
};
|
|
367
377
|
/**
|
|
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
|
+
/**
|
|
368
395
|
* Release a transaction whose work errored. The client library's runner does NOT roll back on
|
|
369
396
|
* non-retryable errors — it just rethrows — so a thrown `fn` (e.g. an application rollback, or
|
|
370
397
|
* a failed statement) left the read-write transaction OPEN until session timeout. Real Spanner
|
|
@@ -372,8 +399,10 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
372
399
|
* so one leaked transaction blocks every subsequent DDL with FAILED_PRECONDITION ("a
|
|
373
400
|
* read-write transaction is already in progress") — poisoning whole test runs. Rollback of an
|
|
374
401
|
* already-invalid transaction (e.g. ABORTED, about to be retried by the runner with a fresh
|
|
375
|
-
* transaction) is expected to fail; that failure is
|
|
376
|
-
* — the one that carries retry semantics —
|
|
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.
|
|
377
406
|
*/
|
|
378
407
|
SpannerDriver.prototype.rollbackQuietly = function (transaction) {
|
|
379
408
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -382,7 +411,7 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
382
411
|
switch (_a.label) {
|
|
383
412
|
case 0:
|
|
384
413
|
_a.trys.push([0, 2, , 3]);
|
|
385
|
-
return [4 /*yield*/, transaction.rollback()];
|
|
414
|
+
return [4 /*yield*/, this.withDeadline('spanner rollback', '(rollback)', transaction.rollback({ timeout: this.operationDeadlineMs() }))];
|
|
386
415
|
case 1:
|
|
387
416
|
_a.sent();
|
|
388
417
|
return [3 /*break*/, 3];
|
|
@@ -396,28 +425,39 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
396
425
|
});
|
|
397
426
|
};
|
|
398
427
|
/**
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
*
|
|
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.
|
|
404
439
|
*/
|
|
405
|
-
SpannerDriver.prototype.
|
|
440
|
+
SpannerDriver.prototype.withDeadline = function (op, sql, promise) {
|
|
406
441
|
var _this = this;
|
|
407
442
|
var _a, _b;
|
|
408
|
-
|
|
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;
|
|
409
449
|
var settled = false;
|
|
410
450
|
var logStall = function (afterMs) {
|
|
411
451
|
return _this.logger.error({
|
|
412
452
|
message: "Spanner op stalled: ".concat(op),
|
|
413
|
-
obj: { afterMs: afterMs, sql: String(sql).slice(0, 200) },
|
|
453
|
+
obj: { afterMs: afterMs, sql: String(sql).slice(0, 200), pool: SpannerDriver.LIVENESS_MONITOR.poolStats() },
|
|
414
454
|
});
|
|
415
455
|
};
|
|
416
456
|
var t1 = setTimeout(function () {
|
|
417
457
|
if (!settled) {
|
|
418
|
-
logStall(
|
|
458
|
+
logStall(30000);
|
|
419
459
|
}
|
|
420
|
-
},
|
|
460
|
+
}, 30000);
|
|
421
461
|
var t2 = setTimeout(function () {
|
|
422
462
|
if (!settled) {
|
|
423
463
|
logStall(120000);
|
|
@@ -425,12 +465,109 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
425
465
|
}, 120000);
|
|
426
466
|
(_a = t1.unref) === null || _a === void 0 ? void 0 : _a.call(t1);
|
|
427
467
|
(_b = t2.unref) === null || _b === void 0 ? void 0 : _b.call(t2);
|
|
428
|
-
return Promise
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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
|
+
});
|
|
432
511
|
});
|
|
433
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"),
|
|
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;
|
|
570
|
+
};
|
|
434
571
|
/**
|
|
435
572
|
* Execute a schema write operation.
|
|
436
573
|
*/
|
|
@@ -467,6 +604,14 @@ var SpannerDriver = /** @class */ (function () {
|
|
|
467
604
|
});
|
|
468
605
|
});
|
|
469
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;
|
|
470
615
|
return SpannerDriver;
|
|
471
616
|
}());
|
|
472
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,
|
|
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"}
|
|
@@ -54,27 +54,65 @@ var SpannerLivenessMonitor = /** @class */ (function () {
|
|
|
54
54
|
this.db = db;
|
|
55
55
|
this.logger = new logger_1.Logger({ name: this.constructor.name });
|
|
56
56
|
this.checkInFlight = false;
|
|
57
|
+
this.stopped = false;
|
|
58
|
+
this.lastPoolPressureWarnMs = Number.NEGATIVE_INFINITY;
|
|
57
59
|
}
|
|
58
60
|
/** Attach the single 'error' listener; called once when the Database singleton is created. */
|
|
59
61
|
SpannerLivenessMonitor.prototype.start = function () {
|
|
60
62
|
var _this = this;
|
|
61
63
|
this.db.on('error', function (error) {
|
|
62
64
|
var _a;
|
|
65
|
+
if (_this.stopped) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
63
68
|
_this.logger.warn({
|
|
64
69
|
message: "Spanner session pool emitted a background error; verifying db connectivity",
|
|
65
|
-
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() },
|
|
66
71
|
});
|
|
67
72
|
void _this.verifyLiveness();
|
|
68
73
|
});
|
|
69
74
|
return this;
|
|
70
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
|
+
};
|
|
71
84
|
/** Called from driver catch blocks; probes only for connectivity-shaped errors. */
|
|
72
85
|
SpannerLivenessMonitor.prototype.reportError = function (error) {
|
|
73
|
-
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)) {
|
|
74
87
|
return;
|
|
75
88
|
}
|
|
76
89
|
void this.verifyLiveness();
|
|
77
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
|
+
};
|
|
78
116
|
// --- helpers last ---
|
|
79
117
|
SpannerLivenessMonitor.prototype.verifyLiveness = function () {
|
|
80
118
|
var _a;
|
|
@@ -97,6 +135,9 @@ var SpannerLivenessMonitor = /** @class */ (function () {
|
|
|
97
135
|
return [4 /*yield*/, this.sleep(SpannerLivenessMonitor.PROBE_DELAYS_MS[attempt])];
|
|
98
136
|
case 3:
|
|
99
137
|
_b.sent();
|
|
138
|
+
if (this.stopped) {
|
|
139
|
+
return [2 /*return*/]; // client recycled mid-cycle — this channel's fate no longer matters
|
|
140
|
+
}
|
|
100
141
|
_b.label = 4;
|
|
101
142
|
case 4:
|
|
102
143
|
_b.trys.push([4, 6, , 7]);
|
|
@@ -116,6 +157,9 @@ var SpannerLivenessMonitor = /** @class */ (function () {
|
|
|
116
157
|
attempt++;
|
|
117
158
|
return [3 /*break*/, 2];
|
|
118
159
|
case 8:
|
|
160
|
+
if (this.stopped) {
|
|
161
|
+
return [2 /*return*/];
|
|
162
|
+
}
|
|
119
163
|
this.logger.error({
|
|
120
164
|
message: "Db unreachable after sustained probing; exiting restart-requested (code ".concat(RESTART_REQUEST_EXIT_CODE, ") so supervision respawns into a valid state"),
|
|
121
165
|
});
|
|
@@ -154,6 +198,8 @@ var SpannerLivenessMonitor = /** @class */ (function () {
|
|
|
154
198
|
SpannerLivenessMonitor.PROBE_TIMEOUT_MS = 10000;
|
|
155
199
|
/** delay before each attempt; 5 attempts spanning ~2 min (fast failures) to ~4.5 min (30s-deadline failures) */
|
|
156
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;
|
|
157
203
|
return SpannerLivenessMonitor;
|
|
158
204
|
}());
|
|
159
205
|
exports.SpannerLivenessMonitor = SpannerLivenessMonitor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpannerLivenessMonitor.js","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA2C;AAE3C,4FAA4F;AAC5F,IAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAElF;;;;;;;GAOG;AACH,IAAM,yBAAyB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SpannerLivenessMonitor.js","sourceRoot":"","sources":["../../src/SpannerLivenessMonitor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA2C;AAE3C,4FAA4F;AAC5F,IAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAElF;;;;;;;GAOG;AACH,IAAM,yBAAyB,GAAG,EAAE,CAAC;AAUrC;IAYE,gCAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;QALxB,WAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,kBAAa,GAAG,KAAK,CAAC;QACtB,YAAO,GAAG,KAAK,CAAC;QAChB,2BAAsB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEvB,CAAC;IAEpC,8FAA8F;IAC9F,sCAAK,GAAL;QAAA,iBAYC;QAXC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAU;;YAC7B,IAAI,KAAI,CAAC,OAAO,EAAE;gBAChB,OAAO;aACR;YACD,KAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,4EAA4E;gBACrF,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,YAAY,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,mCAAI,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAI,CAAC,SAAS,EAAE,EAAE;aAClG,CAAC,CAAC;YACH,KAAK,KAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,qCAAI,GAAJ;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,mFAAmF;IACnF,4CAAW,GAAX,UAAY,KAAU;QACpB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,EAAE;YAClE,OAAO;SACR;QACD,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7B,CAAC;IAED,0CAAS,GAAT;QACE,IAAM,IAAI,GAAI,IAAI,CAAC,EAAwC,CAAC,KAAK,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IAClH,CAAC;IAED;;;;;OAKG;IACH,gDAAe,GAAf,UAAgB,KAAkB;QAAlB,sBAAA,EAAA,QAAQ,IAAI,CAAC,GAAG,EAAE;QAChC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,EAAE;YAC5B,OAAO;SACR;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC,8BAA8B,EAAE;YAC/F,OAAO;SACR;QAED,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,OAAO,EAAE,2EAA2E;YACpF,GAAG,EAAE,KAAK;SACX,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IAET,+CAAc,GAA5B;;;;;;;wBACE,IAAI,IAAI,CAAC,aAAa,EAAE;4BACtB,sBAAO,CAAC,mGAAmG;yBAC5G;wBACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;;;wBAEf,OAAO,GAAG,CAAC;;;6BAAE,CAAA,OAAO,GAAG,sBAAsB,CAAC,eAAe,CAAC,MAAM,CAAA;wBAC3E,qBAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAA;;wBAAjE,SAAiE,CAAC;wBAClE,IAAI,IAAI,CAAC,OAAO,EAAE;4BAChB,sBAAO,CAAC,oEAAoE;yBAC7E;;;;wBAEC,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;wBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;wBACzF,sBAAO;;;wBAEP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;4BACf,OAAO,EAAE,8BAA8B;4BACvC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,EAAE,MAAA,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,OAAO,mCAAI,MAAM,CAAC,OAAK,CAAC,EAAE;yBAC7E,CAAC,CAAC;;;wBAbwE,OAAO,EAAE,CAAA;;;wBAgBxF,IAAI,IAAI,CAAC,OAAO,EAAE;4BAChB,sBAAO;yBACR;wBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;4BAChB,OAAO,EAAE,kFAA2E,yBAAyB,iDAA8C;yBAC5J,CAAC,CAAC;wBACH,IAAI,CAAC,IAAI,EAAE,CAAC;;;wBAEZ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;;;;;;KAE9B;IAEa,sCAAK,GAAnB;;;;4BACE,qBAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;4BAChB,GAAG,EAAE,sBAAsB,CAAC,SAAS;4BACrC,UAAU,EAAE,EAAE,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,EAAE;yBACjE,CAAC,EAAA;;wBAHF,SAGE,CAAC;;;;;KACJ;IAEO,sCAAK,GAAb,UAAc,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAvB,CAAuB,CAAC,CAAC;IAC3D,CAAC;IAEO,qCAAI,GAAZ;QACE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC1C,CAAC;IA1HuB,gCAAS,GAAG,UAAU,AAAb,CAAc;IACvB,uCAAgB,GAAG,KAAM,AAAT,CAAU;IAClD,gHAAgH;IACxF,sCAAe,GAAG,CAAC,CAAC,EAAE,IAAK,EAAE,KAAM,EAAE,KAAM,EAAE,KAAM,CAAC,AAArC,CAAsC;IAC7E,oGAAoG;IAC5E,qDAA8B,GAAG,KAAM,AAAT,CAAU;IAsHlE,6BAAC;CAAA,AA5HD,IA4HC;AA5HY,wDAAsB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionPoolExhaustion.test.d.ts","sourceRoot":"","sources":["../../test/SessionPoolExhaustion.test.ts"],"names":[],"mappings":"AAMA,OAAO,yBAAyB,CAAC"}
|