@dbos-inc/dbos-enterprise 5.4.1-preview → 5.5.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 (70) hide show
  1. package/README.md +0 -2
  2. package/dist/src/auto_upgrade.d.ts +7 -20
  3. package/dist/src/auto_upgrade.d.ts.map +1 -1
  4. package/dist/src/auto_upgrade.js +8 -51
  5. package/dist/src/auto_upgrade.js.map +1 -1
  6. package/dist/src/cockroach.d.ts +7 -1
  7. package/dist/src/cockroach.d.ts.map +1 -1
  8. package/dist/src/cockroach.js +7 -1
  9. package/dist/src/cockroach.js.map +1 -1
  10. package/dist/src/conductor/conductor.d.ts +8 -5
  11. package/dist/src/conductor/conductor.d.ts.map +1 -1
  12. package/dist/src/conductor/conductor.js +768 -735
  13. package/dist/src/conductor/conductor.js.map +1 -1
  14. package/dist/src/conductor/protocol.d.ts +31 -7
  15. package/dist/src/conductor/protocol.d.ts.map +1 -1
  16. package/dist/src/conductor/protocol.js +84 -17
  17. package/dist/src/conductor/protocol.js.map +1 -1
  18. package/dist/src/export.d.ts +7 -0
  19. package/dist/src/export.d.ts.map +1 -1
  20. package/dist/src/export.js +19 -24
  21. package/dist/src/export.js.map +1 -1
  22. package/dist/src/external_storage.d.ts +23 -0
  23. package/dist/src/external_storage.d.ts.map +1 -0
  24. package/dist/src/external_storage.js +278 -0
  25. package/dist/src/external_storage.js.map +1 -0
  26. package/dist/src/external_stores.d.ts +36 -0
  27. package/dist/src/external_stores.d.ts.map +1 -0
  28. package/dist/src/external_stores.js +177 -0
  29. package/dist/src/external_stores.js.map +1 -0
  30. package/dist/src/fork.d.ts +7 -0
  31. package/dist/src/fork.d.ts.map +1 -1
  32. package/dist/src/fork.js +11 -3
  33. package/dist/src/fork.js.map +1 -1
  34. package/dist/src/index.d.ts +11 -0
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +17 -1
  37. package/dist/src/index.js.map +1 -1
  38. package/dist/src/locks.d.ts +20 -0
  39. package/dist/src/locks.d.ts.map +1 -0
  40. package/dist/src/locks.js +47 -0
  41. package/dist/src/locks.js.map +1 -0
  42. package/dist/src/observability.d.ts +8 -0
  43. package/dist/src/observability.d.ts.map +1 -1
  44. package/dist/src/observability.js +69 -44
  45. package/dist/src/observability.js.map +1 -1
  46. package/dist/src/retention.d.ts +18 -34
  47. package/dist/src/retention.d.ts.map +1 -1
  48. package/dist/src/retention.js +159 -177
  49. package/dist/src/retention.js.map +1 -1
  50. package/dist/src/sharding/index.d.ts +9 -0
  51. package/dist/src/sharding/index.d.ts.map +1 -0
  52. package/dist/src/sharding/index.js +13 -0
  53. package/dist/src/sharding/index.js.map +1 -0
  54. package/dist/src/sharding/migrations.d.ts +20 -0
  55. package/dist/src/sharding/migrations.d.ts.map +1 -0
  56. package/dist/src/sharding/migrations.js +544 -0
  57. package/dist/src/sharding/migrations.js.map +1 -0
  58. package/dist/src/sharding/schema.d.ts +9 -0
  59. package/dist/src/sharding/schema.d.ts.map +1 -0
  60. package/dist/src/sharding/schema.js +12 -0
  61. package/dist/src/sharding/schema.js.map +1 -0
  62. package/dist/src/sharding/sys_db.d.ts +104 -0
  63. package/dist/src/sharding/sys_db.d.ts.map +1 -0
  64. package/dist/src/sharding/sys_db.js +776 -0
  65. package/dist/src/sharding/sys_db.js.map +1 -0
  66. package/dist/src/suspend.d.ts +24 -0
  67. package/dist/src/suspend.d.ts.map +1 -0
  68. package/dist/src/suspend.js +110 -0
  69. package/dist/src/suspend.js.map +1 -0
  70. package/package.json +17 -4
@@ -1,30 +1,37 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
1
8
  "use strict";
