@balena/pinejs 14.49.0 → 14.50.0-linear-runtime-migrator-0e95f856335f4d8b3ac95c421f6570153eef23e2

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.
@@ -1,3 +1,37 @@
1
+ - commits:
2
+ - subject: Add async migrator
3
+ hash: cf6fcd61659cb516bc5b436136335e53f1fa890a
4
+ body: >
5
+ Needed for long lasting / massive data affecting migrations for zero
6
+ downtime of API.
7
+
8
+
9
+ Depends-on: #555
10
+ footer:
11
+ Change-type: minor
12
+ change-type: minor
13
+ Signed-off-by: Harald Fischer <harald@balena.io>
14
+ signed-off-by: Harald Fischer <harald@balena.io>
15
+ author: Harald Fischer
16
+ nested: []
17
+ - subject: Add async migrator
18
+ hash: 69530504166e30518609b5a5388f0467bd0b474d
19
+ body: >
20
+ Needed for long lasting / massive data affecting migrations for zero
21
+ downtime of API.
22
+
23
+
24
+ Depends-on: #555
25
+ footer:
26
+ Change-type: minor
27
+ change-type: minor
28
+ Signed-off-by: Harald Fischer <harald@balena.io>
29
+ signed-off-by: Harald Fischer <harald@balena.io>
30
+ author: Harald Fischer
31
+ nested: []
32
+ version: 14.50.0
33
+ title: "'Async runtime migrator'"
34
+ date: 2022-08-04T13:07:42.154Z
1
35
  - commits:
2
36
  - subject: Make checking that read-only TX queries are SELECT queries optional
3
37
  hash: 7d6ef12d558b6cd5438b5cf277d969ccaccb5c21
@@ -25,7 +59,7 @@
25
59
  nested: []
26
60
  version: 14.49.0
27
61
  title: "'Make checking that read-only TX queries are SELECT queries optional'"
28
- date: 2022-08-04T13:03:28.530Z
62
+ date: 2022-08-04T12:48:55.107Z
29
63
  - commits:
30
64
  - subject: Refactur checkModelExists to isModelNew
31
65
  hash: 28725993f36edb2f372145addb3841b9a899d880
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file
4
4
  automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
5
5
  This project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ # v14.50.0
8
+ ## (2022-08-04)
9
+
10
+ * Add async migrator [Harald Fischer]
11
+ * Add async migrator [Harald Fischer]
12
+
7
13
  # v14.49.0
8
14
  ## (2022-08-04)
9
15
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 14.49.0
1
+ 14.50.0
@@ -46,4 +46,112 @@ Migrations which are Node modules should export a function which will be called
46
46
 
47
47
  You can execute SQL using `tx.executeSql(query)`, however note that the model for which the migration is running will *not* be available under `sbvrUtils.api`, as it has not executed yet.
48
48
 
