From 4d0f01e0b57f528f6db1939d8b8a0dbccff8013e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 1 Oct 2019 08:08:23 +0200 Subject: [PATCH] renaming caused problems --- FileStorage.js | 56 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/FileStorage.js b/FileStorage.js index 8857b87a4..66d570bb4 100644 --- a/FileStorage.js +++ b/FileStorage.js @@ -1,11 +1,11 @@ const path = require('path') -const fs = require('fs') exports.newFileStorage = function newFileStorage(logger) { const MODULE_NAME = 'FileStorage' const MAX_RETRY = 30 + const RETRY_TIME_IN_MILISECONDS = 250 let currentRetryGetTextFile = 0 let currentRetryWriteTextFile = 0 @@ -43,6 +43,7 @@ exports.newFileStorage = function newFileStorage(logger) { logger.write(MODULE_NAME, '[INFO] FileStorage -> getTextFile -> fileLocation: ' + fileLocation) /* Here we actually write the file. */ + const fs = require('fs') fs.readFile(fileLocation, onFileRead) function onFileRead(err, text) { @@ -62,13 +63,13 @@ exports.newFileStorage = function newFileStorage(logger) { logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> Error reading file -> container = ' + container) logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> Error reading file -> filePath = ' + filePath) logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> Error reading file -> err = ' + err.stack) - setTimeout(retry, 100) + setTimeout(retry, RETRY_TIME_IN_MILISECONDS) return } if (text.toString() === "") { logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> Read and Empty File -> filePath = ' + filePath) - setTimeout(retry, 100) + setTimeout(retry, RETRY_TIME_IN_MILISECONDS) return } @@ -117,16 +118,50 @@ exports.newFileStorage = function newFileStorage(logger) { let directoryPath = fileLocation.substring(0, fileLocation.lastIndexOf('/') + 1); mkDirByPathSync(directoryPath) - /* Here we actually write the file. */ - fs.writeFile(fileLocation, fileContent, onFileWriten) + /* + Here we write the file with a temporary name so as to avoid dirty read from other processes. + Then we delete the original file, if exists, and finally we rename the temporary into the original name. + */ + const fs = require('fs') + fs.writeFile(fileLocation + '.tmp', fileContent, onFileWritenn) - function onFileWriten(err) { + function onFileWritenn(err) { if (err) { - logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWrite -> Error writing file -> file = ' + fileLocation) - logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWrite -> Error writing file -> err = ' + err.stack) - setTimeout(retry, 100) + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> Error writing file -> file = ' + fileLocation) + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> Error writing file -> err = ' + err.stack) + setTimeout(retry, RETRY_TIME_IN_MILISECONDS) } else { - callBackFunction(global.DEFAULT_OK_RESPONSE) + + const fs = require('fs') + fs.unlink(fileLocation, onUnlinked) + + function onUnlinked(err) { + let code = '' + if (err) { + code = err.code + } + if (code !== '' && code !== 'ENOENT') { + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error renaming file -> file = ' + fileLocation) + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error renaming file -> err = ' + err.stack) + setTimeout(retry, RETRY_TIME_IN_MILISECONDS) + } else { + + const fs = require('fs') + fs.rename(fileLocation + '.tmp', fileLocation, onRenamed) + + function onRenamed(err) { + if (err) { + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> onRenamed -> Error renaming file -> file = ' + fileLocation + '.tmp') + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> onRenamed -> Error renaming file -> err = ' + err.stack) + setTimeout(retry, RETRY_TIME_IN_MILISECONDS) + } else { + + callBackFunction(global.DEFAULT_OK_RESPONSE) + + } + } + } + } } } @@ -160,6 +195,7 @@ exports.newFileStorage = function newFileStorage(logger) { return targetDir.split(sep).reduce((parentDir, childDir) => { const curDir = path.resolve(baseDir, parentDir, childDir); try { + const fs = require('fs') fs.mkdirSync(curDir); } catch (err) { if (err.code === 'EEXIST') { // curDir already exists!