|
1 | 1 | const MSTATE = '__dbmigrate_state__';
|
2 | 2 | const SSTATE = '__dbmigrate_schema__';
|
| 3 | +const RUNON = |
| 4 | + 'run_on'; |
| 5 | + |
3 | 6 | const log = require('db-migrate-shared').log;
|
4 | 7 | const fs = require('fs').promises;
|
5 | 8 | const path = require('path');
|
| 9 | +const crypto = require('crypto'); |
| 10 | + |
| 11 | +const ID = crypto.randomBytes(32).toString('base64'); |
| 12 | +let owner = false; |
6 | 13 |
|
7 | 14 | module.exports = {
|
| 15 | + /** |
| 16 | + * Lock state will add the basic state controller an ID |
| 17 | + * and a process controlled date. |
| 18 | + * It is important that all systems are in sync. We will use the |
| 19 | + * database clock instead if possible. |
| 20 | + */ |
8 | 21 | lockState: async function (driver, state, internals) {
|
9 | 22 | if (!state) {
|
| 23 | + owner = true; |
10 | 24 | return driver._insertKV(
|
11 | 25 | internals.migrationState,
|
12 | 26 | MSTATE,
|
13 | 27 | JSON.stringify({
|
14 | 28 | s: {
|
15 | 29 | step: 0,
|
16 | 30 | fin: 0,
|
| 31 | + ID, |
17 | 32 | date: new Date()
|
18 | 33 | }
|
19 | 34 | })
|
20 | 35 | );
|
21 | 36 | } else {
|
| 37 | + let runOn = state.run_on; |
22 | 38 | state = state.value;
|
23 | 39 | state = JSON.parse(state);
|
24 |
| - state.s.date = new Date(); |
25 |
| - return driver._updateKV( |
| 40 | + |
| 41 | + if (!state.s.ID || state.s.ID !== ID) { |
| 42 | + owner = true; |
| 43 | + state.s.ID = ID; |
| 44 | + } |
| 45 | + |
| 46 | + const d = new Date(); |
| 47 | + |
| 48 | + state.s.date = d; |
| 49 | + await driver._updateKVC( |
26 | 50 | internals.migrationState,
|
27 | 51 | MSTATE,
|
28 |
| - |
29 |
| - JSON.stringify(state) |
| 52 | + JSON.stringify(state), |
| 53 | + RUNON, |
| 54 | + runOn |
30 | 55 | );
|
| 56 | + |
| 57 | + state = await driver._getKV(internals.migrationState, MSTATE); |
| 58 | + |
| 59 | + runOn = state.run_on; |
| 60 | + state = state.value; |
| 61 | + state = JSON.parse(state); |
| 62 | + |
| 63 | + if (state.s.ID !== ID) { |
| 64 | + owner = false; |
| 65 | + } |
31 | 66 | }
|
32 | 67 | },
|
33 | 68 |
|
@@ -165,6 +200,9 @@ module.exports = {
|
165 | 200 | state.s.date = new Date();
|
166 | 201 | state.s.fin = 1;
|
167 | 202 |
|
| 203 | + // unlock from current process |
| 204 | + state.s.ID = 0; |
| 205 | + |
168 | 206 | return driver._updateKV(
|
169 | 207 | internals.migrationState,
|
170 | 208 | MSTATE,
|
|
0 commit comments