2
- // Retention and bulk timeout across the whole system database.
3
9
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.globalTimeout = exports.garbageCollect = exports.listTimedOutWorkflowIds = exports.collectStatuses = exports.collectPayloads = exports.acquireRetentionLock = exports.DEFAULT_GC_BATCH_SIZE = exports.retentionLockKey = exports.retryOnSerializationError = void 0;
10
+ exports.globalTimeout = exports.garbageCollect = exports.listTimedOutWorkflowIds = exports.collectStatuses = exports.collectPayloads = exports.acquireRetentionLock = exports.WindowBatches = exports.DEFAULT_GC_BATCH_SIZE = exports.retentionLockKey = exports.retryOnSerializationError = void 0;
5
11
  const cockroach_1 = require("./cockroach");
6
12
  const dbos_executor_1 = require("@dbos-inc/dbos-sdk/internal/dbos-executor");
7
13
  const error_1 = require("@dbos-inc/dbos-sdk/internal/error");
14
+ const shard_keys_1 = require("@dbos-inc/dbos-sdk/internal/shard_keys");
15
+ const locks_1 = require("./locks");
16
+ const external_storage_1 = require("./external_storage");
8
17
  const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
9
18
  const utils_1 = require("@dbos-inc/dbos-sdk/internal/utils");
10
19
  const workflow_1 = require("@dbos-inc/dbos-sdk/internal/workflow");
11
- /**
12
- * Bulk maintenance retries these a bounded number of times. 40001 is kept out of core's retryable sets,
13
- * which feed `dbRetry` and so retry forever; every other path runs READ COMMITTED and never sees it.
14
- */
15
20
  const SERIALIZATION_SQLSTATE_CODES = new Set([
16
- '40001', // serialization_failure (MVCC conflict)
17
- '40P01', // deadlock_detected
21
+ '40001',
22
+ '40P01',
18
23
  ]);