49
- You should return a promise so pinejs can wait for completion/errors.
49
+ You should return a promise so pinejs can wait for completion/errors.
50
+
51
+
52
+ ## Async Migrations
53
+
54
+ Migrations that may lock tables for a long time, eg. column renames on large tables, can be run as async migrations.
55
+
56
+ Async migrations are executed in small batches within individual transactions and run concurrently while Pine is serving requests. Async migrations are multi-instance safe. They are synchronized between instances via the `migration status` database table and the minimum interval between two migration executions is guaranteed across instances.
57
+
58
+ When Pine starts and determines there are multiple async migrations to be run, it starts all migrations concurrently. These migrations however do not run in parallel: only one migration batch is executed at any given time, then another, and so on. Thus, migrations should not depend on the result a previous one.
59
+ Once an async migration starts, it keeps running forever even after Pine instance restarts. The async migration will stop being executed when finalized with a dedicated flag in the async migration definition. This is to guarantee that new data inserted or updated at runtime can also be migrated. The status of running migrations can be checked in `migration status` table. The configured execution parameters and the execution metrics are stored and updated after each migration batch completes.
60
+
61
+ Each async migration needs to specify a pair of an async and a sync migration part, so that the sync migration statement closes the async migration and guarantees database consistency.
62
+
63
+ Async migrations are stored in the migrations folder, alongside synchronous migrations. Their file names are significant and must contain the string `.async.` so they are treated as async migrations. They can only be Typescript / Javascript (with `.ts`/`.js` extensions) files.
64
+
65
+ The async migration query must have a `LIMIT` statement to limit the maximum number of affected rows per batch.
66
+
67
+
68
+ ### Async migration procedure
69
+ An async migration procedure for adding / renaming a column may follow these steps:
70
+ 1. Deployment
71
+ - Add new column (with independent sync migration) to contain new data and add code accessing the new column
72
+ - Old code reads/writes data to/from old column and async migration migrates data from old column to new column
73
+ - New code reads/writes to/from new column
74
+ - Async migrator runs forever
75
+ 2. Deployment
76
+ - Finalize async migration => only sync migration part gets executed
77
+ - Sync migration migrates all left over data from old column to new column
78
+ - Sync migration deletes old column
79
+ - Only new code with reads/writes to/from new column
80
+ - Disable all old code that reads/writes to old column
81
+
82
+ ### TS migration file format with SQL query string
83
+
84
+ The placeholder `%%ASYNC_BATCH_SIZE%%` will be replaced with the value specified by asyncBatchSize parameter
85
+
86
+ ``` javascript
87
+ export = {
88
+ asyncSql: `\
89
+ UPDATE "device"
90
+ SET "note" = "device"."name"
91
+ WHERE id IN ( SELECT id FROM (
92
+ SELECT id FROM "device"
93
+ WHERE "device"."name" <> "device"."note" OR "device"."note" IS NULL
94
+ LIMIT %%ASYNC_BATCH_SIZE%%
95
+ ) tmp
96
+ );
97
+ `,
98
+ syncSql: `\
99
+ UPDATE "device"
100
+ SET "note" = "device"."name"
101
+ WHERE id IN ( SELECT id FROM (
102
+ SELECT id FROM "device"
103
+ WHERE "device"."name" <> "device"."note" OR "device"."note" IS NULL
104
+ ) tmp
105
+ );
106
+ `,
107
+ delayMS: 100,
108
+ backoffDelayMS: 4000,
109
+ errorThreshold: 15,
110
+ asyncBatchSize: 1,
111
+ finalize: true,
112
+ };
113
+ ```
114
+
115
+ ### TS migration file format with migrator function definition
116
+
117
+ `${options.batchSize}` will be the value specified by asyncBatchSize parameter.
118
+
119
+ ``` javascript
120
+ export = {
121
+ asyncFn: async (tx: any, options) => {
122
+ const staticSql = `\
123
+ UPDATE "device"
124
+ SET "note" = "device"."name"
125
+ WHERE id IN ( SELECT id FROM (
126
+ SELECT id FROM "device"
127
+ WHERE "device"."name" <> "device"."note" OR "device"."note" IS NULL
128
+ LIMIT ${options.batchSize}
129
+ ) tmp
130
+ );
131
+ `;
132
+
133
+ return await tx.executeSql(staticSql);
134
+ },
135
+ syncFn: async (tx: any) => {
136
+ const staticSql = `\
137
+ UPDATE "device"
138
+ SET "note" = "device"."name"
139
+ WHERE id IN ( SELECT id FROM (
140
+ SELECT id FROM "device"
141
+ WHERE "device"."name" <> "device"."note" OR "device"."note" IS NULL
142
+ ) tmp
143
+ );
144
+ `;
145
+
146
+ await tx.executeSql(staticSql);
147
+ },
148
+ asyncBatchSize: 1,
149
+ delayMS: 100,
150
+ backoffDelayMS: 4000,
151
+ errorThreshold: 15,
152
+ finalize: true,
153
+ };
154
+
155
+ ```
156
+ ### SQL query file (plain text)
157
+ Plain SQL files are not supported as they cannot bundle async and sync migration statements in one file. Moreover they cannot carry migration metadata.
@@ -35,91 +35,93 @@ const getOrCreatePermission = async (authApiTx, permissionName) => {
35
35
  }
36
36
  };
