diff --git a/api-server/config-save.js b/api-server/config-save.js index db27723..fc24f6f 100644 --- a/api-server/config-save.js +++ b/api-server/config-save.js @@ -1,13 +1,16 @@ const MODULE_NAME = 'KOMODO-SDK.API-SERVER.CONFIG-SAVE'; const fs = require('fs'); -const logger = require('tektrans-logger'); +const locks = require('locks'); const moment = require('moment'); +const logger = require('tektrans-logger'); const config = require('../config'); const matrix = require('../matrix'); if (!fs.existsSync('config-backup')) fs.mkdirSync('config-backup'); +const mutex = locks.createMutex(); + const backup = async (xid) => { try { const backupFilename = `config-backup/config_${moment().format('YYYYMMDD_HHmmss.SS')}.json`; @@ -33,12 +36,18 @@ const backup = async (xid) => { }; module.exports = async (xid) => { - try { - if (!matrix.config_is_dirty) { - logger.verbose(`${MODULE_NAME} 4B263CB4: No need to save because config is not dirty`, { xid }); - return; - } + if (!matrix.config_is_dirty) { + logger.verbose(`${MODULE_NAME} 4B263CB4: No need to save because config is not dirty`, { xid }); + return; + } + + await new Promise((resolve) => { + mutex.lock(() => { + resolve(); + }); + }); + try { const backupFilename = await backup(xid); await fs.promises.writeFile( @@ -61,5 +70,7 @@ module.exports = async (xid) => { }); throw newE; + } finally { + mutex.unlock(); } }; diff --git a/package-lock.json b/package-lock.json index 5acebd8..61ae6fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "fs-copy-file": "^2.1.2", "json-query": "^2.2.2", "json-stringify-pretty-compact": "^3.0.0", + "locks": "^0.2.2", "lru-cache": "^4.1.1", "macaddress": "^0.2.9", "moment": "^2.24.0", @@ -28,7 +29,6 @@ "pkginfo": "^0.4.1", "redis": "^3.1.2", "request": "^2.88.2", - "sd-notify": "*", "sha1": "^1.1.1", "simple-git": "^1.80.1", "stack-trace": "0.0.10", @@ -2266,6 +2266,11 @@ "node": ">=4" } }, + "node_modules/locks": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/locks/-/locks-0.2.2.tgz", + "integrity": "sha1-JZkz0TJ8uvD9NmL4//3jaAnYTO0=" + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5457,6 +5462,11 @@ "path-exists": "^3.0.0" } }, + "locks": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/locks/-/locks-0.2.2.tgz", + "integrity": "sha1-JZkz0TJ8uvD9NmL4//3jaAnYTO0=" + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", diff --git a/package.json b/package.json index 783d075..2bc0f9a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "fs-copy-file": "^2.1.2", "json-query": "^2.2.2", "json-stringify-pretty-compact": "^3.0.0", + "locks": "^0.2.2", "lru-cache": "^4.1.1", "macaddress": "^0.2.9", "moment": "^2.24.0",