@balena/pinejs 23.2.8-build-db-layer-maps-b55587f950e0d11ce1bf4d10fbb9b6aa3a032244-1 → 23.2.9-build-renovate-major-24-node-36463d131436a7d9e05445d3c4876f968a036720-1
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/.pinejs-cache.json +1 -1
- package/.versionbot/CHANGELOG.yml +28 -7
- package/CHANGELOG.md +6 -2
- package/VERSION +1 -1
- package/out/database-layer/db.js +11 -12
- package/out/database-layer/db.js.map +1 -1
- package/out/sbvr-api/sbvr-utils.js +3 -3
- package/out/sbvr-api/sbvr-utils.js.map +1 -1
- package/out/tasks/index.js +4 -4
- package/out/tasks/index.js.map +1 -1
- package/out/tasks/worker.d.ts +1 -1
- package/out/tasks/worker.js +9 -9
- package/out/tasks/worker.js.map +1 -1
- package/package.json +3 -3
- package/src/database-layer/db.ts +18 -15
- package/src/sbvr-api/sbvr-utils.ts +5 -3
- package/src/tasks/index.ts +4 -4
- package/src/tasks/worker.ts +9 -12
package/out/tasks/worker.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface TaskHandler<T = AnyObject> {
|
|
|
19
19
|
}
|
|
20
20
|
export declare class Worker {
|
|
21
21
|
private readonly client;
|
|
22
|
-
handlers:
|
|
22
|
+
handlers: Map<string, TaskHandler<AnyObject>>;
|
|
23
23
|
private readonly concurrency;
|
|
24
24
|
private readonly interval;
|
|
25
25
|
private running;
|
package/out/tasks/worker.js
CHANGED
|
@@ -17,7 +17,7 @@ const selectColumns = Object.entries({
|
|
|
17
17
|
.join(', ');
|
|
18
18
|
export class Worker {
|
|
19
19
|
client;
|
|
20
|
-
handlers =
|
|
20
|
+
handlers = new Map();
|
|
21
21
|
concurrency;
|
|
22
22
|
interval;
|
|
23
23
|
running = false;
|
|
@@ -28,12 +28,12 @@ export class Worker {
|
|
|
28
28
|
this.interval = tasksEnv.queueIntervalMS;
|
|
29
29
|
}
|
|
30
30
|
canExecute() {
|
|
31
|
-
return
|
|
31
|
+
return this.executing < this.concurrency && this.handlers.size > 0;
|
|
32
32
|
}
|
|
33
33
|
async execute(task, tx) {
|
|
34
34
|
this.executing++;
|
|
35
35
|
try {
|
|
36
|
-
const handler = this.handlers
|
|
36
|
+
const handler = this.handlers.get(task.is_executed_by__handler);
|
|
37
37
|
const startedOnTime = new Date();
|
|
38
38
|
if (handler == null) {
|
|
39
39
|
await this.update(tx, task, startedOnTime, 'failed', 'Matching task handler not found, this should never happen!');
|
|
@@ -122,8 +122,7 @@ export class Worker {
|
|
|
122
122
|
if (!this.canExecute()) {
|
|
123
123
|
return;
|
|
124
124
|
}
|
|
125
|
-
|
|
126
|
-
if (handlerNames.length === 0) {
|
|
125
|
+
if (this.handlers.size === 0) {
|
|
127
126
|
return;
|
|
128
127
|
}
|
|
129
128
|
await sbvrUtils.db.transaction(async (tx) => {
|
|
@@ -140,7 +139,7 @@ export class Worker {
|
|
|
140
139
|
ORDER BY
|
|
141
140
|
t."is scheduled to execute on-time" ASC,
|
|
142
141
|
t."id" ASC
|
|
143
|
-
LIMIT 1 FOR UPDATE SKIP LOCKED`, [
|
|
142
|
+
LIMIT 1 FOR UPDATE SKIP LOCKED`, [Array.from(this.handlers.keys()), Math.ceil(this.interval / 1000)]);
|
|
144
143
|
if (result.rows.length > 0) {
|
|
145
144
|
await this.execute(result.rows[0], tx);
|
|
146
145
|
executed = true;
|
|
@@ -168,7 +167,6 @@ export class Worker {
|
|
|
168
167
|
if (sbvrUtils.db.engine !== 'postgres') {
|
|
169
168
|
throw new Error('Database does not support tasks, giving up on starting worker');
|
|
170
169
|
}
|
|
171
|
-
const handlerNames = Object.keys(this.handlers);
|
|
172
170
|
const tasksWithUnknownHandlers = await this.client.get({
|
|
173
171
|
resource: 'task',
|
|
174
172
|
passthrough: {
|
|
@@ -177,9 +175,11 @@ export class Worker {
|
|
|
177
175
|
options: {
|
|
178
176
|
$filter: {
|
|
179
177
|
status: 'queued',
|
|
180
|
-
...(
|
|
178
|
+
...(this.handlers.size > 0 && {
|
|
181
179
|
$not: {
|
|
182
|
-
is_executed_by__handler: {
|
|
180
|
+
is_executed_by__handler: {
|
|
181
|
+
$in: Array.from(this.handlers.keys()),
|
|
182
|
+
},
|
|
183
183
|
},
|
|
184
184
|
}),
|
|
185
185
|
},
|
package/out/tasks/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/tasks/worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,WAAW,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAiClC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IACpC,EAAE,EAAE,IAAI;IACR,wBAAwB,EAAE,yBAAyB;IACnD,gCAAgC,EAAE,iCAAiC;IACnE,mCAAmC,EAAE,oCAAoC;IACzE,eAAe,EAAE,eAAe;IAChC,eAAe,EAAE,eAAe;IAChC,qBAAqB,EAAE,sBAAsB;CACA,CAAC;KAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,GAAG,CAAC;KACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAKb,MAAM,OAAO,MAAM;IAOW;IANtB,QAAQ,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/tasks/worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,WAAW,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAiClC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IACpC,EAAE,EAAE,IAAI;IACR,wBAAwB,EAAE,yBAAyB;IACnD,gCAAgC,EAAE,iCAAiC;IACnE,mCAAmC,EAAE,oCAAoC;IACzE,eAAe,EAAE,eAAe;IAChC,eAAe,EAAE,eAAe;IAChC,qBAAqB,EAAE,sBAAsB;CACA,CAAC;KAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,GAAG,CAAC;KACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAKb,MAAM,OAAO,MAAM;IAOW;IANtB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChC,WAAW,CAAS;IACpB,QAAQ,CAAS;IAC1B,OAAO,GAAG,KAAK,CAAC;IAChB,SAAS,GAAG,CAAC,CAAC;IAEtB,YAA6B,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;QAC5D,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC1C,CAAC;IAGO,UAAU;QACjB,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,EAAS;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC;YAEJ,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;YAGjC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,MAAM,CAChB,EAAE,EACF,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,4DAA4D,CAC5D,CAAC;gBACF,OAAO;YACR,CAAC;YAKD,IACC,OAAO,CAAC,QAAQ,IAAI,IAAI;gBACxB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,EACtD,CAAC;gBACF,MAAM,IAAI,CAAC,MAAM,CAChB,EAAE,EACF,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,0BAA0B,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CACnE,CAAC;gBACF,OAAO;YACR,CAAC;YAGD,IAAI,MAAM,GAA2B,QAAQ,CAAC;YAC9C,IAAI,KAAyB,CAAC;YAC9B,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC;oBAChC,GAAG,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;oBACzB,MAAM,EAAE,IAAI,CAAC,+BAA+B,IAAI,EAAE;iBAClD,CAAC,CAAC;gBACH,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBACxB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACV,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAEd,OAAO,CAAC,KAAK,CACZ,0BAA0B,IAAI,CAAC,EAAE,iBAAiB,IAAI,CAAC,uBAAuB,GAAG,EACjF,GAAG,CACH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAGO,KAAK,CAAC,MAAM,CACnB,EAAS,EACT,IAAiB,EACjB,aAAmB,EACnB,MAA8B,EAC9B,YAAqB;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,GAA2B;YACpC,gBAAgB,EAAE,aAAa;YAC/B,cAAc,EAAE,IAAI,IAAI,EAAE;YAC1B,MAAM;YACN,aAAa,EAAE,YAAY;YAC3B,GAAG,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;SAC5D,CAAC;QAIF,IAAI,MAAM,KAAK,QAAQ,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YAGvB,IAAI,CAAC,gCAAgC;gBACpC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QAGD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACvB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE;gBACZ,EAAE;gBACF,GAAG,EAAE,WAAW,CAAC,IAAI;aACrB;YACD,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI;SACJ,CAAC,CAAC;QAIH,IACC,IAAI,CAAC,MAAM,IAAI,IAAI;YACnB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7C,IAAI,CAAC,kCAAkC,IAAI,IAAI,EAC9C,CAAC;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACtB,QAAQ,EAAE,MAAM;gBAChB,WAAW,EAAE;oBACZ,EAAE;oBACF,GAAG,EAAE,WAAW,CAAC,IAAI;iBACrB;gBACD,OAAO,EAAE;oBACR,cAAc,EAAE,KAAK;iBACrB;gBACD,IAAI,EAAE;oBACL,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;oBAC/C,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;oBACrD,+BAA+B,EAAE,IAAI,CAAC,+BAA+B;oBACrE,kCAAkC,EACjC,IAAI,CAAC,kCAAkC;iBACxC;aACD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAGO,kBAAkB,CAAC,OAAe;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IACrC,CAAC;IAIO,IAAI;QACX,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;oBACxB,OAAO;gBACR,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAE9B,OAAO;gBACR,CAAC;gBACD,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CACjC,UAAU,aAAa;;;;;;;;;;;;;qCAaQ,EAC/B,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CACnE,CAAC;oBAGF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC;wBACtD,QAAQ,GAAG,IAAI,CAAC;oBACjB,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBAGhD,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACV,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACb,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;IACN,CAAC;IAEM,IAAI;QACV,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,CAAC;IAGM,KAAK,CAAC,KAAK;QAEjB,IAAI,SAAS,CAAC,EAAE,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACd,+DAA+D,CAC/D,CAAC;QACH,CAAC;QAGD,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACtD,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE;gBACZ,GAAG,EAAE,WAAW,CAAC,IAAI;aACrB;YACD,OAAO,EAAE;gBACR,OAAO,EAAE;oBACR,MAAM,EAAE,QAAQ;oBAChB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI;wBAC7B,IAAI,EAAE;4BACL,uBAAuB,EAAE;gCACxB,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;6BACrC;yBACD;qBACD,CAAC;iBACF;aACD;SACD,CAAC,CAAC;QACH,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACd,sCAAsC,wBAAwB;iBAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,uBAAuB,GAAG,CAAC;iBAC5D,IAAI,CAAC,IAAI,CAAC,EAAE,CACd,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;IACF,CAAC;CACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/pinejs",
|
|
3
|
-
"version": "23.2.
|
|
3
|
+
"version": "23.2.9-build-renovate-major-24-node-36463d131436a7d9e05445d3c4876f968a036720-1",
|
|
4
4
|
"main": "out/server-glue/module.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": "git@github.com:balena-io/pinejs.git",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@types/memoizee": "^0.4.12",
|
|
46
46
|
"@types/method-override": "^3.0.0",
|
|
47
47
|
"@types/mysql": "^2.15.27",
|
|
48
|
-
"@types/node": "^
|
|
48
|
+
"@types/node": "^24.0.0",
|
|
49
49
|
"@types/passport": "^1.0.17",
|
|
50
50
|
"@types/passport-local": "^1.0.38",
|
|
51
51
|
"@types/passport-strategy": "^0.2.38",
|
|
@@ -149,6 +149,6 @@
|
|
|
149
149
|
"recursive": true
|
|
150
150
|
},
|
|
151
151
|
"versionist": {
|
|
152
|
-
"publishedAt": "2025-11-
|
|
152
|
+
"publishedAt": "2025-11-05T15:06:12.051Z"
|
|
153
153
|
}
|
|
154
154
|
}
|
package/src/database-layer/db.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type Mysql from 'mysql';
|
|
3
3
|
import type Pg from 'pg';
|
|
4
4
|
import type PgConnectionString from 'pg-connection-string';
|
|
5
|
-
import type { Resolvable } from '../sbvr-api/common-types.js';
|
|
5
|
+
import type { Dictionary, Resolvable } from '../sbvr-api/common-types.js';
|
|
6
6
|
|
|
7
7
|
import { Engines } from '@balena/abstract-sql-compiler';
|
|
8
8
|
import { EventEmitter } from 'eventemitter3';
|
|
@@ -136,7 +136,7 @@ const validateTransactionLockParameter = (
|
|
|
136
136
|
}
|
|
137
137
|
};
|
|
138
138
|
|
|
139
|
-
const transactionLockNamespaceMap
|
|
139
|
+
const transactionLockNamespaceMap: Dictionary<number> = {};
|
|
140
140
|
|
|
141
141
|
/**
|
|
142
142
|
*
|
|
@@ -150,23 +150,26 @@ export function registerTransactionLockNamespace(
|
|
|
150
150
|
namespaceId: number,
|
|
151
151
|
) {
|
|
152
152
|
validateTransactionLockParameter(namespaceId, 'namespaceId');
|
|
153
|
-
if (transactionLockNamespaceMap
|
|
153
|
+
if (transactionLockNamespaceMap[namespaceKey] != null) {
|
|
154
154
|
throw new Error(
|
|
155
155
|
`Error while registering transaction lock namespace '${namespaceKey}'. Namespace key is already registered.`,
|
|
156
156
|
);
|
|
157
157
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
const existingNamespaceEntry = Object.entries(
|
|
159
|
+
transactionLockNamespaceMap,
|
|
160
|
+
).find(([, id]) => id === namespaceId);
|
|
161
|
+
if (existingNamespaceEntry != null) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
`Error while registering transaction lock namespace '${namespaceKey}'. Transaction lock namespace id '${namespaceId}' already registered for namespace ${existingNamespaceEntry[0]}.`,
|
|
164
|
+
);
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
transactionLockNamespaceMap
|
|
167
|
+
transactionLockNamespaceMap[namespaceKey] = namespaceId;
|
|
167
168
|
}
|
|
168
169
|
|
|
169
|
-
const maybePrepareCache
|
|
170
|
+
const maybePrepareCache: {
|
|
171
|
+
[sqlHash: string]: number;
|
|
172
|
+
} = {};
|
|
170
173
|
const getPreparedName = (sql: Sql): string | undefined => {
|
|
171
174
|
if (env.db.prepareAfterN === false) {
|
|
172
175
|
return;
|
|
@@ -177,12 +180,12 @@ const getPreparedName = (sql: Sql): string | undefined => {
|
|
|
177
180
|
return sqlHash;
|
|
178
181
|
}
|
|
179
182
|
|
|
180
|
-
|
|
181
|
-
if (
|
|
183
|
+
maybePrepareCache[sqlHash] ??= 0;
|
|
184
|
+
if (maybePrepareCache[sqlHash] > env.db.prepareAfterN) {
|
|
182
185
|
return sqlHash;
|
|
183
186
|
}
|
|
184
187
|
// Only increment if we haven't already reached the threshold as we don't care past that point
|
|
185
|
-
maybePrepareCache
|
|
188
|
+
maybePrepareCache[sqlHash]++;
|
|
186
189
|
};
|
|
187
190
|
|
|
188
191
|
const atomicExecuteSql: Database['executeSql'] = async function (
|
|
@@ -709,7 +712,7 @@ if (maybePg != null) {
|
|
|
709
712
|
blocking = true,
|
|
710
713
|
) {
|
|
711
714
|
validateTransactionLockParameter(key, 'key');
|
|
712
|
-
const namespaceId = transactionLockNamespaceMap
|
|
715
|
+
const namespaceId = transactionLockNamespaceMap[namespaceKey];
|
|
713
716
|
if (namespaceId == null) {
|
|
714
717
|
throw new Error(
|
|
715
718
|
`Transaction lock namespace ${namespaceKey} not registered.`,
|
|
@@ -1371,9 +1371,11 @@ const runODataRequest = (req: Express.Request, vocabulary: string) => {
|
|
|
1371
1371
|
});
|
|
1372
1372
|
const { resourceRenames } = models[version];
|
|
1373
1373
|
if (resourceRenames) {
|
|
1374
|
-
const
|
|
1375
|
-
if (
|
|
1376
|
-
$request.resourceName = sqlNameToODataName(
|
|
1374
|
+
const resourceName = resolveSynonym($request);
|
|
1375
|
+
if (resourceRenames[resourceName]) {
|
|
1376
|
+
$request.resourceName = sqlNameToODataName(
|
|
1377
|
+
resourceRenames[resourceName],
|
|
1378
|
+
);
|
|
1377
1379
|
}
|
|
1378
1380
|
}
|
|
1379
1381
|
}
|
package/src/tasks/index.ts
CHANGED
|
@@ -137,7 +137,7 @@ export function setup(): void {
|
|
|
137
137
|
if (handlerName == null) {
|
|
138
138
|
throw new Error(`Must specify a task handler to execute`);
|
|
139
139
|
}
|
|
140
|
-
const handler = worker?.handlers
|
|
140
|
+
const handler = worker?.handlers.get(handlerName);
|
|
141
141
|
if (handler == null) {
|
|
142
142
|
throw new Error(
|
|
143
143
|
`No task handler with name '${handlerName}' registered`,
|
|
@@ -182,12 +182,12 @@ export function addTaskHandler<T extends Schema>(
|
|
|
182
182
|
throw new Error('Database does not support tasks');
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
if (worker.handlers
|
|
185
|
+
if (worker.handlers.has(name)) {
|
|
186
186
|
throw new Error(`Task handler with name '${name}' already registered`);
|
|
187
187
|
}
|
|
188
|
-
worker.handlers
|
|
188
|
+
worker.handlers.set(name, {
|
|
189
189
|
name,
|
|
190
190
|
fn,
|
|
191
191
|
validate: schema != null ? ajv.compile(schema) : undefined,
|
|
192
|
-
};
|
|
192
|
+
});
|
|
193
193
|
}
|
package/src/tasks/worker.ts
CHANGED
|
@@ -55,7 +55,7 @@ const selectColumns = Object.entries({
|
|
|
55
55
|
// It polls the database for tasks to execute. It will execute
|
|
56
56
|
// tasks in parallel up to a certain concurrency limit.
|
|
57
57
|
export class Worker {
|
|
58
|
-
public handlers
|
|
58
|
+
public handlers = new Map<string, TaskHandler>();
|
|
59
59
|
private readonly concurrency: number;
|
|
60
60
|
private readonly interval: number;
|
|
61
61
|
private running = false;
|
|
@@ -68,16 +68,14 @@ export class Worker {
|
|
|
68
68
|
|
|
69
69
|
// Check if instance can execute more tasks
|
|
70
70
|
private canExecute(): boolean {
|
|
71
|
-
return
|
|
72
|
-
this.executing < this.concurrency && Object.keys(this.handlers).length > 0
|
|
73
|
-
);
|
|
71
|
+
return this.executing < this.concurrency && this.handlers.size > 0;
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
private async execute(task: PartialTask, tx: Db.Tx): Promise<void> {
|
|
77
75
|
this.executing++;
|
|
78
76
|
try {
|
|
79
77
|
// Get specified handler
|
|
80
|
-
const handler = this.handlers
|
|
78
|
+
const handler = this.handlers.get(task.is_executed_by__handler);
|
|
81
79
|
const startedOnTime = new Date();
|
|
82
80
|
|
|
83
81
|
// This should never actually happen
|
|
@@ -215,8 +213,7 @@ export class Worker {
|
|
|
215
213
|
if (!this.canExecute()) {
|
|
216
214
|
return;
|
|
217
215
|
}
|
|
218
|
-
|
|
219
|
-
if (handlerNames.length === 0) {
|
|
216
|
+
if (this.handlers.size === 0) {
|
|
220
217
|
// No handlers currently added so just wait for next poll in case one is added in the meantime
|
|
221
218
|
return;
|
|
222
219
|
}
|
|
@@ -236,7 +233,7 @@ export class Worker {
|
|
|
236
233
|
t."is scheduled to execute on-time" ASC,
|
|
237
234
|
t."id" ASC
|
|
238
235
|
LIMIT 1 FOR UPDATE SKIP LOCKED`,
|
|
239
|
-
[
|
|
236
|
+
[Array.from(this.handlers.keys()), Math.ceil(this.interval / 1000)],
|
|
240
237
|
);
|
|
241
238
|
|
|
242
239
|
// Execute task if one was found
|
|
@@ -274,8 +271,6 @@ export class Worker {
|
|
|
274
271
|
);
|
|
275
272
|
}
|
|
276
273
|
|
|
277
|
-
const handlerNames = Object.keys(this.handlers);
|
|
278
|
-
|
|
279
274
|
// Check for any pending tasks with unknown handlers
|
|
280
275
|
const tasksWithUnknownHandlers = await this.client.get({
|
|
281
276
|
resource: 'task',
|
|
@@ -285,9 +280,11 @@ export class Worker {
|
|
|
285
280
|
options: {
|
|
286
281
|
$filter: {
|
|
287
282
|
status: 'queued',
|
|
288
|
-
...(
|
|
283
|
+
...(this.handlers.size > 0 && {
|
|
289
284
|
$not: {
|
|
290
|
-
is_executed_by__handler: {
|
|
285
|
+
is_executed_by__handler: {
|
|
286
|
+
$in: Array.from(this.handlers.keys()),
|
|
287
|
+
},
|
|
291
288
|
},
|
|
292
289
|
}),
|
|
293
290
|
},
|