37
37
  const setup = (app) => {
38
- const loadConfig = (data) => sbvrUtils.db.transaction(async (tx) => {
39
- var _a;
40
- const authApiTx = sbvrUtils.api.Auth.clone({
41
- passthrough: {
42
- tx,
43
- req: permissions.root,
44
- },
45
- });
46
- const { users } = data;
47
- if (users != null) {
48
- const permissionsCache = {};
49
- for (const user of users) {
50
- if (user.permissions == null) {
51
- continue;
52
- }
53
- for (const permissionName of user.permissions) {
54
- (_a = permissionsCache[permissionName]) !== null && _a !== void 0 ? _a : (permissionsCache[permissionName] = getOrCreatePermission(authApiTx, permissionName));
55
- }
56
- }
57
- await Promise.all(users.map(async (user) => {
58
- try {
59
- const userID = await getOrCreate(authApiTx, 'user', {
60
- username: user.username,
61
- }, {
62
- password: user.password,
63
- });
64
- if (user.permissions != null) {
65
- await Promise.all(user.permissions.map(async (permissionName) => {
66
- const permissionID = await permissionsCache[permissionName];
67
- await getOrCreate(authApiTx, 'user__has__permission', {
68
- user: userID,
69
- permission: permissionID,
70
- });
71
- }));
38
+ const loadConfig = async (data) => {
39
+ await sbvrUtils.db.transaction(async (tx) => {
40
+ var _a;
41
+ const authApiTx = sbvrUtils.api.Auth.clone({
42
+ passthrough: {
43
+ tx,
44
+ req: permissions.root,
45
+ },
46
+ });
47
+ const { users } = data;
48
+ if (users != null) {
49
+ const permissionsCache = {};
50
+ for (const user of users) {
51
+ if (user.permissions == null) {
52
+ continue;
72
53
  }
73
- }
74
- catch (e) {
75
- e.message = `Could not create or find user "${user.username}": ${e.message}`;
76
- throw e;
77
- }
78
- }));
79
- }
80
- await Promise.all(data.models.map(async (model) => {
81
- if ((model.abstractSql != null || model.modelText != null) &&
82
- model.apiRoot != null) {
83
- try {
84
- await sbvrUtils.executeModel(tx, model);
85
- const apiRoute = `/${model.apiRoot}/*`;
86
- app.options(apiRoute, (_req, res) => res.status(200).end());
87
- app.all(apiRoute, sbvrUtils.handleODataRequest);
88
- console.info('Successfully executed ' + model.modelName + ' model.');
89
- }
90
- catch (err) {
91
- const message = `Failed to execute ${model.modelName} model from ${model.modelFile}`;
92
- if (_.isError(err)) {
93
- err.message = message;
94
- throw err;
54
+ for (const permissionName of user.permissions) {
55
+ (_a = permissionsCache[permissionName]) !== null && _a !== void 0 ? _a : (permissionsCache[permissionName] = getOrCreatePermission(authApiTx, permissionName));
95
56
  }
96
- throw new Error(message);
97
57
  }
98
- }
99
- if (model.customServerCode != null) {
100
- let customCode;
101
- if (typeof model.customServerCode === 'string') {
58
+ await Promise.all(users.map(async (user) => {
102
59
  try {
103
- customCode = nodeRequire(model.customServerCode).setup;
60
+ const userID = await getOrCreate(authApiTx, 'user', {
61
+ username: user.username,
62
+ }, {
63
+ password: user.password,
64
+ });
65
+ if (user.permissions != null) {
66
+ await Promise.all(user.permissions.map(async (permissionName) => {
67
+ const permissionID = await permissionsCache[permissionName];
68
+ await getOrCreate(authApiTx, 'user__has__permission', {
69
+ user: userID,
70
+ permission: permissionID,
71
+ });
72
+ }));
73
+ }
104
74
  }
105
75
  catch (e) {
106
- e.message = `Error loading custom server code: '${e.message}'`;
76
+ e.message = `Could not create or find user "${user.username}": ${e.message}`;
107
77
  throw e;
108
78
  }
79
+ }));
80
+ }
81
+ await Promise.all(data.models.map(async (model) => {
82
+ if ((model.abstractSql != null || model.modelText != null) &&
83
+ model.apiRoot != null) {
84
+ try {
85
+ await sbvrUtils.executeModel(tx, model);
86
+ const apiRoute = `/${model.apiRoot}/*`;
87
+ app.options(apiRoute, (_req, res) => res.status(200).end());
88
+ app.all(apiRoute, sbvrUtils.handleODataRequest);
89
+ console.info('Successfully executed ' + model.modelName + ' model.');
90
+ }
91
+ catch (err) {
92
+ const message = `Failed to execute ${model.modelName} model from ${model.modelFile}`;
93
+ if (_.isError(err)) {
94
+ err.message = message;
95
+ throw err;
96
+ }
97
+ throw new Error(message);
98
+ }
109
99
  }
110
- else if (typeof model.customServerCode === 'object') {
111
- customCode = model.customServerCode.setup;
112
- }
113
- else {
114
- throw new Error(`Invalid type for customServerCode '${typeof model.customServerCode}'`);
115
- }
116
- if (typeof customCode !== 'function') {
117
- return;
100
+ if (model.customServerCode != null) {
101
+ let customCode;
102
+ if (typeof model.customServerCode === 'string') {
103
+ try {
104
+ customCode = nodeRequire(model.customServerCode).setup;
105
+ }
106
+ catch (e) {
107
+ e.message = `Error loading custom server code: '${e.message}'`;
108
+ throw e;
109
+ }
110
+ }
111
+ else if (typeof model.customServerCode === 'object') {
112
+ customCode = model.customServerCode.setup;
113
+ }
114
+ else {
115
+ throw new Error(`Invalid type for customServerCode '${typeof model.customServerCode}'`);
116
+ }
117
+ if (typeof customCode !== 'function') {
118
+ return;
119
+ }
120
+ await customCode(app, sbvrUtils, sbvrUtils.db);
118
121
  }
119
- await customCode(app, sbvrUtils, sbvrUtils.db);
120
- }
121
- }));
122
- });
122
+ }));
123
+ });
124
+ };
123
125
  const loadConfigFile = async (configPath) => {
124
126
  console.info('Loading config:', configPath);
125
127
  return await Promise.resolve().then(() => require(configPath));
@@ -174,12 +176,16 @@ const setup = (app) => {
174
176
  migrationCategory = fileNameParts[1];
175
177
  }
176
178
  else {
177
- console.error(`Unrecognised migration file category ${fileNameParts[1]}, skipping: ${path.extname(filename)}`);
179
+ console.error(`Unrecognized migration file category ${fileNameParts[1]}, skipping: ${path.extname(filename)}`);
178
180
  return;
179
181
  }
180
182
  }
181
183
  const assignMigrationWithCategory = (newMigrationKey, newMigration) => {
182
184
  const catMigrations = migrations[migrationCategory] || {};
185
+ if (typeof newMigration === 'object' &&
186
+ migrationCategory === 'async') {
187
+ newMigration.type = 'async';
188
+ }
183
189
  if (typeof catMigrations === 'object') {
184
190
  migrations[migrationCategory] = {
185
191
  [newMigrationKey]: newMigration,
@@ -194,6 +200,10 @@ const setup = (app) => {
194
200
  assignMigrationWithCategory(migrationKey, nodeRequire(filePath));
195
201
  break;
196
202
  case '.sql':
203
+ if (migrationCategory === 'async') {
204
+ console.error(`Plain async migration sql statement not supported, needs to be an object, skipping: ${path.extname(filename)}`);
205
+ break;
206
+ }
197
207
  assignMigrationWithCategory(migrationKey, await fs.promises.readFile(filePath, 'utf8'));
198
208
  break;
199
209
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config-loader/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config-loader/config-loader.ts"],"names":[],"mappings":"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"}
@@ -43,5 +43,9 @@ export declare const db: {
43
43
  export declare const migrator: {
44
44
  lockTimeout: number;
45
45
  lockFailDelay: number;
46
+ asyncMigrationDefaultDelayMS: number;
47
+ asyncMigrationDefaultBackoffDelayMS: number;
48
+ asyncMigrationDefaultErrorThreshold: number;
49
+ asyncMigrationDefaultBatchSize: number;
46
50
  };
47
51
  export {};
@@ -74,5 +74,9 @@ exports.db = {
74
74
  exports.migrator = {
75
75
  lockTimeout: 5 * 60 * 1000,
76
76
  lockFailDelay: 20 * 1000,
77
+ asyncMigrationDefaultDelayMS: 1000,
78
+ asyncMigrationDefaultBackoffDelayMS: 60000,
79
+ asyncMigrationDefaultErrorThreshold: 10,
80
+ asyncMigrationDefaultBatchSize: 1000,
77
81
  };
78
82
  //# sourceMappingURL=env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config-loader/env.ts"],"names":[],"mappings":";;;AACA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AACzD,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;IAEtD,OAAO,CAAC,IAAI,CAAC,mCAAmC,YAAY,GAAG,CAAC,CAAC;CACjE;AAEY,QAAA,KAAK,GACjB,YAAY,KAAK,GAAG,IAAI,CAAC,YAAY,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;AA0BpD,QAAA,KAAK,GAAG;IACpB,iBAAiB,EAAE;QAClB,GAAG,EAAE,IAAI;KACI;IACd,gBAAgB,EAAE;QACjB,GAAG,EAAE,MAAM;KACE;IACd,UAAU,EAAE;QACX,GAAG,EAAE,MAAM;KACE;IACd,kBAAkB,EAAE;QACnB,GAAG,EAAE,KAAK;KACG;IACd,mBAAmB,EAAE;QACpB,GAAG,EAAE,KAAK;KACG;IACd,eAAe,EAAE,KAAkB;IACnC,iBAAiB,EAAE,KAAkB;IACrC,aAAa,EAAE,KAAkB;CACjC,CAAC;AAEF,oCAAoC;AACpC,6CAA8C;AACvC,MAAM,WAAW,GAAG,CAC1B,SAA6B,EAC7B,EAAK,EAGL,IAAoB,EACnB,EAAE;IACH,MAAM,SAAS,GAAG,aAAK,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,SAAS,KAAK,KAAK,EAAE;QACxB,OAAO,EAAE,CAAC;KACV;IACD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACpC,OAAO,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;KAC3B;IACD,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,IAAI,EAAE;QACxB,OAAO,WAAW,CAAC,EAAE,EAAE;YACtB,GAAG,SAAS;YACZ,GAAG,IAAI;SACP,CAAC,CAAC;KACH;IACD,OAAO,OAAO,CAAC,EAAE,EAAE;QAClB,GAAG,SAAS;QACZ,GAAG,IAAI;KACP,CAAC,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,WAAW,eAwBtB;AAEF,IAAI,SAAiB,CAAC;AACtB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;IACvC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE;QAC9C,MAAM,IAAI,KAAK,CACd,6CAA6C,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CACjF,CAAC;KACF;CACD;KAAM;IACN,SAAS,GAAG,KAAK,CAAC;CAClB;AAEY,QAAA,EAAE,GAAG;IACjB,QAAQ,EAAE,EAAE;IACZ,iBAAiB,EAAE,KAA2B;IAC9C,gBAAgB,EAAE,SAA+B;IACjD,YAAY,EAAE,SAA+B;IAC7C,uBAAuB,EAAE,KAA2B;IACpD,SAAS,EAAE,IAA2B;IACtC,eAAe,EAAE,KAAK;IACtB,SAAS;IACT,OAAO,EAAE,QAAQ;IACjB,kBAAkB,EAAE,CAAC;IASrB,oBAAoB,EAAE,aAAK;CAC3B,CAAC;AAEW,QAAA,QAAQ,GAAG;IACvB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAE1B,aAAa,EAAE,EAAE,GAAG,IAAI;CACxB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config-loader/env.ts"],"names":[],"mappings":";;;AACA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AACzD,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;IAEtD,OAAO,CAAC,IAAI,CAAC,mCAAmC,YAAY,GAAG,CAAC,CAAC;CACjE;AAEY,QAAA,KAAK,GACjB,YAAY,KAAK,GAAG,IAAI,CAAC,YAAY,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;AA0BpD,QAAA,KAAK,GAAG;IACpB,iBAAiB,EAAE;QAClB,GAAG,EAAE,IAAI;KACI;IACd,gBAAgB,EAAE;QACjB,GAAG,EAAE,MAAM;KACE;IACd,UAAU,EAAE;QACX,GAAG,EAAE,MAAM;KACE;IACd,kBAAkB,EAAE;QACnB,GAAG,EAAE,KAAK;KACG;IACd,mBAAmB,EAAE;QACpB,GAAG,EAAE,KAAK;KACG;IACd,eAAe,EAAE,KAAkB;IACnC,iBAAiB,EAAE,KAAkB;IACrC,aAAa,EAAE,KAAkB;CACjC,CAAC;AAEF,oCAAoC;AACpC,6CAA8C;AACvC,MAAM,WAAW,GAAG,CAC1B,SAA6B,EAC7B,EAAK,EAGL,IAAoB,EACnB,EAAE;IACH,MAAM,SAAS,GAAG,aAAK,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,SAAS,KAAK,KAAK,EAAE;QACxB,OAAO,EAAE,CAAC;KACV;IACD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACpC,OAAO,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;KAC3B;IACD,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,IAAI,EAAE;QACxB,OAAO,WAAW,CAAC,EAAE,EAAE;YACtB,GAAG,SAAS;YACZ,GAAG,IAAI;SACP,CAAC,CAAC;KACH;IACD,OAAO,OAAO,CAAC,EAAE,EAAE;QAClB,GAAG,SAAS;QACZ,GAAG,IAAI;KACP,CAAC,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,WAAW,eAwBtB;AAEF,IAAI,SAAiB,CAAC;AACtB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;IACvC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE;QAC9C,MAAM,IAAI,KAAK,CACd,6CAA6C,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CACjF,CAAC;KACF;CACD;KAAM;IACN,SAAS,GAAG,KAAK,CAAC;CAClB;AAEY,QAAA,EAAE,GAAG;IACjB,QAAQ,EAAE,EAAE;IACZ,iBAAiB,EAAE,KAA2B;IAC9C,gBAAgB,EAAE,SAA+B;IACjD,YAAY,EAAE,SAA+B;IAC7C,uBAAuB,EAAE,KAA2B;IACpD,SAAS,EAAE,IAA2B;IACtC,eAAe,EAAE,KAAK;IACtB,SAAS;IACT,OAAO,EAAE,QAAQ;IACjB,kBAAkB,EAAE,CAAC;IASrB,oBAAoB,EAAE,aAAK;CAC3B,CAAC;AAEW,QAAA,QAAQ,GAAG;IACvB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAE1B,aAAa,EAAE,EAAE,GAAG,IAAI;IACxB,4BAA4B,EAAE,IAAI;IAClC,mCAAmC,EAAE,KAAK;IAC1C,mCAAmC,EAAE,EAAE;IACvC,8BAA8B,EAAE,IAAI;CACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Tx } from '../database-layer/db';
2
+ import type { Model } from '../config-loader/config-loader';
3
+ declare type ApiRootModel = Model & {
4
+ apiRoot: string;
5
+ };
6
+ export declare const run: (tx: Tx, model: ApiRootModel) => Promise<void>;
7
+ export {};
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run = void 0;
4
+ const _ = require("lodash");
5
+ const sbvrUtils = require("../sbvr-api/sbvr-utils");
6
+ const utils_1 = require("./utils");
7
+ const run = async (tx, model) => {
8
+ const { migrations } = model;
9
+ if (migrations == null || _.isEmpty(migrations)) {
10
+ return;
11
+ }
12
+ const asyncMigrations = (0, utils_1.getRunnableAsyncMigrations)(migrations);
13
+ if (asyncMigrations == null || typeof asyncMigrations !== 'object') {
14
+ return;
15
+ }
16
+ await $run(tx, model, asyncMigrations);
17
+ };
18
+ exports.run = run;
19
+ const $run = async (setupTx, model, migrations) => {
20
+ var _a, _b, _c, _d, _e, _f, _g;
21
+ const modelName = model.apiRoot;
22
+ const asyncMigrationSetup = [];
23
+ const modelIsNew = await sbvrUtils.isModelNew(setupTx, modelName);
24
+ if (modelIsNew) {
25
+ ((_b = (_a = sbvrUtils.api.migrations) === null || _a === void 0 ? void 0 : _a.logger.info) !== null && _b !== void 0 ? _b : console.info)('First time model has executed, skipping async migrations');
26
+ await (0, utils_1.setExecutedMigrations)(setupTx, modelName, Object.keys(migrations));
27
+ return;
28
+ }
29
+ const executedMigrations = await (0, utils_1.getExecutedMigrations)(setupTx, modelName);
30
+ const pendingMigrations = (0, utils_1.filterAndSortPendingMigrations)(migrations, executedMigrations);
31
+ for (const [key, migration] of pendingMigrations) {
32
+ let asyncRunnerMigratorFn;
33
+ const initMigrationState = {
34
+ migration_key: key,
35
+ start_time: new Date(),
36
+ last_run_time: new Date(),
37
+ run_counter: 0,
38
+ migrated_rows: 0,
39
+ error_counter: 0,
40
+ error_threshold: utils_1.migratorEnv.asyncMigrationDefaultErrorThreshold,
41
+ delayMS: utils_1.migratorEnv.asyncMigrationDefaultDelayMS,
42
+ backoffDelayMS: utils_1.migratorEnv.asyncMigrationDefaultBackoffDelayMS,
43
+ converged_time: undefined,
44
+ last_error_message: undefined,
45
+ is_backoff: false,
46
+ };
47
+ if (typeof migration === 'object') {
48
+ const batchSize = migration.asyncBatchSize || utils_1.migratorEnv.asyncMigrationDefaultBatchSize;
49
+ if (migration.asyncFn && typeof migration.asyncFn === 'function') {
50
+ asyncRunnerMigratorFn = async (tx) => (await migration.asyncFn(tx, {
51
+ batchSize,
52
+ }, sbvrUtils)).rowsAffected;
53
+ }
54
+ else if (migration.asyncSql && typeof migration.asyncSql === 'string') {
55
+ const asyncMigrationSqlStatement = (_c = migration.asyncSql) === null || _c === void 0 ? void 0 : _c.replace('%%ASYNC_BATCH_SIZE%%', `${batchSize}`);
56
+ asyncRunnerMigratorFn = async (tx) => (await tx.executeSql(asyncMigrationSqlStatement)).rowsAffected;
57
+ }
58
+ else {
59
+ ((_e = (_d = sbvrUtils.api.migrations) === null || _d === void 0 ? void 0 : _d.logger.error) !== null && _e !== void 0 ? _e : console.error)(`Invalid migration object: ${JSON.stringify(migration, null, 2)}`);
60
+ continue;
61
+ }
62
+ initMigrationState.backoffDelayMS =
63
+ migration.backoffDelayMS ||
64
+ utils_1.migratorEnv.asyncMigrationDefaultBackoffDelayMS;
65
+ initMigrationState.delayMS =
66
+ migration.delayMS || utils_1.migratorEnv.asyncMigrationDefaultDelayMS;
67
+ initMigrationState.error_threshold =
68
+ migration.errorThreshold ||
69
+ utils_1.migratorEnv.asyncMigrationDefaultErrorThreshold;
70
+ }
71
+ else if (typeof migration === 'string') {
72
+ asyncRunnerMigratorFn = async (tx) => (await tx.executeSql(migration)).rowsAffected;
73
+ }
74
+ else {
75
+ ((_g = (_f = sbvrUtils.api.migrations) === null || _f === void 0 ? void 0 : _f.logger.error) !== null && _g !== void 0 ? _g : console.error)(`Invalid async migration object: ${JSON.stringify(migration, null, 2)}`);
76
+ continue;
77
+ }
78
+ await (0, utils_1.initMigrationStatus)(setupTx, initMigrationState);
79
+ asyncMigrationSetup.push({
80
+ key,
81
+ initMigrationState,
82
+ asyncRunnerMigratorFn,
83
+ });
84
+ }
85
+ setupTx.on('end', () => {
86
+ for (const { key, initMigrationState, asyncRunnerMigratorFn, } of asyncMigrationSetup) {
87
+ const asyncRunner = async () => {
88
+ await sbvrUtils.db.transaction(async (tx) => {
89
+ await (0, utils_1.lockMigrations)(tx, modelName, async () => {
90
+ var _a, _b, _c, _d, _e, _f, _g;
91
+ const migrationState = await (0, utils_1.readMigrationStatus)(tx, key);
92
+ if (!migrationState) {
93
+ ((_b = (_a = sbvrUtils.api.migrations) === null || _a === void 0 ? void 0 : _a.logger.info) !== null && _b !== void 0 ? _b : console.info)(`stopping async migration: ${key}`);
94
+ clearInterval(asyncScheduler);
95
+ return;
96
+ }
97
+ try {
98
+ clearInterval(asyncScheduler);
99
+ if (migrationState.last_run_time) {
100
+ const durationSinceLastRun = Date.now() - migrationState.last_run_time.getTime();
101
+ if ((migrationState.is_backoff &&
102
+ durationSinceLastRun < initMigrationState.backoffDelayMS) ||
103
+ (!migrationState.is_backoff &&
104
+ durationSinceLastRun < initMigrationState.delayMS)) {
105
+ return;
106
+ }
107
+ }
108
+ migrationState.last_run_time = new Date();
109
+ migrationState.run_counter += 1;
110
+ let migratedRows = 0;
111
+ await sbvrUtils.db.transaction(async (migrationTx) => {
112
+ var _a;
113
+ migratedRows =
114
+ (_a = (await (asyncRunnerMigratorFn === null || asyncRunnerMigratorFn === void 0 ? void 0 : asyncRunnerMigratorFn(migrationTx)))) !== null && _a !== void 0 ? _a : 0;
115
+ });
116
+ migrationState.migrated_rows += migratedRows;
117
+ if (migratedRows === 0) {
118
+ migrationState.is_backoff = true;
119
+ (_c = migrationState.converged_time) !== null && _c !== void 0 ? _c : (migrationState.converged_time = new Date());
120
+ }
121
+ else {
122
+ migrationState.is_backoff = false;
123
+ }
124
+ }
125
+ catch (err) {
126
+ migrationState.error_counter++;
127
+ if (err instanceof Error) {
128
+ if (migrationState.error_counter %
129
+ initMigrationState.error_threshold ===
130
+ 0) {
131
+ migrationState.last_error_message = `${err.name} ${err.message}`;
132
+ ((_e = (_d = sbvrUtils.api.migrations) === null || _d === void 0 ? void 0 : _d.logger.error) !== null && _e !== void 0 ? _e : console.error)(`${key}: ${err.name} ${err.message}`);
133
+ migrationState.is_backoff = true;
134
+ }
135
+ }
136
+ else {
137
+ ((_g = (_f = sbvrUtils.api.migrations) === null || _f === void 0 ? void 0 : _f.logger.error) !== null && _g !== void 0 ? _g : console.error)(`async migration error unknown: ${key}: ${err}`);
138
+ }
139
+ }
140
+ finally {
141
+ if (migrationState.is_backoff) {
142
+ asyncScheduler = setInterval(asyncRunner, initMigrationState.backoffDelayMS);
143
+ }
144
+ else {
145
+ asyncScheduler = setInterval(asyncRunner, initMigrationState.delayMS);
146
+ }
147
+ await (0, utils_1.updateMigrationStatus)(tx, migrationState);
148
+ }
149
+ });
150
+ });
151
+ };
152
+ let asyncScheduler = setInterval(asyncRunner, initMigrationState.delayMS);
153
+ }
154
+ });
155
+ };
156
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/migrator/async.ts"],"names":[],"mappings":"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"}