From d0176ad986512b99d4e5658c6ec32f2f99a2f014 Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Mon, 30 Sep 2024 12:28:42 +0300 Subject: [PATCH] [bug] Add try-catch to stat to fix race condition with delete on Windows; Add CONVERT_TEMPORARY constant for temporary convert errors --- Common/sources/constants.js | 1 + Common/sources/utils.js | 12 +++++++++++- DocService/sources/canvasservice.js | 2 ++ FileConverter/sources/converter.js | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Common/sources/constants.js b/Common/sources/constants.js index 87220f86..700696ff 100644 --- a/Common/sources/constants.js +++ b/Common/sources/constants.js @@ -231,6 +231,7 @@ exports.CONVERT_DRM = -90; exports.CONVERT_PASSWORD = -91; exports.CONVERT_ICU = -92; exports.CONVERT_LIMITS = -93; +exports.CONVERT_TEMPORARY = -94; exports.CONVERT_DETECT = -95; exports.CONVERT_DEAD_LETTER = -99; exports.UPLOAD = -100; diff --git a/Common/sources/utils.js b/Common/sources/utils.js index 5f314f2d..8a21e160 100644 --- a/Common/sources/utils.js +++ b/Common/sources/utils.js @@ -170,7 +170,16 @@ function* walkDir(fsPath, results, optNoSubDir, optOnlyFolders) { const list = yield fsReadDir(fsPath); for (let i = 0; i < list.length; ++i) { const file = path.join(fsPath, list[i]); - const stats = yield fsStat(file); + let stats; + try { + stats = yield fsStat(file); + } catch (e) { + //exception if fsPath not exist + stats = null; + } + if (!stats) { + continue; + } if (stats.isDirectory()) { if (optNoSubDir) { optOnlyFolders && results.push(file); @@ -554,6 +563,7 @@ exports.mapAscServerErrorToOldError = function(error) { case constants.CONVERT_CORRUPTED : case constants.CONVERT_UNKNOWN_FORMAT : case constants.CONVERT_READ_FILE : + case constants.CONVERT_TEMPORARY : case constants.CONVERT : res = -3; break; diff --git a/DocService/sources/canvasservice.js b/DocService/sources/canvasservice.js index c3969b65..3ecae9ac 100644 --- a/DocService/sources/canvasservice.js +++ b/DocService/sources/canvasservice.js @@ -404,6 +404,8 @@ async function getUpdateResponse(ctx, cmd) { updateTask.password = password; } } + } else if (constants.CONVERT_TEMPORARY === statusInfo) { + updateTask.status = commonDefines.FileStatus.ErrToReload; } else if (constants.CONVERT_DOWNLOAD === statusInfo) { updateTask.status = commonDefines.FileStatus.ErrToReload; } else if (constants.CONVERT_LIMITS === statusInfo) { diff --git a/FileConverter/sources/converter.js b/FileConverter/sources/converter.js index ef05f947..3c5a43cc 100644 --- a/FileConverter/sources/converter.js +++ b/FileConverter/sources/converter.js @@ -1221,7 +1221,7 @@ function createErrorResponse(ctx, task){ ctx.logger.debug('createErrorResponse'); //simulate error response let cmd = task.getCmd(); - cmd.setStatusInfo(constants.CONVERT); + cmd.setStatusInfo(constants.CONVERT_TEMPORARY); let res = new commonDefines.TaskQueueData(); res.setCtx(ctx); res.setCmd(cmd);