19
- function isSerializationError(err) {
24
+ function isSerializationError(err, sysdb) {
20
25
  for (const e of (0, system_database_1.unwrapErrors)(err)) {
26
+ if (sysdb.isSerializationConflict(e)) {
27
+ return true;
28
+ }
21
29
  if ((0, system_database_1.isPgDatabaseError)(e) && SERIALIZATION_SQLSTATE_CODES.has(e.code)) {
22
30
  return true;
23
31
  }
24
32
  }
25
33
  return false;
26
34
  }
27
- /** Borrow a connection for a retention round, so the system database's destroy() can cut it. */
28
35
  async function borrowRetentionClient(sysdb) {
29
36
  if (sysdb.destroyed) {
30
37
  throw new Error('System database shutting down');
@@ -33,18 +40,12 @@ async function borrowRetentionClient(sysdb) {
33
40
  sysdb.retentionClients.add(client);
34
41
  return client;
35
42
  }
36
- /** Return a retention connection, unless destroy() already cut it: a second release would throw. */
37
- function releaseRetentionClient(sysdb, client) {
43
+ function releaseRetentionClient(sysdb, client, destroy = false) {
38
44
  if (sysdb.retentionClients.delete(client)) {
39
- // No error argument: a genuinely dead connection is still evicted by the pool's own check.
40
- client.release();
45
+ client.release(destroy);
41
46
  }
42
47
  }
43
- /**
44
- * Re-run a batch that lost a deadlock or serialization race. The database already rolled it
45
- * back, so replaying it is safe.
46
- */
47
- async function retryOnSerializationError(operation) {
48
+ async function retryOnSerializationError(operation, sysdb) {
48
49
  const maxAttempts = 10;
49
50
  const maxBackoff = 2.0;
50
51
  let backoff = 0.05;
@@ -53,7 +54,7 @@ async function retryOnSerializationError(operation) {
53
54
  return await operation();
54
55
  }
55
56
  catch (e) {
56
- if (!isSerializationError(e)) {
57
+ if (!isSerializationError(e, sysdb)) {
57
58
  throw e;
58
59
  }
59
60
  const message = e instanceof Error ? e.message : String(e);
@@ -61,7 +62,6 @@ async function retryOnSerializationError(operation) {
61
62
  dbos_executor_1.DBOSExecutor.globalInstance?.logger.warn(`Garbage collection failed after ${maxAttempts} attempts: ${message}`);
62
63
  throw e;
63
64
  }
64
- // Jittered backoff, so peers that collided do not collide again
65
65
  const actualBackoff = backoff * (0.5 + Math.random());
66
66
  dbos_executor_1.DBOSExecutor.globalInstance?.logger.warn(`Contention or deadlock detected in workflow garbage collection: ${message}. ` +
67
67
  `Retrying in ${actualBackoff.toFixed(2)}s (attempt ${attempt})`);
@@ -71,25 +71,90 @@ async function retryOnSerializationError(operation) {
71
71
  }
72
72
  }
73
73
  exports.retryOnSerializationError = retryOnSerializationError;
74
- /**
75
- * The pg_try_advisory_lock argument for one schema's retention round: the leading 8 bytes of
76
- * SHA-256 over a fixed string, read as a signed big-endian 64-bit integer. Separate locks for
77
- * separate schemas. Every DBOS SDK derives the key this way, so rounds in different languages
78
- * against one system database contend for the same lock; changing it here changes it everywhere.
79
- */
80
74
  function retentionLockKey(schemaName) {
81
75
  return (0, system_database_1.advisoryLockKey)(`dbos.retention.${schemaName}`);
82
76
  }
83
77
  exports.retentionLockKey = retentionLockKey;
84
- // Rows deleted per transaction by garbage collection.
85
78
  exports.DEFAULT_GC_BATCH_SIZE = 50_000;
86
- // Detecting CockroachDB costs a query, so it is resolved once per system database.
87
- /**
88
- * Take a database-wide lock for one retention round, returning how to release it, or
89
- * undefined when another round already holds it. The lock is session-scoped, so a round
90
- * that crashes releases it. CockroachDB has no advisory locks and always takes it, so it
91
- * collects unprotected rather than not at all.
92
- */
79
+ async function kthValue(sysdb, client, column, from, where, params, k, descending = false) {
80
+ if (!Number.isInteger(k) || k < 1) {
81
+ throw new error_1.DBOSError(`Cannot take the ${k}th value: k must be a positive integer`);
82
+ }
83
+ const order = `ORDER BY ${column}${descending ? ' DESC' : ''}`;
84
+ if (!sysdb.sharded) {
85
+ const { rows } = await client.query(`SELECT ${column} AS value FROM ${from} WHERE ${where} ${order} LIMIT 1${k > 1 ? ` OFFSET ${k - 1}` : ''}`, params);
86
+ return rows.length > 0 ? Number(rows[0].value) : undefined;
87
+ }
88
+ const { rows } = await client.query(`SELECT ${column} AS value FROM ${from} WHERE ${where} ${order} LIMIT ${k}`, params);
89
+ const values = rows.map((row) => Number(row.value)).sort((a, b) => (descending ? b - a : a - b));
90
+ return values.length >= k ? values[k - 1] : undefined;
91
+ }
92
+ const INITIAL_BATCH_WINDOW_MS = 1_000;
93
+ class WindowBatches {
94
+ batchSize;
95
+ width = INITIAL_BATCH_WINDOW_MS;
96
+ constructor(batchSize) {
97
+ this.batchSize = batchSize;
98
+ }
99
+ async bound(client, column, from, eligible, watermark, cutoff) {
100
+ const k = this.batchSize;
101
+ let lo = watermark;
102
+ let fits = undefined;
103
+ let fitsCount = 0;
104
+ let overflows = undefined;
105
+ let hi = lo + this.width;
106
+ let final;
107
+ let n;
108
+ for (;;) {
109
+ final = hi >= cutoff;
110
+ const params = [];
111
+ const window = [eligible(params), `${column} > $${params.push(lo)}`];
112
+ if (!final)
113
+ window.push(`${column} <= $${params.push(hi)}`);
114
+ const { rows } = await client.query(`SELECT count(*) AS count FROM ${from} WHERE ${window.join(' AND ')}`, params);
115
+ n = Number(rows[0].count);
116
+ if (n > 2 * k && hi - lo > 1) {
117
+ overflows = Math.min(hi, cutoff);
118
+ const base = fits ?? lo;
119
+ hi = base + Math.floor((overflows - base) / 2);
120
+ if (fits !== undefined && hi <= fits) {
121
+ hi = fits;
122
+ n = fitsCount;
123
+ final = false;
124
+ break;
125
+ }
126
+ continue;
127
+ }
128
+ if (n === 0 && fits === undefined) {
129
+ if (final)
130
+ return undefined;
131
+ const nextParams = [];
132
+ const nextWhere = `${eligible(nextParams)} AND ${column} > $${nextParams.push(lo)}`;
133
+ const { rows: next } = await client.query(`SELECT min(${column}) AS next FROM ${from} WHERE ${nextWhere}`, nextParams);
134
+ if (next[0]?.next === null || next[0]?.next === undefined)
135
+ return undefined;
136
+ lo = Number(next[0].next) - 1;
137
+ hi = lo + this.width;
138
+ continue;
139
+ }
140
+ if (4 * n < k && !final) {
141
+ fits = hi;
142
+ fitsCount = n;
143
+ hi = overflows === undefined ? lo + (hi - lo) * 16 : Math.floor((hi + overflows) / 2);
144
+ if (overflows !== undefined && hi <= fits)
145
+ break;
146
+ continue;
147
+ }
148
+ break;
149
+ }
150
+ if (final)
151
+ return undefined;
152
+ const span = Math.max(1, hi - lo);
153
+ this.width = Math.max(1, Math.min(span * 16, Math.floor((span * k) / Math.max(n, 1))));
154
+ return hi;
155
+ }
156
+ }
157
+ exports.WindowBatches = WindowBatches;
93
158
  async function acquireRetentionLock(sysdb) {
94
159
  if (sysdb.destroyed) {
95
160
  throw new Error('System database shutting down');
@@ -97,48 +162,29 @@ async function acquireRetentionLock(sysdb) {
97
162
  if (await (0, cockroach_1.isCockroach)(sysdb)) {
98
163
  return { release: () => Promise.resolve() };
99
164
  }
100
- const key = retentionLockKey(sysdb.schemaName).toString();
101
- // The round holds this connection until it ends: releasing it would drop the lock.
165
+ const key = retentionLockKey(sysdb.schemaName);
102
166
  const client = await borrowRetentionClient(sysdb);
103
- let acquired = false;
167
+ let lock;
104
168
  try {
105
- const { rows } = await client.query('SELECT pg_try_advisory_lock($1) AS locked', [key]);
106
- acquired = rows[0]?.locked === true;
169
+ lock = await (0, locks_1.tryAdvisoryLock)(client, key, { name: 'retention', discard: sysdb.sharded, logger: sysdb.logger });
107
170
  }
108
171
  catch (e) {
109
- releaseRetentionClient(sysdb, client);
172
+ releaseRetentionClient(sysdb, client, true);
110
173
  throw e;
111
174
  }
112
- if (!acquired) {
113
- releaseRetentionClient(sysdb, client);
175
+ const release = async () => {
176
+ if (!sysdb.retentionClients.has(client)) {
177
+ return;
178
+ }
179
+ releaseRetentionClient(sysdb, client, await lock.release());
180
+ };
181
+ if (!lock.acquired) {
182
+ await release();
114
183
  return undefined;
115
184
  }
116
- return {
117
- release: async () => {
118
- // Already cut by destroy(): the session is gone and took the lock with it.
119
- if (!sysdb.retentionClients.has(client)) {
120
- return;
121
- }
122
- try {
123
- // Explicit, since releasing the client only returns the session to the pool.
124
- const { rows } = await client.query('SELECT pg_advisory_unlock($1) AS released', [key]);
125
- if (rows[0]?.released !== true) {
126
- // False means this session no longer holds it, which a transaction-pooling proxy
127
- // causes by switching backends.
128
- sysdb.logger.warn('Could not release the retention lock: this session no longer holds it. Retention will ' +
129
- 'not proceed until the lock is released, which happens when the holding backend closes. ' +
130
- 'A transaction-pooling proxy in front of Postgres causes this; run DBOS through a ' +
131
- 'session-pooled or direct connection.');
132
- }
133
- }
134
- finally {
135
- releaseRetentionClient(sysdb, client);
136
- }
137
- },
138
- };
185
+ return { release };
139
186
  }
140
187
  exports.acquireRetentionLock = acquireRetentionLock;
141
- /** VACUUM the tables a sweep dirtied. No-op where there is no autovacuum to outrun. */
142
188
  async function vacuumTables(sysdb, tables) {
143
189
  if (await (0, cockroach_1.isCockroach)(sysdb)) {
144
190
  return;
@@ -149,7 +195,6 @@ async function vacuumTables(sysdb, tables) {
149
195
  client.on('notice', onNotice);
150
196
  try {
151
197
  for (const table of tables) {
152
- // Per table, so one refusal does not skip the rest.
153
198
  notices = [];
154
199
  try {
155
200
  await client.query(`VACUUM (INDEX_CLEANUP ON, TRUNCATE OFF, ANALYZE) "${sysdb.schemaName}"."${table}"`);
@@ -161,8 +206,6 @@ async function vacuumTables(sysdb, tables) {
161
206
  sysdb.logger.warn(`Payload retention could not vacuum ${table}: ${e.message}`);
162
207
  continue;
163
208
  }
164
- // A refused or stalled VACUUM does not raise, it says so in a notice; a successful
165
- // one is silent, so anything here is worth surfacing.
166
209
  for (const notice of notices) {
167
210
  sysdb.logger.warn(`Payload retention vacuuming ${table}: ${notice}`);
168
211
  }
@@ -173,45 +216,27 @@ async function vacuumTables(sysdb, tables) {
173
216
  releaseRetentionClient(sysdb, client);
174
217
  }
175
218
  }
176
- /** Delete one payload table's orphans below the cutoff, one batch per transaction. */
177
219
  async function collectPayloadTable(sysdb, table, cutoff, batchSize) {
178
- // A payload below the cutoff belongs to a workflow created before it, so the status side
179
- // is the few such rows still present, not the whole table.
180
220
  const orphaned = `NOT EXISTS (
181
221
  SELECT 1 FROM "${sysdb.schemaName}".workflow_status ws
182
- WHERE ws.workflow_uuid = t.workflow_uuid AND ws.created_at < $1
222
+ WHERE ${sysdb.wfJoin('ws', 't')} AND ws.created_at < $1
183
223
  )`;
184
- // Seed from the oldest row in range.
185
- const oldest = await retryOnSerializationError(async () => {
186
- const { rows } = await sysdb.pool.query(`SELECT retention_timestamp
187
- FROM "${sysdb.schemaName}".${table}
188
- WHERE retention_timestamp < $1
189
- ORDER BY retention_timestamp
190
- LIMIT 1`, [cutoff]);
191
- // retention_timestamp is a bigint, so node-postgres hands it back as a string.
192
- return rows.length > 0 ? Number(rows[0].retention_timestamp) : undefined;
193
- });
224
+ const from = `"${sysdb.schemaName}".${table}`;
225
+ const oldest = await retryOnSerializationError(() => kthValue(sysdb, sysdb.pool, 'retention_timestamp', from, 'retention_timestamp < $1', [cutoff], 1), sysdb);
194
226
  if (oldest === undefined) {
195
227
  return 0;
196
228
  }
197
229
  let total = 0;
198
230
  let watermark = oldest - 1;
231
+ const windows = sysdb.sharded ? new WindowBatches(batchSize) : undefined;
199
232
  for (;;) {
200
233
  const batch = await retryOnSerializationError(async () => {
201
- // Borrowed rather than pool.query'd: that releases with the error, which discards the
202
- // connection on a deadlock, so the retry wrapping this would churn the pool per batch.
203
234
  const client = await borrowRetentionClient(sysdb);
204
235
  try {
205
- // Batches are cut by candidate count, so rows spared by the anti-join only thin one
206
- // out; they are re-checked next round.
207
- const { rows } = await client.query(`SELECT retention_timestamp
208
- FROM "${sysdb.schemaName}".${table}
209
- WHERE retention_timestamp < $1 AND retention_timestamp > $2
210
- ORDER BY retention_timestamp
211
- LIMIT 1 OFFSET ${batchSize - 1}`, [cutoff, watermark]);
212
- const step = rows.length > 0 ? Number(rows[0].retention_timestamp) : undefined;
236
+ const step = windows !== undefined
237
+ ? await windows.bound(client, 'retention_timestamp', from, (params) => `retention_timestamp < $${params.push(cutoff)}`, watermark, cutoff)
238
+ : await kthValue(sysdb, client, 'retention_timestamp', from, 'retention_timestamp < $1 AND retention_timestamp > $2', [cutoff, watermark], batchSize);
213
239
  const params = [cutoff, watermark];
214
- // Timestamp ties may push the batch slightly over batchSize, but never split across two.
215
240
  const upperBound = step === undefined ? '' : `AND t.retention_timestamp <= $${params.push(step)} `;
216
241
  const result = await client.query(`DELETE FROM "${sysdb.schemaName}".${table} t
217
242
  WHERE t.retention_timestamp < $1 AND t.retention_timestamp > $2 ${upperBound}AND ${orphaned}`, params);
@@ -220,7 +245,7 @@ async function collectPayloadTable(sysdb, table, cutoff, batchSize) {
220
245
  finally {
221
246
  releaseRetentionClient(sysdb, client);
222
247
  }
223
- });
248
+ }, sysdb);
224
249
  total += batch.deleted;
225
250
  if (batch.step === undefined) {
226
251
  return total;
@@ -228,22 +253,12 @@ async function collectPayloadTable(sysdb, table, cutoff, batchSize) {
228
253
  watermark = batch.step;
229
254
  }
230
255
  }
231
- /**
232
- * Delete payload and step rows below the cutoff whose workflow is gone, returning the count
233
- * removed from each table. Runs after the status sweep, whose orphans all fall in range:
234
- * every payload is stamped no later than the completion that made the row collectable.
235
- */
236
256
  async function collectPayloads(sysdb, cutoff, batchSize = exports.DEFAULT_GC_BATCH_SIZE) {
237
- // A NaN survives a bare `< 1` test and would only fail once it reached SQL.
238
257
  if (!Number.isInteger(batchSize) || batchSize < 1) {
239
258
  throw new error_1.DBOSError(`batchSize must be a positive integer, got ${batchSize}`);
240
259
  }
241
260
  const tables = ['workflow_input', 'workflow_output', 'operation_outputs'];
242
- // To optimize performance, vacuum payload tables both before and after collecting them.
243
261
  await vacuumTables(sysdb, ['workflow_status', ...tables]);
244
- // One connection per concurrent sweep, on top of the one the retention lock holds for the
245
- // whole round. A pool too small for all three runs them sequentially rather than leaving
246
- // sweeps waiting on a connection that only the round itself would free.
247
262
  const poolMax = sysdb.pool.options.max ?? system_database_1.DEFAULT_POOL_SIZE;
248
263
  const concurrency = Math.max(1, Math.min(tables.length, poolMax - 1));
249
264
  const deleted = new Array(tables.length).fill(0);
@@ -263,7 +278,6 @@ async function collectPayloads(sysdb, cutoff, batchSize = exports.DEFAULT_GC_BAT
263
278
  }
264
279
  };
265
280
  await Promise.all(Array.from({ length: concurrency }, () => sweep()));
266
- // Only the first can be thrown, so the rest would otherwise be lost.
267
281
  for (const extra of failures.slice(1)) {
268
282
  sysdb.logger.warn(`Payload retention sweep also failed: ${extra instanceof Error ? extra.message : String(extra)}`);
269
283
  }
@@ -275,45 +289,30 @@ async function collectPayloads(sysdb, cutoff, batchSize = exports.DEFAULT_GC_BAT
275
289
  return deleted;
276
290
  }
277
291
  exports.collectPayloads = collectPayloads;
278
- /**
279
- * Rows garbage collection may delete. completed_at is set on every terminal transition and
280
- * cleared on resume, so one predicate covers eligibility: in-flight rows hold NULL and never
281
- * compare true. Unscoped by application: retention is system-wide.
282
- */
283
292
  function gcFilter(sysdb, cutoffEpochTimestampMs, params) {
284
293
  params.push(cutoffEpochTimestampMs);
285
294
  return `completed_at < $${params.length}`;
286
295
  }
287
- /**
288
- * Delete one batch, returning the watermark to resume from, or undefined once the last one ran.
289
- * The delete is its own transaction; it re-checks the filter, so it needs no snapshot shared
290
- * with the select that bounds it.
291
- */
292
- async function collectStatusBatch(sysdb, cutoffEpochTimestampMs, batchSize, watermark) {
293
- // Borrowed rather than pool.query'd: that releases with the error, which discards the
294
- // connection on a deadlock, so the retry wrapping this would churn the pool per batch.
296
+ async function collectStatusBatch(sysdb, cutoffEpochTimestampMs, batchSize, watermark, windows) {
295
297
  const client = await borrowRetentionClient(sysdb);
296
298
  try {
297
- // The batchSize-th oldest eligible row above the watermark bounds this range
298
- const stepParams = [];
299
- const stepScope = gcFilter(sysdb, cutoffEpochTimestampMs, stepParams);
300
- stepParams.push(watermark);
301
- const stepResult = await client.query(`SELECT completed_at
302
- FROM "${sysdb.schemaName}".workflow_status
303
- WHERE ${stepScope} AND completed_at > $${stepParams.length}
304
- ORDER BY completed_at
305
- LIMIT 1 OFFSET ${batchSize - 1}`, stepParams);
306
- // completed_at is a bigint, so node-postgres hands it back as a string.
307
- const step = stepResult.rows.length > 0 ? Number(stepResult.rows[0].completed_at) : undefined;
299
+ const from = `"${sysdb.schemaName}".workflow_status`;
300
+ let step;
301
+ if (windows !== undefined) {
302
+ step = await windows.bound(client, 'completed_at', from, (params) => gcFilter(sysdb, cutoffEpochTimestampMs, params), watermark, cutoffEpochTimestampMs);
303
+ }
304
+ else {
305
+ const stepParams = [];
306
+ const stepScope = gcFilter(sysdb, cutoffEpochTimestampMs, stepParams);
307
+ stepParams.push(watermark);
308
+ step = await kthValue(sysdb, client, 'completed_at', from, `${stepScope} AND completed_at > $${stepParams.length}`, stepParams, batchSize);
309
+ }
308
310
  const deleteParams = [];
309
311
  let deleteScope = gcFilter(sysdb, cutoffEpochTimestampMs, deleteParams);
310
312
  if (step !== undefined) {
311
- // Inclusive upper bound: completed_at ties may push a batch over batchSize, but never split across two.
312
313
  deleteParams.push(watermark, step);
313
314
  deleteScope = `${deleteScope} AND completed_at > $${deleteParams.length - 1} AND completed_at <= $${deleteParams.length}`;
314
315
  }
315
- // The final batch drops the watermark: unbounded, since an import can land a
316
- // completed_at below it mid-pass.
317
316
  await client.query(`DELETE FROM "${sysdb.schemaName}".workflow_status WHERE ${deleteScope}`, deleteParams);
318
317
  return step;
319
318
  }
@@ -321,28 +320,15 @@ async function collectStatusBatch(sysdb, cutoffEpochTimestampMs, batchSize, wate
321
320
  releaseRetentionClient(sysdb, client);
322
321
  }
323
322
  }
324
- /**
325
- * Delete old terminal workflows throughout the system database, returning the cutoff
326
- * actually used, or undefined when there is nothing to collect.
327
- *
328
- * Conductor sends cleared retention thresholds as JSON null, so every param is nullish.
329
- */
330
323
  async function collectStatuses(sysdb, cutoffEpochTimestampMs, rowsThreshold, options = {}) {
331
324
  const batchSize = options.batchSize ?? exports.DEFAULT_GC_BATCH_SIZE;
332
- // A NaN survives a bare `< 1` test and would only fail once it reached SQL, leaving GC half-applied.
333
325
  if (!Number.isInteger(batchSize) || batchSize < 1) {
334
326
  throw new error_1.DBOSError(`batchSize must be a positive integer, got ${batchSize}`);
335
327
  }
336
328
  if (rowsThreshold !== undefined && rowsThreshold !== null) {
337
- // The completed_at of the rowsThreshold newest completed row
338
- const result = await retryOnSerializationError(() => sysdb.pool.query(`SELECT completed_at
339
- FROM "${sysdb.schemaName}".workflow_status
340
- WHERE completed_at IS NOT NULL
341
- ORDER BY completed_at DESC
342
- LIMIT 1 OFFSET $1`, [rowsThreshold - 1]));
343
- if (result.rows.length > 0) {
344
- const rowsBasedCutoff = Number(result.rows[0].completed_at);
345
- // Use the more restrictive cutoff (higher timestamp = more recent = more deletion)
329
+ const threshold = rowsThreshold;
330
+ const rowsBasedCutoff = await retryOnSerializationError(() => kthValue(sysdb, sysdb.pool, 'completed_at', `"${sysdb.schemaName}".workflow_status`, 'completed_at IS NOT NULL', [], threshold, true), sysdb);
331
+ if (rowsBasedCutoff !== undefined) {
346
332
  if (cutoffEpochTimestampMs === undefined ||
347
333
  cutoffEpochTimestampMs === null ||
348
334
  rowsBasedCutoff > cutoffEpochTimestampMs) {
@@ -353,34 +339,22 @@ async function collectStatuses(sysdb, cutoffEpochTimestampMs, rowsThreshold, opt
353
339
  if (cutoffEpochTimestampMs === undefined || cutoffEpochTimestampMs === null) {
354
340
  return undefined;
355
341
  }
356
- // Narrowed to a constant so the closures below keep it.
357
342
  const cutoff = cutoffEpochTimestampMs;
358
- // Advance a completed_at watermark, one committed transaction per batch, so a long
359
- // history neither deletes in one transaction nor rescans what it already deleted.
360
- const oldest = await retryOnSerializationError(async () => {
343
+ const oldest = await retryOnSerializationError(() => {
361
344
  const params = [];
362
345
  const scope = gcFilter(sysdb, cutoff, params);
363
- const { rows } = await sysdb.pool.query(`SELECT completed_at
364
- FROM "${sysdb.schemaName}".workflow_status
365
- WHERE ${scope}
366
- ORDER BY completed_at
367
- LIMIT 1`, params);
368
- return rows.length > 0 ? Number(rows[0].completed_at) : undefined;
369
- });
346
+ return kthValue(sysdb, sysdb.pool, 'completed_at', `"${sysdb.schemaName}".workflow_status`, scope, params, 1);
347
+ }, sysdb);
370
348
  let watermark = oldest === undefined ? 0 : oldest - 1;
349
+ const windows = sysdb.sharded ? new WindowBatches(batchSize) : undefined;
371
350
  for (;;) {
372
- const next = await retryOnSerializationError(() => collectStatusBatch(sysdb, cutoff, batchSize, watermark));
373
- // Fewer than a full batch remained, so that delete took the rest.
351
+ const next = await retryOnSerializationError(() => collectStatusBatch(sysdb, cutoff, batchSize, watermark, windows), sysdb);
374
352
  if (next === undefined)
375
353
  return cutoff;
376
354
  watermark = next;
377
355
  }
378
356
  }
379
357
  exports.collectStatuses = collectStatuses;
380
- /**
381
- * IDs of this application's in-flight workflows created at or before the cutoff.
382
- * Claiming-scoped, so an upgrade still times out its own unclaimed workflows.
383
- */
384
358
  async function listTimedOutWorkflowIds(sysdb, cutoffEpochTimestampMs) {
385
359
  return (0, system_database_1.withDbRetry)(async () => {
386
360
  const params = [
@@ -388,19 +362,23 @@ async function listTimedOutWorkflowIds(sysdb, cutoffEpochTimestampMs) {
388
362
  workflow_1.StatusString.PENDING,
389
363
  workflow_1.StatusString.ENQUEUED,
390
364
  workflow_1.StatusString.DELAYED,
365
+ workflow_1.StatusString.SUSPENDED,
391
366
  ];
392
367
  const scope = sysdb.appNameFilter('application_name', sysdb.appName, params);
393
- const { rows } = await sysdb.pool.query(`SELECT workflow_uuid
368
+ const key = sysdb.keyColumn(undefined);
369
+ const { rows } = await sysdb.pool.query(`SELECT workflow_uuid, ${key ?? 'NULL'} AS shard_key
394
370
  FROM "${sysdb.schemaName}".workflow_status
395
371
  WHERE created_at <= $1
396
- AND status IN ($2, $3, $4)
372
+ AND status IN ($2, $3, $4, $5)
397
373
  AND ${scope}`, params);
398
- return rows.map((row) => row.workflow_uuid);
374
+ return rows.map((row) => [row.workflow_uuid, row.shard_key ?? undefined]);
399
375
  });
400
376
  }
401
377
  exports.listTimedOutWorkflowIds = listTimedOutWorkflowIds;
402
- /** Enforce retention across the entire system database. */
403
378
  async function garbageCollect(sysdb, cutoffEpochTimestampMs, rowsThreshold, options = {}) {
379
+ if (rowsThreshold !== undefined && rowsThreshold !== null && sysdb.sharded) {
380
+ throw new error_1.DBOSError('A rows threshold is not supported on a sharded system database; use a time cutoff instead');
381
+ }
404
382
  if ((cutoffEpochTimestampMs === undefined || cutoffEpochTimestampMs === null) &&
405
383
  (rowsThreshold === undefined || rowsThreshold === null)) {
406
384
  return;
@@ -411,14 +389,19 @@ async function garbageCollect(sysdb, cutoffEpochTimestampMs, rowsThreshold, opti
411
389
  return;
412
390
  }
413
391
  try {
414
- // Both sweeps take the same batch size, and both default it the same way when unset.
415
392
  const batchSize = options.batchSize ?? undefined;
416
393
  const cutoff = await collectStatuses(sysdb, cutoffEpochTimestampMs, rowsThreshold, { batchSize });
417
394
  if (cutoff === undefined) {
418
395
  return;
419
396
  }
420
- // Strictly after the status sweep: the payload sweep only takes orphans, so this round's
421
- // are only visible to it once that sweep has committed.
397
+ for (const store of options.externalStores ?? []) {
398
+ try {
399
+ await (0, external_storage_1.collectExternalObjects)(sysdb, store, cutoff);
400
+ }
401
+ catch (e) {
402
+ sysdb.logger.warn(`External object garbage collection failed for store ${store.storeID}: ${e instanceof Error ? e.message : String(e)}`);
403
+ }
404
+ }
422
405
  await collectPayloads(sysdb, cutoff, batchSize);
423
406
  }
424
407
  finally {
@@ -427,9 +410,8 @@ async function garbageCollect(sysdb, cutoffEpochTimestampMs, rowsThreshold, opti
427
410
  }
428
411
  exports.garbageCollect = garbageCollect;
429
412
  async function globalTimeout(sysdb, cutoffEpochTimestampMs) {
430
- // IDs only, so a bulk timeout does not deserialize every row's inputs and outputs.
431
- for (const workflowID of await listTimedOutWorkflowIds(sysdb, cutoffEpochTimestampMs)) {
432
- await sysdb.cancelWorkflows([workflowID]);
413
+ for (const [workflowID, shardKey] of await listTimedOutWorkflowIds(sysdb, cutoffEpochTimestampMs)) {
414
+ await (0, shard_keys_1.bindShardKeys)([[workflowID, shardKey]], () => sysdb.cancelWorkflows([workflowID]));
433
415
  }
434
416
  }
435
417
  exports.globalTimeout = globalTimeout;
@@ -1 +1 @@
1
- {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/retention.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/retention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ export { ShardedSystemDatabase } from './sys_db';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sharding/index.ts"],"names":[],"mappings":";;;;;;;AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}