prostgles-server 4.2.76 → 4.2.78
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/dist/PubSubManager/getInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getInitQuery.js +1 -3
- package/dist/PubSubManager/getInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +105 -113
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.d.ts.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js +1 -10
- package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
- package/lib/PubSubManager/getInitQuery.ts +1 -3
- package/lib/PubSubManager/initPubSubManager.ts +114 -115
- package/lib/PubSubManager/orphanTriggerCheck.ts +2 -12
- package/package.json +1 -1
- package/tests/server/package-lock.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpF,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpF,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,CA0kB9E,CAAA"}
|
|
@@ -327,7 +327,6 @@ BEGIN
|
|
|
327
327
|
|
|
328
328
|
END;
|
|
329
329
|
|
|
330
|
-
--COMMIT;
|
|
331
330
|
$$ LANGUAGE plpgsql;
|
|
332
331
|
COMMENT ON FUNCTION ${exports.DB_OBJ_NAMES.data_watch_func} IS 'Prostgles internal function used to notify when data in the table changed';
|
|
333
332
|
|
|
@@ -382,8 +381,7 @@ BEGIN
|
|
|
382
381
|
FOREACH op IN ARRAY operations
|
|
383
382
|
LOOP
|
|
384
383
|
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
385
|
-
|
|
386
|
-
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
384
|
+
|
|
387
385
|
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
388
386
|
END LOOP;
|
|
389
387
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":";;;AACA,mDAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClD,6DAAwD;AAE3C,QAAA,YAAY,GAAG;IAC1B,uBAAuB,EAAE,mCAAmC;IAC5D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,6BAA6B;IAChD,oBAAoB,EAAE,oCAAoC;CAClD,CAAC;AAEJ,MAAM,YAAY,GAAG,KAAK;IAE/B,MAAM,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAmB,EAAE;QAC9D,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,WAAW,CAAA,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,8BAA8B,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElI,OAAO;;;;;;;IAOP,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEA+BkB,IAAA,uBAAO,EAAC,OAAO,CAAC;yEACb,IAAA,uBAAO,EAAC,OAAO,CAAC;+BAC1D,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BjC,IAAA,uBAAO,EAAC,OAAO,CAAC,KAAK,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAsGpB,oBAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA+GjC,IAAA,uBAAO,EAAC,6BAAa,CAAC,OAAO,CAAC;;kCAE5B,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;;kCAEhC,IAAA,uBAAO,EAAC,0BAAU,CAAC,IAAI,CAAC;;;;;;;kCAOxB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;kBAgB/H,IAAA,qCAAgB,GAAE
|
|
1
|
+
{"version":3,"file":"getInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":";;;AACA,mDAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClD,6DAAwD;AAE3C,QAAA,YAAY,GAAG;IAC1B,uBAAuB,EAAE,mCAAmC;IAC5D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,6BAA6B;IAChD,oBAAoB,EAAE,oCAAoC;CAClD,CAAC;AAEJ,MAAM,YAAY,GAAG,KAAK;IAE/B,MAAM,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAmB,EAAE;QAC9D,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,WAAW,CAAA,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,8BAA8B,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElI,OAAO;;;;;;;IAOP,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEA+BkB,IAAA,uBAAO,EAAC,OAAO,CAAC;yEACb,IAAA,uBAAO,EAAC,OAAO,CAAC;+BAC1D,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BjC,IAAA,uBAAO,EAAC,OAAO,CAAC,KAAK,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAsGpB,oBAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA+GjC,IAAA,uBAAO,EAAC,6BAAa,CAAC,OAAO,CAAC;;kCAE5B,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;;kCAEhC,IAAA,uBAAO,EAAC,0BAAU,CAAC,IAAI,CAAC;;;;;;;kCAOxB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;kBAgB/H,IAAA,qCAAgB,GAAE;;;;;;;8BAON,oBAAY,CAAC,eAAe;;qCAErB,oBAAY,CAAC,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yEA+GA,oBAAY,CAAC,eAAe;;;;;;;;;;yEAU5B,oBAAY,CAAC,eAAe;;;;;;;;;;yEAU5B,oBAAY,CAAC,eAAe;;;;;;;;;;;;;;;yCAe3D,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;;;;;;;;wBAqBlE,IAAA,uBAAO,EAAC,6BAAa,CAAC,OAAO,CAAC;;0BAE5B,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;0BAChC,IAAA,uBAAO,EAAC,0BAAU,CAAC,mBAAmB,CAAC;;;;qCAI5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,4BAA4B;;;;;;;;;;;8BAW7G,oBAAY,CAAC,uBAAuB;;;;;;+CAMnB,oBAAY,CAAC,uBAAuB;;;;;;+CAMpC,oBAAY,CAAC,uBAAuB;;;qCAG9C,oBAAY,CAAC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;mDA2BhB,6BAAa,CAAC,kCAAkC;;;0BAGzE,IAAA,uBAAO,EAAC,6BAAa,CAAC,OAAO,CAAC;;4BAE5B,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;4BAChC,IAAA,uBAAO,EAAC,0BAAU,CAAC,MAAM,CAAC;;;4BAG1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,4BAA4B;;;;;sBAK5F,IAAA,qCAAgB,GAAE;;;;;;8BAMV,oBAAY,CAAC,iBAAiB;;;;;;;;;;;;CAY3D,CAAA;IAAA,CAAC,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IAEvB,OAAO,GAAG,CAAC;AACb,CAAC,CAAA;AA1kBY,QAAA,YAAY,gBA0kBxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,aAAa,EAAW,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,4BAA4B,oEAA8E,CAAC;AAExH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAyK/F"}
|
|
@@ -4,12 +4,11 @@ exports.initPubSubManager = exports.REALTIME_TRIGGER_CHECK_QUERY = void 0;
|
|
|
4
4
|
const PostgresNotifListenManager_1 = require("../PostgresNotifListenManager");
|
|
5
5
|
const getWatchSchemaTagList_1 = require("../SchemaWatch/getWatchSchemaTagList");
|
|
6
6
|
const PubSubManager_1 = require("./PubSubManager");
|
|
7
|
-
exports.REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers";
|
|
8
7
|
const getInitQuery_1 = require("./getInitQuery");
|
|
8
|
+
exports.REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers";
|
|
9
9
|
async function initPubSubManager() {
|
|
10
10
|
if (!this.getIsDestroyed())
|
|
11
11
|
return undefined;
|
|
12
|
-
let tries = 5;
|
|
13
12
|
try {
|
|
14
13
|
const initQuery = await getInitQuery_1.getInitQuery.bind(this)();
|
|
15
14
|
await this.db.any(initQuery);
|
|
@@ -35,117 +34,110 @@ async function initPubSubManager() {
|
|
|
35
34
|
DELETE FROM prostgles.app_triggers
|
|
36
35
|
WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appId)}
|
|
37
36
|
`);
|
|
38
|
-
console.log("REMOVE app check disabled");
|
|
39
|
-
if (!this.appCheck && Math.random() > 12) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
clearInterval(this.appCheck);
|
|
143
|
-
}
|
|
144
|
-
console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
145
|
-
}
|
|
146
|
-
this.appChecking = false;
|
|
147
|
-
}, 0.8 * this.appCheckFrequencyMS);
|
|
148
|
-
}
|
|
37
|
+
// console.log("REMOVE app check disabled");
|
|
38
|
+
// if (!this.appCheck && Math.random() > 12) {
|
|
39
|
+
// this.appCheck = setInterval(async () => {
|
|
40
|
+
// let checkForStaleTriggers = "";
|
|
41
|
+
// try {
|
|
42
|
+
// this.appChecking = true;
|
|
43
|
+
// const listeners = this.getActiveListeners();
|
|
44
|
+
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
45
|
+
// UPDATE prostgles.app_triggers
|
|
46
|
+
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
47
|
+
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
48
|
+
// ) THEN NOW() ELSE last_used END
|
|
49
|
+
// WHERE app_id = ${asValue(this.appId)};
|
|
50
|
+
// `;
|
|
51
|
+
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
52
|
+
// let dataTriggerCheckQuery = "";
|
|
53
|
+
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
54
|
+
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
55
|
+
// dataTriggerCheckQuery = `
|
|
56
|
+
// /* Delete unused triggers. Might deadlock */
|
|
57
|
+
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
58
|
+
// THEN
|
|
59
|
+
// /* TODO: Fixed deadlocks */
|
|
60
|
+
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
61
|
+
// /* UPDATE currently used triggers */
|
|
62
|
+
// ${updateCurrentlyUsedTriggersQuery}
|
|
63
|
+
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
64
|
+
// DELETE FROM prostgles.app_triggers
|
|
65
|
+
// WHERE app_id = ${asValue(this.appId)}
|
|
66
|
+
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
67
|
+
// */
|
|
68
|
+
// END IF;
|
|
69
|
+
// `
|
|
70
|
+
// }
|
|
71
|
+
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
72
|
+
// checkForStaleTriggers = `
|
|
73
|
+
// DO $$
|
|
74
|
+
// BEGIN
|
|
75
|
+
// /*
|
|
76
|
+
// ${queryIdentifier}
|
|
77
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
78
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
79
|
+
// */
|
|
80
|
+
// /* prostgles schema must exist */
|
|
81
|
+
// IF
|
|
82
|
+
// EXISTS (
|
|
83
|
+
// SELECT 1
|
|
84
|
+
// FROM information_schema.tables
|
|
85
|
+
// WHERE table_schema = 'prostgles'
|
|
86
|
+
// AND table_name = 'apps'
|
|
87
|
+
// )
|
|
88
|
+
// THEN
|
|
89
|
+
// /* Last check used to remove disconnected apps */
|
|
90
|
+
// UPDATE prostgles.apps
|
|
91
|
+
// SET last_check = NOW()
|
|
92
|
+
// WHERE id = ${asValue(this.appId)};
|
|
93
|
+
// ${dataTriggerCheckQuery}
|
|
94
|
+
// END IF;
|
|
95
|
+
// END $$;`
|
|
96
|
+
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
97
|
+
// const timeout = setTimeout(() => {
|
|
98
|
+
// this.db.any(`
|
|
99
|
+
// /*
|
|
100
|
+
// ${queryIdentifier}
|
|
101
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
102
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
103
|
+
// */
|
|
104
|
+
// DO $$
|
|
105
|
+
// BEGIN
|
|
106
|
+
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
107
|
+
// PERFORM pg_cancel_backend(pid)
|
|
108
|
+
// FROM pg_catalog.pg_stat_activity
|
|
109
|
+
// WHERE pid <> pg_backend_pid()
|
|
110
|
+
// AND query = \${queryIdentifier};
|
|
111
|
+
// END $$;
|
|
112
|
+
// `, { queryTimeoutMillis, queryIdentifier })
|
|
113
|
+
// }, queryTimeoutMillis);
|
|
114
|
+
// await this.db.any(checkForStaleTriggers);
|
|
115
|
+
// clearTimeout(timeout);
|
|
116
|
+
// tries = 5;
|
|
117
|
+
// log("updated last_check");
|
|
118
|
+
// } catch (e: any) {
|
|
119
|
+
// tries --;
|
|
120
|
+
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
121
|
+
// this.db.any(
|
|
122
|
+
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
123
|
+
// WHERE query ilike ${qid} \
|
|
124
|
+
// AND pid <> pg_backend_pid();",
|
|
125
|
+
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
126
|
+
// );
|
|
127
|
+
// /** If no tries left
|
|
128
|
+
// * OR
|
|
129
|
+
// * If this database was dropped
|
|
130
|
+
// *
|
|
131
|
+
// * then stop interval
|
|
132
|
+
// * */
|
|
133
|
+
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
134
|
+
// clearInterval(this.appCheck);
|
|
135
|
+
// }
|
|
136
|
+
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
137
|
+
// }
|
|
138
|
+
// this.appChecking = false;
|
|
139
|
+
// }, 0.8 * this.appCheckFrequencyMS);
|
|
140
|
+
// }
|
|
149
141
|
}
|
|
150
142
|
this.postgresNotifListenManager = new PostgresNotifListenManager_1.PostgresNotifListenManager(this.db, this.notifListener, PubSubManager_1.NOTIF_CHANNEL.getFull(this.appId));
|
|
151
143
|
await this.initialiseEventTriggers();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":";;;AAAA,8EAA2E;AAC3E,gFAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orphanTriggerCheck.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/orphanTriggerCheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orphanTriggerCheck.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/orphanTriggerCheck.ts"],"names":[],"mappings":"AAoBA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,cA6C5B,CAAC"}
|
|
@@ -18,7 +18,6 @@ const connectedApplicationNamesQuery = `
|
|
|
18
18
|
WHERE pid = pg_backend_pid()
|
|
19
19
|
)
|
|
20
20
|
`;
|
|
21
|
-
const LAST_CHECKED_SETTING_NAME = 'prostgles.last_checked';
|
|
22
21
|
/** It is a function to prevent undefined EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID */
|
|
23
22
|
const getAppCheckQuery = () => `
|
|
24
23
|
/*
|
|
@@ -34,11 +33,6 @@ const getAppCheckQuery = () => `
|
|
|
34
33
|
WHERE table_schema = 'prostgles'
|
|
35
34
|
AND table_name = 'apps'
|
|
36
35
|
)
|
|
37
|
-
/* Ensure we don't check too often */
|
|
38
|
-
AND (
|
|
39
|
-
NULLIF(current_setting('${LAST_CHECKED_SETTING_NAME}', true), '') IS NULL
|
|
40
|
-
OR current_setting('${LAST_CHECKED_SETTING_NAME}', true)::timestamp < NOW() - INTERVAL '1 minute'
|
|
41
|
-
)
|
|
42
36
|
/* Ensure we don't check in paralel */
|
|
43
37
|
AND NOT EXISTS (
|
|
44
38
|
SELECT 1
|
|
@@ -46,10 +40,7 @@ const getAppCheckQuery = () => `
|
|
|
46
40
|
WHERE s.query ilike '%${queryIdentifier}%'
|
|
47
41
|
AND s.state = 'active'
|
|
48
42
|
)
|
|
49
|
-
THEN
|
|
50
|
-
EXECUTE format('SET LOCAL ${LAST_CHECKED_SETTING_NAME} TO %L', now());
|
|
51
|
-
--USED FOR DEBUG REMOVE
|
|
52
|
-
PERFORM pg_notify('prostgles', current_setting('${LAST_CHECKED_SETTING_NAME}', true));
|
|
43
|
+
THEN
|
|
53
44
|
|
|
54
45
|
IF EXISTS (
|
|
55
46
|
${connectedApplicationNamesQuery}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orphanTriggerCheck.js","sourceRoot":"","sources":["../../lib/PubSubManager/orphanTriggerCheck.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAChD,2DAAmE;AAEnE;;;;GAIG;AAEH,MAAM,eAAe,GAAG,sFAAsF,CAAC;AAC/G,MAAM,8BAA8B,GAAG;;;;;;;;CAQtC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"orphanTriggerCheck.js","sourceRoot":"","sources":["../../lib/PubSubManager/orphanTriggerCheck.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAChD,2DAAmE;AAEnE;;;;GAIG;AAEH,MAAM,eAAe,GAAG,sFAAsF,CAAC;AAC/G,MAAM,8BAA8B,GAAG;;;;;;;;CAQtC,CAAC;AAEF,+EAA+E;AACxE,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC;;MAEhC,eAAe;MACf,gDAA4B;MAC5B,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;8BAcxB,eAAe;;;;;;QAMrC,8BAA8B;;;;;;;;;;;;;;;;;;;;;CAqBrC,CAAC;AA7CW,QAAA,gBAAgB,oBA6C3B"}
|
|
@@ -329,7 +329,6 @@ BEGIN
|
|
|
329
329
|
|
|
330
330
|
END;
|
|
331
331
|
|
|
332
|
-
--COMMIT;
|
|
333
332
|
$$ LANGUAGE plpgsql;
|
|
334
333
|
COMMENT ON FUNCTION ${DB_OBJ_NAMES.data_watch_func} IS 'Prostgles internal function used to notify when data in the table changed';
|
|
335
334
|
|
|
@@ -384,8 +383,7 @@ BEGIN
|
|
|
384
383
|
FOREACH op IN ARRAY operations
|
|
385
384
|
LOOP
|
|
386
385
|
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
387
|
-
|
|
388
|
-
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
386
|
+
|
|
389
387
|
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
390
388
|
END LOOP;
|
|
391
389
|
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { PostgresNotifListenManager } from "../PostgresNotifListenManager";
|
|
2
2
|
import { getWatchSchemaTagList } from "../SchemaWatch/getWatchSchemaTagList";
|
|
3
|
-
import {
|
|
4
|
-
export const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers" as const;
|
|
3
|
+
import { NOTIF_CHANNEL, PubSubManager, asValue } from "./PubSubManager";
|
|
5
4
|
import { getInitQuery } from "./getInitQuery";
|
|
5
|
+
export const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers" as const;
|
|
6
6
|
|
|
7
7
|
export async function initPubSubManager(this: PubSubManager): Promise<PubSubManager | undefined> {
|
|
8
8
|
if (!this.getIsDestroyed()) return undefined;
|
|
9
9
|
|
|
10
|
-
let tries = 5;
|
|
11
10
|
try {
|
|
12
11
|
|
|
13
12
|
const initQuery = await getInitQuery.bind(this)()
|
|
@@ -40,129 +39,129 @@ export async function initPubSubManager(this: PubSubManager): Promise<PubSubMana
|
|
|
40
39
|
WHERE app_id = ${asValue(this.appId)}
|
|
41
40
|
`);
|
|
42
41
|
|
|
43
|
-
console.log("REMOVE app check disabled");
|
|
44
|
-
if (!this.appCheck && Math.random() > 12) {
|
|
42
|
+
// console.log("REMOVE app check disabled");
|
|
43
|
+
// if (!this.appCheck && Math.random() > 12) {
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
// this.appCheck = setInterval(async () => {
|
|
46
|
+
// let checkForStaleTriggers = "";
|
|
47
|
+
// try {
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
// this.appChecking = true;
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
51
|
+
// const listeners = this.getActiveListeners();
|
|
52
|
+
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
53
|
+
// UPDATE prostgles.app_triggers
|
|
54
|
+
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
55
|
+
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
56
|
+
// ) THEN NOW() ELSE last_used END
|
|
57
|
+
// WHERE app_id = ${asValue(this.appId)};
|
|
58
|
+
// `;
|
|
59
|
+
|
|
60
|
+
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
61
|
+
// let dataTriggerCheckQuery = "";
|
|
62
|
+
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
63
|
+
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
64
|
+
// dataTriggerCheckQuery = `
|
|
65
|
+
// /* Delete unused triggers. Might deadlock */
|
|
66
|
+
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
68
67
|
|
|
69
|
-
|
|
68
|
+
// THEN
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
// /* TODO: Fixed deadlocks */
|
|
71
|
+
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
73
72
|
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
// /* UPDATE currently used triggers */
|
|
74
|
+
// ${updateCurrentlyUsedTriggersQuery}
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
77
|
+
// DELETE FROM prostgles.app_triggers
|
|
78
|
+
// WHERE app_id = ${asValue(this.appId)}
|
|
79
|
+
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
80
|
+
// */
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
// END IF;
|
|
84
83
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
84
|
+
// `
|
|
85
|
+
// }
|
|
86
|
+
|
|
87
|
+
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
88
|
+
// checkForStaleTriggers = `
|
|
89
|
+
// DO $$
|
|
90
|
+
// BEGIN
|
|
91
|
+
// /*
|
|
92
|
+
// ${queryIdentifier}
|
|
93
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
94
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
95
|
+
// */
|
|
96
|
+
// /* prostgles schema must exist */
|
|
97
|
+
// IF
|
|
98
|
+
// EXISTS (
|
|
99
|
+
// SELECT 1
|
|
100
|
+
// FROM information_schema.tables
|
|
101
|
+
// WHERE table_schema = 'prostgles'
|
|
102
|
+
// AND table_name = 'apps'
|
|
103
|
+
// )
|
|
104
|
+
// THEN
|
|
105
|
+
|
|
106
|
+
// /* Last check used to remove disconnected apps */
|
|
107
|
+
// UPDATE prostgles.apps
|
|
108
|
+
// SET last_check = NOW()
|
|
109
|
+
// WHERE id = ${asValue(this.appId)};
|
|
110
|
+
|
|
111
|
+
// ${dataTriggerCheckQuery}
|
|
112
|
+
// END IF;
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
114
|
+
// END $$;`
|
|
115
|
+
|
|
116
|
+
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
117
|
+
// const timeout = setTimeout(() => {
|
|
118
|
+
// this.db.any(`
|
|
119
|
+
// /*
|
|
120
|
+
// ${queryIdentifier}
|
|
121
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
122
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
123
|
+
// */
|
|
124
|
+
// DO $$
|
|
125
|
+
// BEGIN
|
|
126
|
+
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
127
|
+
// PERFORM pg_cancel_backend(pid)
|
|
128
|
+
// FROM pg_catalog.pg_stat_activity
|
|
129
|
+
// WHERE pid <> pg_backend_pid()
|
|
130
|
+
// AND query = \${queryIdentifier};
|
|
131
|
+
// END $$;
|
|
132
|
+
// `, { queryTimeoutMillis, queryIdentifier })
|
|
133
|
+
// }, queryTimeoutMillis);
|
|
134
|
+
// await this.db.any(checkForStaleTriggers);
|
|
135
|
+
// clearTimeout(timeout);
|
|
137
136
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
137
|
+
// tries = 5;
|
|
138
|
+
// log("updated last_check");
|
|
139
|
+
// } catch (e: any) {
|
|
140
|
+
// tries --;
|
|
141
|
+
|
|
142
|
+
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
143
|
+
// this.db.any(
|
|
144
|
+
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
145
|
+
// WHERE query ilike ${qid} \
|
|
146
|
+
// AND pid <> pg_backend_pid();",
|
|
147
|
+
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
148
|
+
// );
|
|
149
|
+
|
|
150
|
+
// /** If no tries left
|
|
151
|
+
// * OR
|
|
152
|
+
// * If this database was dropped
|
|
153
|
+
// *
|
|
154
|
+
// * then stop interval
|
|
155
|
+
// * */
|
|
156
|
+
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
157
|
+
// clearInterval(this.appCheck);
|
|
158
|
+
// }
|
|
159
|
+
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
160
|
+
// }
|
|
161
|
+
|
|
162
|
+
// this.appChecking = false;
|
|
163
|
+
// }, 0.8 * this.appCheckFrequencyMS);
|
|
164
|
+
// }
|
|
166
165
|
}
|
|
167
166
|
|
|
168
167
|
this.postgresNotifListenManager = new PostgresNotifListenManager(this.db, this.notifListener, NOTIF_CHANNEL.getFull(this.appId));
|
|
@@ -16,9 +16,7 @@ const connectedApplicationNamesQuery = `
|
|
|
16
16
|
FROM pg_catalog.pg_stat_activity
|
|
17
17
|
WHERE pid = pg_backend_pid()
|
|
18
18
|
)
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
const LAST_CHECKED_SETTING_NAME = 'prostgles.last_checked';
|
|
19
|
+
`;
|
|
22
20
|
|
|
23
21
|
/** It is a function to prevent undefined EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID */
|
|
24
22
|
export const getAppCheckQuery = () => `
|
|
@@ -35,11 +33,6 @@ export const getAppCheckQuery = () => `
|
|
|
35
33
|
WHERE table_schema = 'prostgles'
|
|
36
34
|
AND table_name = 'apps'
|
|
37
35
|
)
|
|
38
|
-
/* Ensure we don't check too often */
|
|
39
|
-
AND (
|
|
40
|
-
NULLIF(current_setting('${LAST_CHECKED_SETTING_NAME}', true), '') IS NULL
|
|
41
|
-
OR current_setting('${LAST_CHECKED_SETTING_NAME}', true)::timestamp < NOW() - INTERVAL '1 minute'
|
|
42
|
-
)
|
|
43
36
|
/* Ensure we don't check in paralel */
|
|
44
37
|
AND NOT EXISTS (
|
|
45
38
|
SELECT 1
|
|
@@ -47,10 +40,7 @@ export const getAppCheckQuery = () => `
|
|
|
47
40
|
WHERE s.query ilike '%${queryIdentifier}%'
|
|
48
41
|
AND s.state = 'active'
|
|
49
42
|
)
|
|
50
|
-
THEN
|
|
51
|
-
EXECUTE format('SET LOCAL ${LAST_CHECKED_SETTING_NAME} TO %L', now());
|
|
52
|
-
--USED FOR DEBUG REMOVE
|
|
53
|
-
PERFORM pg_notify('prostgles', current_setting('${LAST_CHECKED_SETTING_NAME}', true));
|
|
43
|
+
THEN
|
|
54
44
|
|
|
55
45
|
IF EXISTS (
|
|
56
46
|
${connectedApplicationNamesQuery}
|
package/package.json
CHANGED