|
1 | 1 | const cluster = require("cluster"); |
2 | 2 | const os = require("os"); |
| 3 | +const assert = require("assert"); |
| 4 | +const fs = require("fs-promise"); |
3 | 5 |
|
4 | 6 | const sleep = require("sleep-promise"); |
5 | 7 | const JSONRPC = { |
@@ -47,6 +49,7 @@ class MasterEndpoint extends JSONRPC.EndpointBase |
47 | 49 | this.objWorkerIDToState = {}; |
48 | 50 |
|
49 | 51 | this._bWorkersStarted = false; |
| 52 | + this._bWatchingForUpgrade = false; |
50 | 53 | } |
51 | 54 |
|
52 | 55 |
|
@@ -146,6 +149,64 @@ class MasterEndpoint extends JSONRPC.EndpointBase |
146 | 149 | } |
147 | 150 |
|
148 | 151 |
|
| 152 | + /** |
| 153 | + * If the version in package.json changes, this.gracefulExit() will be invoked. |
| 154 | + * |
| 155 | + * @param {string} strPackageJSONPath |
| 156 | + * |
| 157 | + * @returns {undefined} |
| 158 | + */ |
| 159 | + async watchForUpgrade(strPackageJSONPath) |
| 160 | + { |
| 161 | + assert(typeof strPackageJSONPath === "string"); |
| 162 | + |
| 163 | + if(this._bWatchingForUpgrade) |
| 164 | + { |
| 165 | + return; |
| 166 | + } |
| 167 | + |
| 168 | + this._bWatchingForUpgrade = true; |
| 169 | + |
| 170 | + const strVersion = JSON.parse(await fs.readFile(strPackageJSONPath, "utf8")).version; |
| 171 | + let nPackageJSONModificationTime = (await fs.stat(strPackageJSONPath)).mtime.getTime(); |
| 172 | + let strVersionNew = strVersion; |
| 173 | + |
| 174 | + const nIntervalMilliseconds = 10 * 1000; |
| 175 | + |
| 176 | + const nIntervalID = setInterval( |
| 177 | + async () => { |
| 178 | + try |
| 179 | + { |
| 180 | + if(nPackageJSONModificationTime !== (await fs.stat(strPackageJSONPath)).mtime.getTime()) |
| 181 | + { |
| 182 | + nPackageJSONModificationTime = (await fs.stat(strPackageJSONPath)).mtime.getTime(); |
| 183 | + strVersionNew = JSON.parse(await fs.readFile(strPackageJSONPath, "utf8")).version; |
| 184 | + } |
| 185 | + |
| 186 | + if(strVersionNew !== strVersion) |
| 187 | + { |
| 188 | + clearInterval(nIntervalID); |
| 189 | + |
| 190 | + console.log(` |
| 191 | + Updated. |
| 192 | + Detected new version ${strVersionNew}. |
| 193 | + Old version ${strVersion}. |
| 194 | + Attempting to exit gracefully to allow starting with new version. |
| 195 | + `.replace(/^\t+/gm, "")); |
| 196 | + |
| 197 | + await this.gracefulExit(null); |
| 198 | + } |
| 199 | + } |
| 200 | + catch(error) |
| 201 | + { |
| 202 | + console.error(error); |
| 203 | + } |
| 204 | + }, |
| 205 | + nIntervalMilliseconds |
| 206 | + ); |
| 207 | + } |
| 208 | + |
| 209 | + |
149 | 210 | /** |
150 | 211 | * Signals a worker's JSONRPC endpoint is ready to receive calls. |
151 | 212 | * |
|
0 commit comments