pg-boss 12.26.4 → 12.28.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 +20 -5
- package/dist/attorney.d.ts +2 -1
- package/dist/attorney.d.ts.map +1 -1
- package/dist/attorney.js +80 -7
- package/dist/cli.js +2 -2
- package/dist/contractor.d.ts +2 -1
- package/dist/contractor.d.ts.map +1 -1
- package/dist/contractor.js +44 -2
- package/dist/drifter.d.ts +2 -0
- package/dist/drifter.d.ts.map +1 -1
- package/dist/drifter.js +53 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +11 -3
- package/dist/migrationStore.d.ts +1 -1
- package/dist/migrationStore.d.ts.map +1 -1
- package/dist/migrationStore.js +187 -11
- package/dist/plans.d.ts +3 -2
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +126 -25
- package/dist/schema.json +14 -2
- package/dist/timekeeper.d.ts +1 -0
- package/dist/timekeeper.d.ts.map +1 -1
- package/dist/timekeeper.js +65 -5
- package/dist/tools.d.ts +32 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +40 -1
- package/dist/types.d.ts +53 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +14 -13
package/dist/migrationStore.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrationStore.d.ts","sourceRoot":"","sources":["../src/migrationStore.ts"],"names":[],"mappings":"
|
|
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,CA6b9F;AAED,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,eAAe,EACf,MAAM,EACN,aAAa,GACd,CAAA"}
|
package/dist/migrationStore.js
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import assert from 'node:assert';
|
|
2
2
|
import * as plans from "./plans.js";
|
|
3
|
+
import { resolveSchemaName } from "./tools.js";
|
|
3
4
|
import * as types from "./types.js";
|
|
5
|
+
// 12.28.0 replaced the plain `string[]` partitionTables shape with { tableName, policy } records.
|
|
6
|
+
// TypeScript callers get a compile error; this keeps JavaScript callers from silently exporting a
|
|
7
|
+
// migration whose target list is wrong (a bare string has no policy, so every policy-scoped build
|
|
8
|
+
// would quietly drop it).
|
|
9
|
+
function assertPartitionMetadata(partitionTables) {
|
|
10
|
+
for (const partition of partitionTables) {
|
|
11
|
+
assert(typeof partition === 'object' && partition !== null &&
|
|
12
|
+
typeof partition.tableName === 'string' && typeof partition.policy === 'string', `partitionTables entries must be { tableName, policy } records, received: ${JSON.stringify(partition)}. The string[] form was removed in 12.28.0.`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
4
15
|
// Mirrors the SQL job_table_format() function (src/plans.ts): rewrites a command targeting
|
|
5
16
|
// the base `job` table to target a specific partition table.
|
|
6
17
|
function formatJobTable(command, table) {
|
|
@@ -16,16 +27,25 @@ function formatJobTable(command, table) {
|
|
|
16
27
|
// via BAM, one statement per target table, each prefixed with a provenance comment. The
|
|
17
28
|
// CONCURRENTLY keyword is preserved (these are emitted after COMMIT), and IF NOT EXISTS is
|
|
18
29
|
// added so the script is safe to re-run.
|
|
19
|
-
function inlineAsyncCommand(schema,
|
|
20
|
-
|
|
21
|
-
|
|
30
|
+
function inlineAsyncCommand(schema, asyncMigration, version, partitionTables) {
|
|
31
|
+
// Two spellings: the legacy string form embeds the whole job_table_run_async() call as SQL, so
|
|
32
|
+
// name/body/table-pin have to be parsed back out of it; the record form carries them as fields.
|
|
33
|
+
const isLegacy = typeof asyncMigration === 'string';
|
|
34
|
+
const asyncCommand = isLegacy ? asyncMigration : asyncMigration.command;
|
|
35
|
+
const nameMatch = isLegacy ? asyncCommand.match(/job_table_run_async\(\s*'([^']+)'/) : null;
|
|
36
|
+
const bodyMatch = isLegacy ? asyncCommand.match(/\$\$([\s\S]*?)\$\$/) : null;
|
|
22
37
|
// An explicit table arg after the $$ body pins the command to a single table (e.g. i8 →
|
|
23
38
|
// job_common); without it the command fans out across job_common + every partition.
|
|
24
|
-
const tableMatch = asyncCommand.match(/\$\$\s*,\s*'([^']+)'/);
|
|
25
|
-
assert(nameMatch && bodyMatch, `Unable to inline async migration command: ${asyncCommand}`);
|
|
26
|
-
const commandName = nameMatch[1];
|
|
27
|
-
const body = bodyMatch[1].trim();
|
|
28
|
-
|
|
39
|
+
const tableMatch = isLegacy ? asyncCommand.match(/\$\$\s*,\s*'([^']+)'/) : null;
|
|
40
|
+
assert(!isLegacy || (nameMatch && bodyMatch), `Unable to inline async migration command: ${asyncCommand}`);
|
|
41
|
+
const commandName = isLegacy ? nameMatch[1] : asyncMigration.name;
|
|
42
|
+
const body = (isLegacy ? bodyMatch[1] : asyncMigration.command).trim();
|
|
43
|
+
// A policy-scoped build only belongs on partitions of that policy; unscoped builds fan out to all.
|
|
44
|
+
const partitionPolicy = isLegacy ? undefined : asyncMigration.partitionPolicy;
|
|
45
|
+
const eligiblePartitions = partitionTables
|
|
46
|
+
.filter(partition => !partitionPolicy || partition.policy === partitionPolicy)
|
|
47
|
+
.map(partition => partition.tableName);
|
|
48
|
+
const targetTables = tableMatch ? [tableMatch[1]] : ['job_common', ...eligiblePartitions];
|
|
29
49
|
return targetTables.map(table => {
|
|
30
50
|
// Add IF NOT EXISTS so the exported script is re-runnable. The negative lookahead keeps it
|
|
31
51
|
// idempotent when the async command already spells out IF NOT EXISTS (the live BAM path needs it
|
|
@@ -35,6 +55,32 @@ function inlineAsyncCommand(schema, asyncCommand, version, partitionTables) {
|
|
|
35
55
|
return `${comment}\n${ddl}`;
|
|
36
56
|
});
|
|
37
57
|
}
|
|
58
|
+
function renderAsyncCommand(schema, asyncMigration, version) {
|
|
59
|
+
if (typeof asyncMigration === 'string') {
|
|
60
|
+
return asyncMigration.replace(/\$VERSION\$/g, String(version));
|
|
61
|
+
}
|
|
62
|
+
const name = asyncMigration.name.replaceAll("'", "''");
|
|
63
|
+
const policy = asyncMigration.partitionPolicy?.replaceAll("'", "''");
|
|
64
|
+
if (!policy) {
|
|
65
|
+
return `SELECT ${schema}.job_table_run_async('${name}', ${version}, $$${asyncMigration.command}$$)`;
|
|
66
|
+
}
|
|
67
|
+
// queue_name is passed alongside table_name so the enqueued rows record which queue each build
|
|
68
|
+
// belongs to, matching what the unscoped fan-out inside job_table_run_async() writes. For a
|
|
69
|
+
// partition row the function re-derives table_name from queue_name and lands on the same value;
|
|
70
|
+
// job_common has no queue of its own, so its row keeps queue NULL like the fan-out does.
|
|
71
|
+
return `SELECT ${schema}.job_table_run_async(
|
|
72
|
+
'${name}',
|
|
73
|
+
${version},
|
|
74
|
+
$$${asyncMigration.command}$$,
|
|
75
|
+
targets.table_name,
|
|
76
|
+
targets.queue_name
|
|
77
|
+
)
|
|
78
|
+
FROM (
|
|
79
|
+
SELECT 'job_common'::text AS table_name, NULL::text AS queue_name
|
|
80
|
+
UNION ALL
|
|
81
|
+
SELECT table_name, name FROM ${schema}.queue WHERE partition = true AND policy = '${policy}'
|
|
82
|
+
) targets`;
|
|
83
|
+
}
|
|
38
84
|
function flatten(schema, commands, version, noAdvisoryLocks) {
|
|
39
85
|
commands.unshift(plans.assertMigration(schema, version));
|
|
40
86
|
commands.push(plans.setVersion(schema, version));
|
|
@@ -44,7 +90,20 @@ function rollback(schema, version, migrations, noAdvisoryLocks) {
|
|
|
44
90
|
migrations = migrations || getAll(schema);
|
|
45
91
|
const result = migrations.find(i => i.version === version);
|
|
46
92
|
assert(result, `Version ${version} not found.`);
|
|
47
|
-
|
|
93
|
+
// Async (BAM) index builds are enqueued as bam rows, and the BAM runner does not filter by schema
|
|
94
|
+
// version — so a row left unfinished by a rollback would rebuild, one version later, the very index
|
|
95
|
+
// the rollback just dropped. Clear this version's unfinished rows as part of the same transaction.
|
|
96
|
+
// Only migrations that enqueue async commands can have any, and the migration that introduced BAM
|
|
97
|
+
// is also the first one with async commands, so bam is guaranteed to exist here; ordering the delete
|
|
98
|
+
// ahead of the migration's own steps keeps it before that migration's DROP TABLE bam.
|
|
99
|
+
//
|
|
100
|
+
// No guard against a build that is genuinely running: the uninstall steps drop the index the build
|
|
101
|
+
// holds a ShareUpdateExclusiveLock on, so a live build already makes the whole rollback fail on the
|
|
102
|
+
// transaction's lock_timeout, taking this delete with it.
|
|
103
|
+
const clearAsync = result.async?.length
|
|
104
|
+
? [`DELETE FROM ${schema}.bam WHERE version = ${result.version} AND status <> 'completed'`]
|
|
105
|
+
: [];
|
|
106
|
+
return flatten(schema, [...clearAsync, ...(result.uninstall || [])], result.previous, noAdvisoryLocks);
|
|
48
107
|
}
|
|
49
108
|
function next(schema, version, migrations, noAdvisoryLocks) {
|
|
50
109
|
migrations = migrations || getAll(schema);
|
|
@@ -70,6 +129,7 @@ function migrateCommands(schema, version, migrations, noAdvisoryLocks, options =
|
|
|
70
129
|
assert(version >= minPrevious, `Cannot migrate pg-boss schema from version ${version}: the oldest supported starting version is ${minPrevious}. ` +
|
|
71
130
|
'Upgrade to a schema at or above that version using an older pg-boss release first.');
|
|
72
131
|
}
|
|
132
|
+
assertPartitionMetadata(options.partitionTables || []);
|
|
73
133
|
const concurrent = [];
|
|
74
134
|
const result = migrations
|
|
75
135
|
.filter(i => i.previous >= version)
|
|
@@ -84,7 +144,7 @@ function migrateCommands(schema, version, migrations, noAdvisoryLocks, options =
|
|
|
84
144
|
}
|
|
85
145
|
}
|
|
86
146
|
else {
|
|
87
|
-
const bamCommands = migration.async.map(cmd =>
|
|
147
|
+
const bamCommands = migration.async.map(cmd => renderAsyncCommand(schema, cmd, migration.version));
|
|
88
148
|
acc.install = acc.install.concat(bamCommands);
|
|
89
149
|
}
|
|
90
150
|
}
|
|
@@ -674,6 +734,93 @@ const createQueueFn = {
|
|
|
674
734
|
END;
|
|
675
735
|
$$
|
|
676
736
|
LANGUAGE plpgsql;
|
|
737
|
+
`,
|
|
738
|
+
38: (schema) => `
|
|
739
|
+
CREATE OR REPLACE FUNCTION ${schema}.create_queue(queue_name text, options jsonb)
|
|
740
|
+
RETURNS VOID AS
|
|
741
|
+
$$
|
|
742
|
+
DECLARE
|
|
743
|
+
tablename varchar := CASE WHEN options->>'partition' = 'true'
|
|
744
|
+
THEN 'j' || encode(sha224(queue_name::bytea), 'hex')
|
|
745
|
+
ELSE 'job_common'
|
|
746
|
+
END;
|
|
747
|
+
queue_created_on timestamptz;
|
|
748
|
+
BEGIN
|
|
749
|
+
|
|
750
|
+
WITH q as (
|
|
751
|
+
INSERT INTO ${schema}.queue (
|
|
752
|
+
name,
|
|
753
|
+
policy,
|
|
754
|
+
retry_limit,
|
|
755
|
+
retry_delay,
|
|
756
|
+
retry_backoff,
|
|
757
|
+
retry_delay_max,
|
|
758
|
+
expire_seconds,
|
|
759
|
+
retention_seconds,
|
|
760
|
+
deletion_seconds,
|
|
761
|
+
warning_queued,
|
|
762
|
+
dead_letter,
|
|
763
|
+
partition,
|
|
764
|
+
table_name,
|
|
765
|
+
heartbeat_seconds,
|
|
766
|
+
notify
|
|
767
|
+
)
|
|
768
|
+
VALUES (
|
|
769
|
+
queue_name,
|
|
770
|
+
options->>'policy',
|
|
771
|
+
COALESCE((options->>'retryLimit')::int, 2),
|
|
772
|
+
COALESCE((options->>'retryDelay')::int, 0),
|
|
773
|
+
COALESCE((options->>'retryBackoff')::bool, false),
|
|
774
|
+
(options->>'retryDelayMax')::int,
|
|
775
|
+
COALESCE((options->>'expireInSeconds')::int, 900),
|
|
776
|
+
COALESCE((options->>'retentionSeconds')::int, 1209600),
|
|
777
|
+
COALESCE((options->>'deleteAfterSeconds')::int, 604800),
|
|
778
|
+
COALESCE((options->>'warningQueueSize')::int, 0),
|
|
779
|
+
options->>'deadLetter',
|
|
780
|
+
COALESCE((options->>'partition')::bool, false),
|
|
781
|
+
tablename,
|
|
782
|
+
(options->>'heartbeatSeconds')::int,
|
|
783
|
+
COALESCE((options->>'notify')::bool, false)
|
|
784
|
+
)
|
|
785
|
+
ON CONFLICT DO NOTHING
|
|
786
|
+
RETURNING created_on
|
|
787
|
+
)
|
|
788
|
+
SELECT created_on into queue_created_on from q;
|
|
789
|
+
|
|
790
|
+
IF queue_created_on IS NULL OR options->>'partition' IS DISTINCT FROM 'true' THEN
|
|
791
|
+
RETURN;
|
|
792
|
+
END IF;
|
|
793
|
+
|
|
794
|
+
EXECUTE format('CREATE TABLE ${schema}.%I (LIKE ${schema}.job INCLUDING DEFAULTS)', tablename);
|
|
795
|
+
|
|
796
|
+
EXECUTE ${schema}.job_table_format($cmd$ALTER TABLE ${schema}.job ADD PRIMARY KEY (name, id)$cmd$, tablename);
|
|
797
|
+
EXECUTE ${schema}.job_table_format($cmd$ALTER TABLE ${schema}.job ADD CONSTRAINT q_fkey FOREIGN KEY (name) REFERENCES ${schema}.queue (name) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED$cmd$, tablename);
|
|
798
|
+
EXECUTE ${schema}.job_table_format($cmd$ALTER TABLE ${schema}.job ADD CONSTRAINT dlq_fkey FOREIGN KEY (dead_letter) REFERENCES ${schema}.queue (name) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED$cmd$, tablename);
|
|
799
|
+
|
|
800
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE INDEX job_i5 ON ${schema}.job (name, start_after) WHERE state < 'active' AND NOT blocked$cmd$, tablename);
|
|
801
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i4 ON ${schema}.job (name, singleton_on, COALESCE(singleton_key, '')) WHERE state <> 'cancelled' AND singleton_on IS NOT NULL$cmd$, tablename);
|
|
802
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE INDEX job_i7 ON ${schema}.job (name, group_id) WHERE state = 'active' AND group_id IS NOT NULL$cmd$, tablename);
|
|
803
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE INDEX job_i9 ON ${schema}.job (name, id) WHERE blocking AND state = 'completed'$cmd$, tablename);
|
|
804
|
+
|
|
805
|
+
IF options->>'policy' = 'short' THEN
|
|
806
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i1 ON ${schema}.job (name, COALESCE(singleton_key, '')) WHERE state = 'created' AND policy = 'short'$cmd$, tablename);
|
|
807
|
+
ELSIF options->>'policy' = 'singleton' THEN
|
|
808
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i2 ON ${schema}.job (name, COALESCE(singleton_key, '')) WHERE state = 'active' AND policy = 'singleton'$cmd$, tablename);
|
|
809
|
+
ELSIF options->>'policy' = 'stately' THEN
|
|
810
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i3 ON ${schema}.job (name, state, COALESCE(singleton_key, '')) WHERE state <= 'active' AND policy = 'stately'$cmd$, tablename);
|
|
811
|
+
ELSIF options->>'policy' = 'exclusive' THEN
|
|
812
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i6 ON ${schema}.job (name, COALESCE(singleton_key, '')) WHERE state <= 'active' AND policy = 'exclusive'$cmd$, tablename);
|
|
813
|
+
ELSIF options->>'policy' = 'key_strict_fifo' THEN
|
|
814
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE UNIQUE INDEX job_i8 ON ${schema}.job (name, singleton_key) WHERE state IN ('active', 'retry', 'failed') AND policy = 'key_strict_fifo'$cmd$, tablename);
|
|
815
|
+
EXECUTE ${schema}.job_table_format($cmd$CREATE INDEX job_i10 ON ${schema}.job (name, singleton_key, state DESC, created_on, id) INCLUDE (start_after) WHERE state < 'active' AND NOT blocked AND policy = 'key_strict_fifo'$cmd$, tablename);
|
|
816
|
+
EXECUTE ${schema}.job_table_format($cmd$ALTER TABLE ${schema}.job ADD CONSTRAINT job_key_strict_fifo_singleton_key_check CHECK (NOT (policy = 'key_strict_fifo' AND singleton_key IS NULL))$cmd$, tablename);
|
|
817
|
+
END IF;
|
|
818
|
+
|
|
819
|
+
EXECUTE format('ALTER TABLE ${schema}.%I ADD CONSTRAINT cjc CHECK (name=%L)', tablename, queue_name);
|
|
820
|
+
EXECUTE format('ALTER TABLE ${schema}.job ATTACH PARTITION ${schema}.%I FOR VALUES IN (%L)', tablename, queue_name);
|
|
821
|
+
END;
|
|
822
|
+
$$
|
|
823
|
+
LANGUAGE plpgsql;
|
|
677
824
|
`
|
|
678
825
|
};
|
|
679
826
|
// Frozen per-version snapshots of the queue_stats DDL, version-keyed like createQueueFn above. A
|
|
@@ -721,6 +868,10 @@ const createIndexQueueStatsFn = {
|
|
|
721
868
|
: `CREATE INDEX queue_stats_i1 ON ${schema}.queue_stats ${cols} ${include}`;
|
|
722
869
|
}
|
|
723
870
|
};
|
|
871
|
+
// The nspname comparison needs the resolved catalog name, same as plans.ensureQueueStatsPartitions.
|
|
872
|
+
// This does change the SQL a frozen migration emits, but only for names the check could never have
|
|
873
|
+
// matched anyway (quoted, or bare mixed-case), and only from "silently creates a partition it
|
|
874
|
+
// already believes is missing" to "checks correctly".
|
|
724
875
|
const ensureQueueStatsPartitionsFn = {
|
|
725
876
|
35: (schema) => `
|
|
726
877
|
DO $$
|
|
@@ -735,7 +886,7 @@ const ensureQueueStatsPartitionsFn = {
|
|
|
735
886
|
IF NOT EXISTS (
|
|
736
887
|
SELECT 1 FROM pg_class c
|
|
737
888
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
738
|
-
WHERE n.nspname = '${schema}' AND c.relname = part_name
|
|
889
|
+
WHERE n.nspname = '${resolveSchemaName(schema)}' AND c.relname = part_name
|
|
739
890
|
) THEN
|
|
740
891
|
EXECUTE format(
|
|
741
892
|
'CREATE TABLE ${schema}.%I PARTITION OF ${schema}.queue_stats FOR VALUES FROM (%L) TO (%L)',
|
|
@@ -1206,6 +1357,31 @@ function getAll(schema, noPartitioning = false, noCovering = false) {
|
|
|
1206
1357
|
uninstall: noPartitioning
|
|
1207
1358
|
? []
|
|
1208
1359
|
: [jobTableFormatFn[36](schema)]
|
|
1360
|
+
},
|
|
1361
|
+
{
|
|
1362
|
+
release: '12.28.0',
|
|
1363
|
+
version: 38,
|
|
1364
|
+
previous: 37,
|
|
1365
|
+
install: noPartitioning
|
|
1366
|
+
// noCovering backends (CockroachDB) have no INCLUDE, so they get the narrow index. The
|
|
1367
|
+
// partitioned path is PostgreSQL-only and always covering.
|
|
1368
|
+
? [`CREATE INDEX job_i10 ON ${schema}.job (name, singleton_key, state DESC, created_on, id)${noCovering ? '' : ' INCLUDE (start_after)'} WHERE state < 'active' AND NOT blocked AND policy = 'key_strict_fifo'`]
|
|
1369
|
+
: [createQueueFn[38](schema)],
|
|
1370
|
+
async: noPartitioning
|
|
1371
|
+
? []
|
|
1372
|
+
: [
|
|
1373
|
+
{
|
|
1374
|
+
name: 'key_strict_fifo_head_index',
|
|
1375
|
+
partitionPolicy: 'key_strict_fifo',
|
|
1376
|
+
command: `CREATE INDEX CONCURRENTLY IF NOT EXISTS job_i10 ON ${schema}.job (name, singleton_key, state DESC, created_on, id) INCLUDE (start_after) WHERE state < 'active' AND NOT blocked AND policy = 'key_strict_fifo'`
|
|
1377
|
+
}
|
|
1378
|
+
],
|
|
1379
|
+
uninstall: noPartitioning
|
|
1380
|
+
? [`DROP INDEX IF EXISTS ${schema}.job_i10`]
|
|
1381
|
+
: [
|
|
1382
|
+
createQueueFn[33](schema),
|
|
1383
|
+
`SELECT ${schema}.job_table_run($cmd$DROP INDEX IF EXISTS ${schema}.job_i10$cmd$)`
|
|
1384
|
+
]
|
|
1209
1385
|
}
|
|
1210
1386
|
];
|
|
1211
1387
|
}
|
package/dist/plans.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { JobMatchStrategy,
|
|
1
|
+
import type { JobMatchStrategy, ManagedIndex, ManagedFunction } from './types.ts';
|
|
2
2
|
import type { ExpectedColumns, ExpectedConstraints } from './drifter.ts';
|
|
3
3
|
export interface SqlQuery {
|
|
4
4
|
text: string;
|
|
@@ -50,7 +50,7 @@ export declare function trySetQueueDeletionTime(schema: string, queues: string[]
|
|
|
50
50
|
export declare function trySetCronTime(schema: string, seconds: number): string;
|
|
51
51
|
export declare function trySetBamTime(schema: string, seconds: number): string;
|
|
52
52
|
export declare function trySetFlowTime(schema: string, seconds: number): string;
|
|
53
|
-
export declare function updateQueue(schema: string
|
|
53
|
+
export declare function updateQueue(schema: string): string;
|
|
54
54
|
export declare function getQueues(schema: string, names?: string[]): SqlQuery;
|
|
55
55
|
export declare function deleteJobsById(schema: string, table: string): string;
|
|
56
56
|
export declare function deleteQueuedJobs(schema: string, table: string): string;
|
|
@@ -82,6 +82,7 @@ export declare function getQueueStatsHistoryBucketed(schema: string, aggregate:
|
|
|
82
82
|
export declare function getVersion(schema: string): string;
|
|
83
83
|
export declare function setVersion(schema: string, version: number): string;
|
|
84
84
|
export declare function versionTableExists(schema: string): string;
|
|
85
|
+
export declare function getSchemaCaseVariants(schema: string): string;
|
|
85
86
|
export declare function getPartitionedQueueTables(schema: string): string;
|
|
86
87
|
export declare function insertVersion(schema: string, version: number): string;
|
|
87
88
|
interface GroupConcurrencyConfig {
|
package/dist/plans.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"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"}
|