|
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