pg-boss 12.28.0 → 12.29.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/README.md +2 -2
- package/dist/attorney.d.ts.map +1 -1
- package/dist/attorney.js +36 -3
- package/dist/boss.d.ts +7 -1
- package/dist/boss.d.ts.map +1 -1
- package/dist/boss.js +181 -2
- package/dist/cli.js +117 -2
- package/dist/index.d.ts +19 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -2
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +10 -2
- package/dist/migrationStore.d.ts.map +1 -1
- package/dist/migrationStore.js +13 -0
- package/dist/plans.d.ts +55 -1
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +234 -5
- package/dist/schema.json +15 -1
- package/dist/types.d.ts +76 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -7
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAwEvD,cAAM,OAAQ,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAC7D,MAAM;;;MAAS;IACf,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG;QAAE,MAAM,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,GAAG,EAAE,CAAA;IAC/C,MAAM,EAAE,KAAK,CAAC,0BAA0B,CAAA;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAA;IAC9C,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAA;IACvC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAA;IAClC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;IAChD,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;gBAM5B,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAe1E,MAAM,CAAC,CAAC,GAAG,MAAM,EAAG,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAYrD,UAAU,IAAK,IAAI;IAyYb,KAAK;IAkBL,aAAa,CAAE,EAAE,IAAY,EAAE;;KAAK;IAUpC,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAwBxD,IAAI;IAkBJ,OAAO;IAUb,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACjF,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAuH1J,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,OAAO;IAWf,UAAU,CAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;IAUvD,kBAAkB,IAAK,OAAO;IAIxB,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,cAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC3F,YAAY,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAarC,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUhC,mBAAmB,IAAK,IAAI;IAQtB,SAAS,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,WAAW,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,OAAO,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBlF,IAAI,CAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACrD,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO/F,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASvI,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW3I,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwD3I,SAAS,CAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhE,MAAM,CAAE,OAAO,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IACpE,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IA0BpH,MAAM,CAAE,OAAO,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IACpE,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IA6D9G,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EACvB,OAAO,GAAE,KAAK,CAAC,aAAkB;IAiG7B,IAAI,CAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA0G1G,qBAAqB,CAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAiBpE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,eAAe,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAiD5E,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,kBAAkB;IAQpB,QAAQ,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,KAAK,CAAC,eAAoB;YAsBhG,iBAAiB;YAQjB,mBAAmB;IAQ3B,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;YAmBpF,eAAe;IA2BvB,4BAA4B,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/E,8BAA8B,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IASjF,0BAA0B,CAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YA6BpE,qBAAqB;YAmBrB,kBAAkB;IA6E1B,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUrF,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB3E,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUlF,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUlF,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IASnF,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUjF,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAUlH,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO;IAsBtF,cAAc,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAehD,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAuBnE,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,kBAAuB;IA6BjE,QAAQ,CAAE,IAAI,EAAE,MAAM;IAMtB,WAAW,CAAE,IAAI,EAAE,MAAM;IAiBzB,gBAAgB,CAAE,IAAI,EAAE,MAAM;IAO9B,gBAAgB,CAAE,IAAI,EAAE,MAAM;IAO9B,aAAa,CAAE,IAAI,CAAC,EAAE,MAAM;IA4B5B,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAgGhG,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IA4BxH,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,eAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IA0BnG,eAAe,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAQjH,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAQrH,OAAO,CAAC,QAAQ;CAWjB;AAED,eAAe,OAAO,CAAA"}
|
package/dist/manager.js
CHANGED
|
@@ -713,7 +713,15 @@ class Manager extends EventEmitter {
|
|
|
713
713
|
assert(event, 'Missing required argument');
|
|
714
714
|
const sql = plans.getQueuesForEvent(this.config.schema);
|
|
715
715
|
const { rows } = await this.db.executeSql(sql, [event]);
|
|
716
|
-
await Promise.allSettled(rows.map(({ name }) => this.send(name, data, options)));
|
|
716
|
+
const results = await Promise.allSettled(rows.map(({ name }) => this.send(name, data, options)));
|
|
717
|
+
const failures = results
|
|
718
|
+
.map((result, index) => ({ result, name: rows[index].name }))
|
|
719
|
+
.filter((entry) => entry.result.status === 'rejected');
|
|
720
|
+
if (failures.length > 0) {
|
|
721
|
+
// Each entry names its own queue, so attribution doesn't depend on lining errors[] up with
|
|
722
|
+
// the queue order positionally, and survives two subscribers failing with identical text.
|
|
723
|
+
throw new AggregateError(failures.map(({ name, result }) => `${name}: ${result.reason?.message ?? result.reason}`), `publish('${event}') failed for ${failures.length} of ${results.length} subscribed queue(s)`);
|
|
724
|
+
}
|
|
717
725
|
}
|
|
718
726
|
async send(...args) {
|
|
719
727
|
const result = Attorney.checkSendArgs(args);
|
|
@@ -1487,7 +1495,7 @@ class Manager extends EventEmitter {
|
|
|
1487
1495
|
}
|
|
1488
1496
|
async deleteAllJobs(name) {
|
|
1489
1497
|
if (!name) {
|
|
1490
|
-
const sql = plans.truncateTable(this.config.schema,
|
|
1498
|
+
const sql = plans.truncateTable(this.config.schema, plans.BASE_JOB_TABLE);
|
|
1491
1499
|
await this.db.executeSql(sql);
|
|
1492
1500
|
return;
|
|
1493
1501
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrationStore.d.ts","sourceRoot":"","sources":["../src/migrationStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAKnC,UAAU,cAAc;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IAKrB,eAAe,CAAC,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAA;CAC7C;AAoGD,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AASD,iBAAS,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,UAsB5G;AAED,iBAAS,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,UAQxG;AAKD,iBAAS,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CAiDrK;AAKD,iBAAS,OAAO,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,UAIzI;AAoxBD,iBAAS,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,iBAAS,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,UAAU,UAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"migrationStore.d.ts","sourceRoot":"","sources":["../src/migrationStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAKnC,UAAU,cAAc;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IAKrB,eAAe,CAAC,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAA;CAC7C;AAoGD,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AASD,iBAAS,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,UAsB5G;AAED,iBAAS,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,UAQxG;AAKD,iBAAS,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CAiDrK;AAKD,iBAAS,OAAO,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,UAIzI;AAoxBD,iBAAS,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,iBAAS,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,UAAU,UAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,CA0c9F;AAED,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,eAAe,EACf,MAAM,EACN,aAAa,GACd,CAAA"}
|
package/dist/migrationStore.js
CHANGED
|
@@ -1382,6 +1382,19 @@ function getAll(schema, noPartitioning = false, noCovering = false) {
|
|
|
1382
1382
|
createQueueFn[33](schema),
|
|
1383
1383
|
`SELECT ${schema}.job_table_run($cmd$DROP INDEX IF EXISTS ${schema}.job_i10$cmd$)`
|
|
1384
1384
|
]
|
|
1385
|
+
},
|
|
1386
|
+
{
|
|
1387
|
+
release: '12.29.0',
|
|
1388
|
+
version: 39,
|
|
1389
|
+
previous: 38,
|
|
1390
|
+
// Interval claim for the index-bloat maintenance pass, so one instance per interval runs it
|
|
1391
|
+
// rather than every instance racing on the same REINDEX. Same shape as bam_on / flow_on.
|
|
1392
|
+
install: [
|
|
1393
|
+
`ALTER TABLE ${schema}.version ADD COLUMN IF NOT EXISTS reindex_on timestamp with time zone`
|
|
1394
|
+
],
|
|
1395
|
+
uninstall: [
|
|
1396
|
+
`ALTER TABLE ${schema}.version DROP COLUMN reindex_on`
|
|
1397
|
+
]
|
|
1385
1398
|
}
|
|
1386
1399
|
];
|
|
1387
1400
|
}
|
package/dist/plans.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { JobMatchStrategy, ManagedIndex, ManagedFunction } from './types.ts';
|
|
1
|
+
import type { IndexBloatOptions, JobMatchStrategy, ManagedIndex, ManagedFunction } from './types.ts';
|
|
2
2
|
import type { ExpectedColumns, ExpectedConstraints } from './drifter.ts';
|
|
3
3
|
export interface SqlQuery {
|
|
4
4
|
text: string;
|
|
@@ -27,6 +27,7 @@ export declare const QUEUE_POLICIES: Readonly<{
|
|
|
27
27
|
exclusive: "exclusive";
|
|
28
28
|
key_strict_fifo: "key_strict_fifo";
|
|
29
29
|
}>;
|
|
30
|
+
export declare const BASE_JOB_TABLE = "job";
|
|
30
31
|
export declare const COMMON_JOB_TABLE = "job_common";
|
|
31
32
|
interface CreateOptions {
|
|
32
33
|
createSchema?: boolean;
|
|
@@ -50,6 +51,7 @@ export declare function trySetQueueDeletionTime(schema: string, queues: string[]
|
|
|
50
51
|
export declare function trySetCronTime(schema: string, seconds: number): string;
|
|
51
52
|
export declare function trySetBamTime(schema: string, seconds: number): string;
|
|
52
53
|
export declare function trySetFlowTime(schema: string, seconds: number): string;
|
|
54
|
+
export declare function trySetReindexTime(schema: string, seconds: number): string;
|
|
53
55
|
export declare function updateQueue(schema: string): string;
|
|
54
56
|
export declare function getQueues(schema: string, names?: string[]): SqlQuery;
|
|
55
57
|
export declare function deleteJobsById(schema: string, table: string): string;
|
|
@@ -206,5 +208,57 @@ export declare function expectedManagedColumns(schema: string, partitioned: bool
|
|
|
206
208
|
export declare function expectedManagedConstraints(schema: string, partitioned: boolean): ExpectedConstraints[];
|
|
207
209
|
export declare function expectedManagedFunctions(schema: string, partitioned: boolean): ManagedFunction[];
|
|
208
210
|
export declare function expectedManagedIndexes(schema: string, partitioned: boolean, partitions?: QueuePartition[]): ManagedIndex[];
|
|
211
|
+
export declare const REINDEX_DEFAULTS: {
|
|
212
|
+
minPages: number;
|
|
213
|
+
maxEntriesPerPage: number;
|
|
214
|
+
minSizeRatio: number;
|
|
215
|
+
maxIndexBytes: number;
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Bloated job indexes, by the pg_class density heuristic. Deliberately avoids pgstattuple: it is an
|
|
219
|
+
* extension that may not be installed, and relpages/reltuples separates a bloated index from a
|
|
220
|
+
* healthy one by three orders of magnitude on their own.
|
|
221
|
+
*
|
|
222
|
+
* PostgreSQL-only (including PGlite, where both the bloat and REINDEX CONCURRENTLY behave normally).
|
|
223
|
+
* Callers must gate on noReindex — see the note in boss.ts #reindex.
|
|
224
|
+
*
|
|
225
|
+
* `owned` is returned rather than filtered on, so an installation whose role cannot reindex still
|
|
226
|
+
* gets told what is bloated. Only leaf indexes (relkind 'i') are candidates — pg-boss creates
|
|
227
|
+
* i1..i10 directly on each partition, and a partitioned index (relkind 'I') cannot be reindexed
|
|
228
|
+
* except through its leaves anyway.
|
|
229
|
+
*
|
|
230
|
+
* Caveat: relpages/reltuples are refreshed by VACUUM/ANALYZE, so they go stale where autovacuum is
|
|
231
|
+
* disabled for the table. That is acceptable — the entire failure mode assumes autovacuum runs.
|
|
232
|
+
*/
|
|
233
|
+
export declare function getBloatedIndexes(schema: string, tables?: string[], options?: IndexBloatOptions): string;
|
|
234
|
+
/**
|
|
235
|
+
* Every owned leaf index on the job tables, ignoring the density gate — the target list for
|
|
236
|
+
* `{ force: true }`.
|
|
237
|
+
*/
|
|
238
|
+
export declare function getJobIndexes(schema: string, tables?: string[]): string;
|
|
239
|
+
/**
|
|
240
|
+
* Invalid `*_ccnew` stubs left behind by an interrupted REINDEX CONCURRENTLY. Postgres appends
|
|
241
|
+
* `_ccnew`, then `_ccnew1`, `_ccnew2`, ... on collision. These must be dropped before a retry or
|
|
242
|
+
* they accumulate, and they are dead weight that vacuum still walks. Mirrors bamHealDrop's role for
|
|
243
|
+
* interrupted CREATE INDEX CONCURRENTLY.
|
|
244
|
+
*/
|
|
245
|
+
export declare function getReindexLeftovers(schema: string, tables?: string[], noIndexProgressView?: boolean, anyOwner?: boolean): string;
|
|
246
|
+
export declare function reindexIndex(schema: string, name: string): string;
|
|
247
|
+
export declare function dropIndexConcurrently(schema: string, name: string): string;
|
|
248
|
+
/**
|
|
249
|
+
* The statement list an operator runs by hand: every stale stub dropped first, then the rebuilds.
|
|
250
|
+
*
|
|
251
|
+
* Stubs are emitted whole rather than paired to the index they came from. Postgres does not append
|
|
252
|
+
* `_ccnew` — it truncates the *base* so the result fits in 63 bytes, so `j<sha224>_i5` (60 chars)
|
|
253
|
+
* leaves behind `j<sha224>__ccnew` with the `i5` gone, and a prefix match never fires on a
|
|
254
|
+
* partitioned queue (every partition table name is `'j' || sha224(queue_name)`, 57 chars). Dropping
|
|
255
|
+
* them unconditionally is also what the background pass does: an invalid stub is dead weight that
|
|
256
|
+
* vacuum still walks, whichever index it came from.
|
|
257
|
+
*/
|
|
258
|
+
export declare function buildReindexCommands(schema: string, targets: {
|
|
259
|
+
name: string;
|
|
260
|
+
}[], leftovers: {
|
|
261
|
+
name: string;
|
|
262
|
+
}[]): string[];
|
|
209
263
|
export {};
|
|
210
264
|
//# sourceMappingURL=plans.d.ts.map
|
package/dist/plans.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASpG,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAIxE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,QAAQ;;CAEpB,CAAA;AAED,eAAO,MAAM,cAAc,WAAW,CAAA;AACtC,eAAO,MAAM,oBAAoB,qBAAqB,CAAA;AACtD,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AACnD,eAAO,MAAM,kBAAkB,QAAO,CAAA;AAqBtC,eAAO,MAAM,UAAU;;;;;;;EAOrB,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;;;EAOzB,CAAA;AAiBF,eAAO,MAAM,cAAc,QAAQ,CAAA;AACnC,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C,UAAU,aAAa;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,wBAAgB,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,UA6C/E;AAqHD,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,MAAM,UAUjD;AAED,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,wBAAwB,CAAE,MAAM,EAAE,MAAM,UAUvD;AAED,wBAAgB,8BAA8B,CAAE,MAAM,EAAE,MAAM,UAE7D;AAOD,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,MAAM,UAerD;AA2WD,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,OAAO,UAGrG;AAiBD,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAID,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,UAGnF;AAiFD,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAEnG;AAED,wBAAgB,uBAAuB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAEpG;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE9D;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE7D;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE9D;AAED,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAEjE;AAwBD,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,UAyB1C;AAED,wBAAgB,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAkCrE;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAU5D;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAE9D;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAE9D;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAE3D;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAE3D;AAED,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,UAE3C;AAED,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,UAElD;AAED,wBAAgB,yBAAyB,CAAE,MAAM,EAAE,MAAM,UAExD;AAED,wBAAgB,QAAQ,CAAE,MAAM,EAAE,MAAM,UAWvC;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,UAMzC;AAED,wBAAgB,SAAS,CAAE,MAAM,EAAE,MAAM,UASxC;AAED,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,UAK1C;AAED,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,UAKhD;AAED,wBAAgB,OAAO,WAEtB;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,UAK5C;AAED,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAanD;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,MAAM,CAerF;AAED,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,eAAe,UAAQ,GAAG,MAAM,CAMtF;AASD,wBAAgB,0BAA0B,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BlE;AAED,wBAAgB,2BAA2B,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BjF;AAED,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CASrG;AAKD,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAe1D;AAED,wBAAgB,oBAAoB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAwBD,wBAAgB,4BAA4B,CAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CA6C/H;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,UAEzC;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE1D;AAED,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,MAAM,UAEjD;AAOD,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED,wBAAgB,yBAAyB,CAAE,MAAM,EAAE,MAAM,UAExD;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE7D;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAAA;IAClD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA6ED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAE,OAAO,EAAE,eAAe,EAAE,YAAY,UAAQ,GAAG,QAAQ,CAiMtF;AA+CD,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,UAQnF;AAKD,wBAAgB,uBAAuB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAkBrE;AAKD,wBAAgB,kCAAkC,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAehF;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAaxD;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAaxD;AAED,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UASzD;AAuBD,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAe,EAAE,MAAc,EAAE,EAAE,iBAAiB,UAgH9G;AAOD,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAUzH;AAED,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAK1D;AAED,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAQrH;AAED,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CASvH;AAED,wBAAgB,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAYvD;AA8MD,wBAAgB,uBAAuB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAcrE;AAID,wBAAgB,6BAA6B,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAW3E;AAGD,wBAAgB,oBAAoB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAK7E;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKzE;AAMD,wBAAgB,yBAAyB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAQpG;AAED,wBAAgB,2BAA2B,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAStG;AAED,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKxE;AAID,wBAAgB,uBAAuB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAKvG;AAMD,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAY3D;AAKD,eAAO,MAAM,eAAe,OAAO,CAAA;AAQnC,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAqCzF;AAMD,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,CAcvH;AAID,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcrE;AAED,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS3D;AAYD,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqClE;AAED,wBAAgB,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAa5G;AAED,wBAAgB,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAcvD;AAWD,wBAAgB,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAQ,UAsEzI;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CA4BxF;AAMD,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CA6CnH;AAOD,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA+BtF;AAGD,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG7D;AAGD,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,WAAW,CAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAU7D;AAED,wBAAgB,MAAM,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAGjH;AAWD,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAG/D;AAED,wBAAgB,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,UA+BpI;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAOxD;AAID,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,UAcnE;AAED,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,UAM9C;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,UAM5C;AAED,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAgBvH;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAQ5D;AAED,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAmB,EAAE,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,UA0GzG;AAQD,wBAAgB,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3E;AAUD,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU5E;AAED,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAM1D;AAED,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAOtE;AAED,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,UAM3C;AAED,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,UAO5C;AAUD,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,UAE9C;AAGD,wBAAgB,yBAAyB,CAAE,MAAM,EAAE,MAAM,UAExD;AAID,wBAAgB,wBAAwB,CAAE,MAAM,EAAE,MAAM,UAEvD;AAID,wBAAgB,mBAAmB,CAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAUD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAiCD,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAoC,CAAA;AAIrF,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAE,cAAc,EAAO,GAAG,MAAM,EAAE,CAIxH;AAQD,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAE,cAAc,EAAO,GAAG,eAAe,EAAE,CAuBlI;AAMD,wBAAgB,0BAA0B,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,mBAAmB,EAAE,CASvG;AAOD,wBAAgB,wBAAwB,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,eAAe,EAAE,CASjG;AAQD,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAE,cAAc,EAAO,GAAG,YAAY,EAAE,CA6B/H;AAcD,eAAO,MAAM,gBAAgB;;;;;CAqB5B,CAAA;AAqDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAkCzG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBxE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,UAAQ,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAkC7H;AASD,wBAAgB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,EAAE,CAO1H"}
|
package/dist/plans.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
1
2
|
import { indexKeysRaw, indexIncludeRaw, indexPredicateRaw, displayIndexDefinition, extractFunctionBody, normalizeFunctionBody } from "./drifter.js";
|
|
2
3
|
import schemaManifest from './schema.json' with { type: 'json' };
|
|
3
4
|
import { normalizeSchemaName, resolveSchemaName } from "./tools.js";
|
|
@@ -53,6 +54,11 @@ const QUEUE_DEFAULTS = {
|
|
|
53
54
|
retry_backoff: false,
|
|
54
55
|
partition: false
|
|
55
56
|
};
|
|
57
|
+
// The root of the job table hierarchy, under both install shapes: the partitioned parent that
|
|
58
|
+
// COMMON_JOB_TABLE and every per-queue partition attach to, and the plain physical table that
|
|
59
|
+
// carries the rows and indexes itself where noTablePartitioning is set. Also the template every
|
|
60
|
+
// partition is cloned from (CREATE TABLE ... LIKE).
|
|
61
|
+
export const BASE_JOB_TABLE = 'job';
|
|
56
62
|
export const COMMON_JOB_TABLE = 'job_common';
|
|
57
63
|
export function create(schema, version, options) {
|
|
58
64
|
const noPartitioning = options?.noTablePartitioning ?? false;
|
|
@@ -113,7 +119,8 @@ function createTableVersion(schema) {
|
|
|
113
119
|
version int primary key,
|
|
114
120
|
cron_on timestamp with time zone,
|
|
115
121
|
bam_on timestamp with time zone,
|
|
116
|
-
flow_on timestamp with time zone
|
|
122
|
+
flow_on timestamp with time zone,
|
|
123
|
+
reindex_on timestamp with time zone
|
|
117
124
|
)
|
|
118
125
|
`;
|
|
119
126
|
}
|
|
@@ -466,7 +473,7 @@ function createQueueFunction(schema, noPartitioning = false) {
|
|
|
466
473
|
COALESCE((options->>'warningQueueSize')::int, ${QUEUE_DEFAULTS.warning_queued}),
|
|
467
474
|
options->>'deadLetter',
|
|
468
475
|
false,
|
|
469
|
-
'
|
|
476
|
+
'${BASE_JOB_TABLE}',
|
|
470
477
|
(options->>'heartbeatSeconds')::int
|
|
471
478
|
)
|
|
472
479
|
ON CONFLICT DO NOTHING;
|
|
@@ -707,6 +714,9 @@ export function trySetBamTime(schema, seconds) {
|
|
|
707
714
|
export function trySetFlowTime(schema, seconds) {
|
|
708
715
|
return trySetTimestamp(schema, 'flow_on', seconds);
|
|
709
716
|
}
|
|
717
|
+
export function trySetReindexTime(schema, seconds) {
|
|
718
|
+
return trySetTimestamp(schema, 'reindex_on', seconds);
|
|
719
|
+
}
|
|
710
720
|
function trySetTimestamp(schema, column, seconds) {
|
|
711
721
|
return `
|
|
712
722
|
UPDATE ${schema}.version
|
|
@@ -2716,7 +2726,7 @@ export function expectedManagedColumns(schema, partitioned, partitions = []) {
|
|
|
2716
2726
|
const byTable = new Map();
|
|
2717
2727
|
const jobColumns = [];
|
|
2718
2728
|
for (const c of manifestSection(partitioned).columns) {
|
|
2719
|
-
if (c.table ===
|
|
2729
|
+
if (c.table === BASE_JOB_TABLE) {
|
|
2720
2730
|
jobColumns.push(c.column);
|
|
2721
2731
|
continue;
|
|
2722
2732
|
}
|
|
@@ -2731,7 +2741,7 @@ export function expectedManagedColumns(schema, partitioned, partitions = []) {
|
|
|
2731
2741
|
entry.defaults[c.column] = applyManifestSchema(c.default, schema);
|
|
2732
2742
|
}
|
|
2733
2743
|
const out = [...byTable.values()];
|
|
2734
|
-
out.push({ table:
|
|
2744
|
+
out.push({ table: BASE_JOB_TABLE, columns: jobColumns });
|
|
2735
2745
|
if (partitioned) {
|
|
2736
2746
|
out.push({ table: COMMON_JOB_TABLE, columns: jobColumns });
|
|
2737
2747
|
for (const p of partitions)
|
|
@@ -2780,7 +2790,7 @@ export function expectedManagedIndexes(schema, partitioned, partitions = []) {
|
|
|
2780
2790
|
const def = applyManifestSchema(indexdef, schema);
|
|
2781
2791
|
return { name, table, keys: indexKeysRaw(def), include: indexIncludeRaw(def), predicate: indexPredicateRaw(def), definition: displayIndexDefinition(def) };
|
|
2782
2792
|
};
|
|
2783
|
-
const jobTable = partitioned ? COMMON_JOB_TABLE :
|
|
2793
|
+
const jobTable = partitioned ? COMMON_JOB_TABLE : BASE_JOB_TABLE;
|
|
2784
2794
|
const out = [];
|
|
2785
2795
|
const jobIndexes = [];
|
|
2786
2796
|
// The manifest holds only the managed indexes (constraint-backing *_pkey indexes are excluded at
|
|
@@ -2803,3 +2813,222 @@ export function expectedManagedIndexes(schema, partitioned, partitions = []) {
|
|
|
2803
2813
|
}
|
|
2804
2814
|
return out;
|
|
2805
2815
|
}
|
|
2816
|
+
// --- Index bloat detection and reindexing (issue #876) ---------------------------------------
|
|
2817
|
+
//
|
|
2818
|
+
// Autovacuum reclaims heap space but never returns btree pages to the OS, so a job index sizes
|
|
2819
|
+
// itself to the largest backlog its queue has ever held and stays there. A drained 1M-job peak
|
|
2820
|
+
// leaves job_common_i5 at 38 MB and job_common_pkey at 51 MB holding 1k live rows — and every
|
|
2821
|
+
// subsequent vacuum with dead tuples to clean does a full physical scan of every one of those
|
|
2822
|
+
// pages (measured: 17,969 buffer hits + 3,892 reads vs 750 hits / 0 reads after a rebuild), which
|
|
2823
|
+
// is what drains IO burst credits on managed Postgres.
|
|
2824
|
+
//
|
|
2825
|
+
// The bloat is a high-water mark rather than an unbounded leak — empty pages ARE recycled by later
|
|
2826
|
+
// inserts — so the trigger is density, not elapsed time.
|
|
2827
|
+
export const REINDEX_DEFAULTS = {
|
|
2828
|
+
// 1 MB. Below this the absolute waste is irrelevant and reltuples/relpages is noisy.
|
|
2829
|
+
minPages: 128,
|
|
2830
|
+
// A freshly rebuilt job index packs 140-170 entries per page; a bloated one holds ~0.2. Five is
|
|
2831
|
+
// three orders of magnitude clear of healthy on the indexes that carry fixed-width keys.
|
|
2832
|
+
maxEntriesPerPage: 5,
|
|
2833
|
+
// Density alone is not enough: singleton_key is unbounded text and is indexed by i1-i4, i6, i8 and
|
|
2834
|
+
// i10, so a healthy index over ~1.3 kB keys legitimately holds fewer than five entries per page
|
|
2835
|
+
// (measured: 150k distinct 1,286-byte keys, freshly built, 4.0 entries/page) and would be rebuilt
|
|
2836
|
+
// every interval forever. What separates that from bloat is the index's size against the size its
|
|
2837
|
+
// own live entries need, which pg_stats gives for free (measured on the two fixtures):
|
|
2838
|
+
//
|
|
2839
|
+
// reported bloat (drained 1M peak) 0 live entries, 4,861 pages 4861x
|
|
2840
|
+
// healthy wide-key index 150k x 1,291 bytes, 37,502 pages 1.6x
|
|
2841
|
+
//
|
|
2842
|
+
// Four keeps a wide margin on both sides, and unlike a comparison against the heap it does not
|
|
2843
|
+
// quietly stop working when the heap itself is bloated or cannot be truncated.
|
|
2844
|
+
minSizeRatio: 4,
|
|
2845
|
+
// 2 GB. A large index that still passes the density gate would carry a genuinely expensive
|
|
2846
|
+
// rebuild, so leave it to an operator who has chosen the moment.
|
|
2847
|
+
maxIndexBytes: 2 * 1024 * 1024 * 1024
|
|
2848
|
+
};
|
|
2849
|
+
// float8, not bigint: pg_relation_size() and reltuples::bigint are int8, which node-postgres hands
|
|
2850
|
+
// back as a *string* (it registers no int8 parser), so the exported IndexBloat type would be lying
|
|
2851
|
+
// about `bytes` and `entries` and a consumer comparing them numerically would be comparing text.
|
|
2852
|
+
// int4 is not an option - the index that exceeds maxIndexBytes is exactly the one that overflows it.
|
|
2853
|
+
// float8 is exact to 2^53 bytes, and reltuples is a float4 estimate to begin with.
|
|
2854
|
+
// The pages the index's *live* entries actually need, from the average width of what it indexes.
|
|
2855
|
+
// pg_stats carries that per column, and — the part that matters here, since i1-i4 and i6 key on
|
|
2856
|
+
// `COALESCE(singleton_key, '')` — ANALYZE also collects it for an index's expression columns, keyed
|
|
2857
|
+
// by the index relation. Plain attnums read the table's stats, attnum 0 (an expression) falls back
|
|
2858
|
+
// to the index's own. 20 bytes covers the btree tuple header and line pointer.
|
|
2859
|
+
const INDEX_WIDTH_JOIN = `LEFT JOIN LATERAL (
|
|
2860
|
+
SELECT COALESCE(sum(COALESCE(ts.avg_width, xs.avg_width, 0)), 0) AS key_width
|
|
2861
|
+
FROM unnest(x.indkey::int2[]) WITH ORDINALITY AS k(attnum, pos)
|
|
2862
|
+
LEFT JOIN pg_attribute a ON a.attrelid = x.indrelid AND a.attnum = k.attnum
|
|
2863
|
+
LEFT JOIN pg_stats ts ON ts.schemaname = n.nspname AND ts.tablename = t.relname AND ts.attname = a.attname
|
|
2864
|
+
LEFT JOIN pg_attribute ia ON ia.attrelid = i.oid AND ia.attnum = k.pos::int2
|
|
2865
|
+
LEFT JOIN pg_stats xs ON xs.schemaname = n.nspname AND xs.tablename = i.relname AND xs.attname = ia.attname
|
|
2866
|
+
) w ON true`;
|
|
2867
|
+
const EXPECTED_PAGES = 'GREATEST(ceil((i.reltuples * (w.key_width + 20)) / 8192.0), 1)';
|
|
2868
|
+
const INDEX_STAT_COLUMNS = `
|
|
2869
|
+
floor(i.reltuples)::float8 as entries,
|
|
2870
|
+
pg_relation_size(i.oid)::float8 as bytes,`;
|
|
2871
|
+
function numericThreshold(value, fallback, name) {
|
|
2872
|
+
if (value === undefined || value === null)
|
|
2873
|
+
return fallback;
|
|
2874
|
+
assert(typeof value === 'number' && Number.isFinite(value) && value >= 0, `configuration assert: reindex.${name} must be a finite number >= 0`);
|
|
2875
|
+
return value;
|
|
2876
|
+
}
|
|
2877
|
+
// The job tables in scope. Every queue row names the physical table its jobs live on, so the
|
|
2878
|
+
// subquery covers the whole installation on its own: `job_common` for an unpartitioned queue,
|
|
2879
|
+
// `j<sha224(name)>` for a partitioned one, and `job` itself where noTablePartitioning makes `job` a
|
|
2880
|
+
// plain table rather than a partitioned parent.
|
|
2881
|
+
//
|
|
2882
|
+
// The two literals cover the one thing it cannot. The shared table is created by the install with
|
|
2883
|
+
// all of its indexes and outlives every queue row, so it has to stay in scope before the first queue
|
|
2884
|
+
// exists and after the last one is dropped - which is precisely when a drained backlog has left
|
|
2885
|
+
// bloat behind and nothing points at the table any more. Whichever of the two names the install
|
|
2886
|
+
// shape doesn't use simply matches nothing, and on a partitioned install `job` is the parent, whose
|
|
2887
|
+
// indexes are partitioned (relkind 'I') and already excluded by the relkind = 'i' filter.
|
|
2888
|
+
function jobTableScope(schema, tables) {
|
|
2889
|
+
return tables?.length
|
|
2890
|
+
? `t.relname = ANY(${serializeArrayParam(tables)})`
|
|
2891
|
+
: `t.relname IN (SELECT table_name FROM ${schema}.queue UNION SELECT '${BASE_JOB_TABLE}' UNION SELECT '${COMMON_JOB_TABLE}')`;
|
|
2892
|
+
}
|
|
2893
|
+
/**
|
|
2894
|
+
* Bloated job indexes, by the pg_class density heuristic. Deliberately avoids pgstattuple: it is an
|
|
2895
|
+
* extension that may not be installed, and relpages/reltuples separates a bloated index from a
|
|
2896
|
+
* healthy one by three orders of magnitude on their own.
|
|
2897
|
+
*
|
|
2898
|
+
* PostgreSQL-only (including PGlite, where both the bloat and REINDEX CONCURRENTLY behave normally).
|
|
2899
|
+
* Callers must gate on noReindex — see the note in boss.ts #reindex.
|
|
2900
|
+
*
|
|
2901
|
+
* `owned` is returned rather than filtered on, so an installation whose role cannot reindex still
|
|
2902
|
+
* gets told what is bloated. Only leaf indexes (relkind 'i') are candidates — pg-boss creates
|
|
2903
|
+
* i1..i10 directly on each partition, and a partitioned index (relkind 'I') cannot be reindexed
|
|
2904
|
+
* except through its leaves anyway.
|
|
2905
|
+
*
|
|
2906
|
+
* Caveat: relpages/reltuples are refreshed by VACUUM/ANALYZE, so they go stale where autovacuum is
|
|
2907
|
+
* disabled for the table. That is acceptable — the entire failure mode assumes autovacuum runs.
|
|
2908
|
+
*/
|
|
2909
|
+
export function getBloatedIndexes(schema, tables, options) {
|
|
2910
|
+
// These are interpolated into the statement, and supervise()/getReindexCommands() accept them
|
|
2911
|
+
// per call, where the constructor's validation never runs. Reject anything that isn't a finite
|
|
2912
|
+
// number here rather than trusting the caller.
|
|
2913
|
+
const minPages = numericThreshold(options?.minPages, REINDEX_DEFAULTS.minPages, 'minPages');
|
|
2914
|
+
const maxEntriesPerPage = numericThreshold(options?.maxEntriesPerPage, REINDEX_DEFAULTS.maxEntriesPerPage, 'maxEntriesPerPage');
|
|
2915
|
+
const minSizeRatio = numericThreshold(options?.minSizeRatio, REINDEX_DEFAULTS.minSizeRatio, 'minSizeRatio');
|
|
2916
|
+
return `
|
|
2917
|
+
SELECT
|
|
2918
|
+
i.relname as name,
|
|
2919
|
+
t.relname as table,
|
|
2920
|
+
i.relpages as pages,
|
|
2921
|
+
${INDEX_STAT_COLUMNS}
|
|
2922
|
+
pg_has_role(current_user, i.relowner, 'USAGE') as owned
|
|
2923
|
+
FROM pg_class i
|
|
2924
|
+
JOIN pg_index x ON x.indexrelid = i.oid
|
|
2925
|
+
JOIN pg_class t ON t.oid = x.indrelid
|
|
2926
|
+
JOIN pg_namespace n ON n.oid = i.relnamespace
|
|
2927
|
+
${INDEX_WIDTH_JOIN}
|
|
2928
|
+
WHERE n.nspname = '${resolveSchemaName(schema).replace(SINGLE_QUOTE_REGEX, "''")}'
|
|
2929
|
+
AND i.relkind = 'i'
|
|
2930
|
+
AND x.indisvalid
|
|
2931
|
+
AND ${jobTableScope(schema, tables)}
|
|
2932
|
+
AND i.relpages > ${minPages}
|
|
2933
|
+
-- PG 14+ writes -1 rather than 0 for a relation that has never been vacuumed or analyzed
|
|
2934
|
+
-- (commit 3d351d916b2). It would pass both gates below - a negative count is under any
|
|
2935
|
+
-- density, and a negative expected size is under any page count - on stats that mean
|
|
2936
|
+
-- "unknown" rather than "empty".
|
|
2937
|
+
AND i.reltuples >= 0
|
|
2938
|
+
AND i.reltuples / GREATEST(i.relpages, 1) < ${maxEntriesPerPage}
|
|
2939
|
+
AND i.relpages > ${minSizeRatio} * ${EXPECTED_PAGES}
|
|
2940
|
+
ORDER BY pg_relation_size(i.oid) DESC
|
|
2941
|
+
`;
|
|
2942
|
+
}
|
|
2943
|
+
/**
|
|
2944
|
+
* Every owned leaf index on the job tables, ignoring the density gate — the target list for
|
|
2945
|
+
* `{ force: true }`.
|
|
2946
|
+
*/
|
|
2947
|
+
export function getJobIndexes(schema, tables) {
|
|
2948
|
+
return `
|
|
2949
|
+
SELECT
|
|
2950
|
+
i.relname as name,
|
|
2951
|
+
t.relname as table,
|
|
2952
|
+
i.relpages as pages,
|
|
2953
|
+
${INDEX_STAT_COLUMNS}
|
|
2954
|
+
pg_has_role(current_user, i.relowner, 'USAGE') as owned
|
|
2955
|
+
FROM pg_class i
|
|
2956
|
+
JOIN pg_index x ON x.indexrelid = i.oid
|
|
2957
|
+
JOIN pg_class t ON t.oid = x.indrelid
|
|
2958
|
+
JOIN pg_namespace n ON n.oid = i.relnamespace
|
|
2959
|
+
WHERE n.nspname = '${resolveSchemaName(schema).replace(SINGLE_QUOTE_REGEX, "''")}'
|
|
2960
|
+
AND i.relkind = 'i'
|
|
2961
|
+
AND x.indisvalid
|
|
2962
|
+
AND ${jobTableScope(schema, tables)}
|
|
2963
|
+
ORDER BY pg_relation_size(i.oid) DESC
|
|
2964
|
+
`;
|
|
2965
|
+
}
|
|
2966
|
+
/**
|
|
2967
|
+
* Invalid `*_ccnew` stubs left behind by an interrupted REINDEX CONCURRENTLY. Postgres appends
|
|
2968
|
+
* `_ccnew`, then `_ccnew1`, `_ccnew2`, ... on collision. These must be dropped before a retry or
|
|
2969
|
+
* they accumulate, and they are dead weight that vacuum still walks. Mirrors bamHealDrop's role for
|
|
2970
|
+
* interrupted CREATE INDEX CONCURRENTLY.
|
|
2971
|
+
*/
|
|
2972
|
+
export function getReindexLeftovers(schema, tables, noIndexProgressView = false, anyOwner = false) {
|
|
2973
|
+
// A rebuild that is still running looks exactly like a leftover from one that died: its transient
|
|
2974
|
+
// index is invalid until the swap. Nothing in the catalog distinguishes them, so ask whether a
|
|
2975
|
+
// build is actually in flight on that table - the same liveness source bam.ts uses to decide a
|
|
2976
|
+
// claimed CREATE INDEX CONCURRENTLY is dead, and pg_stat_progress_create_index covers REINDEX
|
|
2977
|
+
// CONCURRENTLY too. Without it, a forced pass (which skips the interval claim) could drop the
|
|
2978
|
+
// stub another instance is in the middle of building.
|
|
2979
|
+
//
|
|
2980
|
+
// Best effort by nature: an unprivileged role sees only its own backends in the progress view, and
|
|
2981
|
+
// a backend that skips the view has no liveness to read at all.
|
|
2982
|
+
const liveBuild = noIndexProgressView
|
|
2983
|
+
? ''
|
|
2984
|
+
: 'AND NOT EXISTS (SELECT 1 FROM pg_stat_progress_create_index p WHERE p.relid = x.indrelid)';
|
|
2985
|
+
// The background pass can only drop what it owns, so filtering there saves an error. The command
|
|
2986
|
+
// list is the opposite case - it is handed to an operator who may run it as the owning role, and
|
|
2987
|
+
// it already emits REINDEX for indexes this connection does not own, so withholding the DROP that
|
|
2988
|
+
// has to precede one would hand over a list that fails on the first statement.
|
|
2989
|
+
const owner = anyOwner ? '' : "AND pg_has_role(current_user, i.relowner, 'USAGE')";
|
|
2990
|
+
return `
|
|
2991
|
+
SELECT i.relname as name
|
|
2992
|
+
FROM pg_class i
|
|
2993
|
+
JOIN pg_index x ON x.indexrelid = i.oid
|
|
2994
|
+
JOIN pg_class t ON t.oid = x.indrelid
|
|
2995
|
+
JOIN pg_namespace n ON n.oid = i.relnamespace
|
|
2996
|
+
WHERE n.nspname = '${resolveSchemaName(schema).replace(SINGLE_QUOTE_REGEX, "''")}'
|
|
2997
|
+
AND i.relkind = 'i'
|
|
2998
|
+
AND NOT x.indisvalid
|
|
2999
|
+
AND i.relname ~ '_ccnew[0-9]*$'
|
|
3000
|
+
AND ${jobTableScope(schema, tables)}
|
|
3001
|
+
${owner}
|
|
3002
|
+
${liveBuild}
|
|
3003
|
+
`;
|
|
3004
|
+
}
|
|
3005
|
+
// Index names come from the catalog, so they are raw identifiers that may need quoting (a queue
|
|
3006
|
+
// name can contain anything, and the derived partition/index names inherit it). The schema is
|
|
3007
|
+
// already validated and carries its own quoting - see assertPostgresObjectName.
|
|
3008
|
+
function quoteIdentifier(name) {
|
|
3009
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
3010
|
+
}
|
|
3011
|
+
export function reindexIndex(schema, name) {
|
|
3012
|
+
return `REINDEX INDEX CONCURRENTLY ${schema}.${quoteIdentifier(name)}`;
|
|
3013
|
+
}
|
|
3014
|
+
export function dropIndexConcurrently(schema, name) {
|
|
3015
|
+
return `DROP INDEX CONCURRENTLY IF EXISTS ${schema}.${quoteIdentifier(name)}`;
|
|
3016
|
+
}
|
|
3017
|
+
/**
|
|
3018
|
+
* The statement list an operator runs by hand: every stale stub dropped first, then the rebuilds.
|
|
3019
|
+
*
|
|
3020
|
+
* Stubs are emitted whole rather than paired to the index they came from. Postgres does not append
|
|
3021
|
+
* `_ccnew` — it truncates the *base* so the result fits in 63 bytes, so `j<sha224>_i5` (60 chars)
|
|
3022
|
+
* leaves behind `j<sha224>__ccnew` with the `i5` gone, and a prefix match never fires on a
|
|
3023
|
+
* partitioned queue (every partition table name is `'j' || sha224(queue_name)`, 57 chars). Dropping
|
|
3024
|
+
* them unconditionally is also what the background pass does: an invalid stub is dead weight that
|
|
3025
|
+
* vacuum still walks, whichever index it came from.
|
|
3026
|
+
*/
|
|
3027
|
+
export function buildReindexCommands(schema, targets, leftovers) {
|
|
3028
|
+
if (!targets.length)
|
|
3029
|
+
return [];
|
|
3030
|
+
return [
|
|
3031
|
+
...leftovers.map(({ name }) => dropIndexConcurrently(schema, name)),
|
|
3032
|
+
...targets.map(({ name }) => reindexIndex(schema, name))
|
|
3033
|
+
];
|
|
3034
|
+
}
|
package/dist/schema.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "Generated by scripts/gen-manifest.ts — do not edit by hand. Run `npm run gen:manifest`.",
|
|
3
|
-
"version":
|
|
3
|
+
"version": 39,
|
|
4
4
|
"schemaToken": "{{schema}}",
|
|
5
5
|
"partitioned": {
|
|
6
6
|
"tables": [
|
|
@@ -940,6 +940,13 @@
|
|
|
940
940
|
"notNull": false,
|
|
941
941
|
"default": null
|
|
942
942
|
},
|
|
943
|
+
{
|
|
944
|
+
"table": "version",
|
|
945
|
+
"column": "reindex_on",
|
|
946
|
+
"type": "timestamp with time zone",
|
|
947
|
+
"notNull": false,
|
|
948
|
+
"default": null
|
|
949
|
+
},
|
|
943
950
|
{
|
|
944
951
|
"table": "version",
|
|
945
952
|
"column": "version",
|
|
@@ -1870,6 +1877,13 @@
|
|
|
1870
1877
|
"notNull": false,
|
|
1871
1878
|
"default": null
|
|
1872
1879
|
},
|
|
1880
|
+
{
|
|
1881
|
+
"table": "version",
|
|
1882
|
+
"column": "reindex_on",
|
|
1883
|
+
"type": "timestamp with time zone",
|
|
1884
|
+
"notNull": false,
|
|
1885
|
+
"default": null
|
|
1886
|
+
},
|
|
1873
1887
|
{
|
|
1874
1888
|
"table": "version",
|
|
1875
1889
|
"column": "version",
|
package/dist/types.d.ts
CHANGED
|
@@ -111,6 +111,81 @@ export interface MaintenanceOptions {
|
|
|
111
111
|
queueStatRetentionDays?: number;
|
|
112
112
|
bamIntervalSeconds?: number;
|
|
113
113
|
flowIntervalSeconds?: number;
|
|
114
|
+
/**
|
|
115
|
+
* Rebuild bloated job indexes with `REINDEX INDEX CONCURRENTLY` during maintenance.
|
|
116
|
+
*
|
|
117
|
+
* Autovacuum reclaims heap space but never shrinks a btree, so a job index stays at the size of
|
|
118
|
+
* the largest backlog its queue has ever held. Every later vacuum then walks all of those pages,
|
|
119
|
+
* which is the dominant cost on a drained queue. Rebuilds are gated on a density check, so a
|
|
120
|
+
* healthy installation never runs one.
|
|
121
|
+
*
|
|
122
|
+
* Set `false` to disable rebuilds entirely. Bloat detection and the `index_bloat` warning are
|
|
123
|
+
* unaffected — use `getReindexCommands()` to run the statements yourself.
|
|
124
|
+
* @default true
|
|
125
|
+
*/
|
|
126
|
+
reindex?: boolean | ReindexOptions;
|
|
127
|
+
/**
|
|
128
|
+
* How often the bloat check runs. One instance per interval performs it, coordinated through
|
|
129
|
+
* `version.reindex_on`. Must be >=1 second and cannot exceed 24 hours.
|
|
130
|
+
* @default 86400
|
|
131
|
+
*/
|
|
132
|
+
reindexIntervalSeconds?: number;
|
|
133
|
+
}
|
|
134
|
+
/** Thresholds for the index-bloat density check. */
|
|
135
|
+
export interface IndexBloatOptions {
|
|
136
|
+
/**
|
|
137
|
+
* Ignore indexes smaller than this many 8 kB pages.
|
|
138
|
+
* @default 128
|
|
139
|
+
*/
|
|
140
|
+
minPages?: number;
|
|
141
|
+
/**
|
|
142
|
+
* Live index entries per 8 kB page below which an index is considered bloated.
|
|
143
|
+
* @default 5
|
|
144
|
+
*/
|
|
145
|
+
maxEntriesPerPage?: number;
|
|
146
|
+
/**
|
|
147
|
+
* How many times larger than its live entries need an index must be before it counts as bloated.
|
|
148
|
+
* The size those entries need is estimated from `pg_stats`, so a legitimately sparse index — a
|
|
149
|
+
* long `singletonKey` packs fewer than five entries per page while perfectly packed — is not
|
|
150
|
+
* mistaken for a bloated one.
|
|
151
|
+
* @default 4
|
|
152
|
+
*/
|
|
153
|
+
minSizeRatio?: number;
|
|
154
|
+
}
|
|
155
|
+
export interface ReindexOptions extends IndexBloatOptions {
|
|
156
|
+
/**
|
|
157
|
+
* Rebuild every job index in scope instead of only the bloated ones, and ignore the interval
|
|
158
|
+
* claim so the pass runs immediately.
|
|
159
|
+
* @default false
|
|
160
|
+
*/
|
|
161
|
+
force?: boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Never rebuild an index larger than this many bytes. A large index that still passes the density
|
|
164
|
+
* gate carries a genuinely expensive rebuild, so it is left to an operator.
|
|
165
|
+
* @default 2147483648
|
|
166
|
+
*/
|
|
167
|
+
maxIndexBytes?: number;
|
|
168
|
+
}
|
|
169
|
+
export interface SuperviseOptions {
|
|
170
|
+
/**
|
|
171
|
+
* Overrides the constructor's `reindex` setting for this pass only.
|
|
172
|
+
*/
|
|
173
|
+
reindex?: boolean | ReindexOptions;
|
|
174
|
+
}
|
|
175
|
+
/** A bloated index found by the maintenance density check. */
|
|
176
|
+
export interface IndexBloat {
|
|
177
|
+
/** Index name, unqualified. */
|
|
178
|
+
name: string;
|
|
179
|
+
/** The job table the index belongs to. */
|
|
180
|
+
table: string;
|
|
181
|
+
/** Index size in 8 kB pages. */
|
|
182
|
+
pages: number;
|
|
183
|
+
/** Live index entries, as of the last VACUUM/ANALYZE. */
|
|
184
|
+
entries: number;
|
|
185
|
+
/** Index size on disk. */
|
|
186
|
+
bytes: number;
|
|
187
|
+
/** Whether the connected role can `REINDEX` it. */
|
|
188
|
+
owned: boolean;
|
|
114
189
|
}
|
|
115
190
|
export interface QueueStats {
|
|
116
191
|
name: string;
|
|
@@ -780,7 +855,7 @@ export interface Warning {
|
|
|
780
855
|
message: string;
|
|
781
856
|
data: object;
|
|
782
857
|
}
|
|
783
|
-
export type WarningType = 'slow_query' | 'queue_backlog' | 'clock_skew' | 'listen_notify_unavailable' | 'invalid_schedule';
|
|
858
|
+
export type WarningType = 'slow_query' | 'queue_backlog' | 'clock_skew' | 'listen_notify_unavailable' | 'invalid_schedule' | 'index_bloat';
|
|
784
859
|
export interface PersistedWarning {
|
|
785
860
|
id: number;
|
|
786
861
|
type: WarningType;
|