From f2191e94b3b5c5ca8714b52cfa24f0d135414386 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 11 Mar 2016 22:42:04 +0000 Subject: [PATCH] Better handling of zero-length flow files Closes #819 If a flow file is found to be zero-bytes: If there is a non-empty backup, restore the backup and resolve If there is no backup or it is also empty, resolve empty flow If a flow file is found to be invalid json: Log and resolve empty flow --- red/runtime/storage/localfilesystem.js | 40 +++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/red/runtime/storage/localfilesystem.js b/red/runtime/storage/localfilesystem.js index 35d89f8aa..1ba46adeb 100644 --- a/red/runtime/storage/localfilesystem.js +++ b/red/runtime/storage/localfilesystem.js @@ -1,5 +1,5 @@ /** - * Copyright 2013, 2014 IBM Corp. + * Copyright 2013, 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -199,10 +199,42 @@ var localfilesystem = { } fs.readFile(flowsFullPath,'utf8',function(err,data) { if (!err) { - return resolve(JSON.parse(data)); + if (data.length === 0) { + log.warn(log._("storage.localfilesystem.empty")); + try { + var backupStat = fs.statSync(flowsFileBackup); + if (backupStat.size === 0) { + // Empty flows, empty backup - return empty flow + return resolve([]); + } + // Empty flows, restore backup + log.warn(log._("storage.localfilesystem.restore",{path:flowsFileBackup})); + fs.copy(flowsFileBackup,flowsFullPath,function(backupCopyErr) { + if (backupCopyErr) { + // Restore backup failed + log.warn(log._("storage.localfilesystem.restore-fail",{message:backupCopyErr.toString()})); + resolve([]); + } else { + // Loop back in to load the restored backup + resolve(localfilesystem.getFlows()); + } + }); + return; + } catch(backupStatErr) { + // Empty flow file, no back-up file + return resolve([]); + } + } + try { + return resolve(JSON.parse(data)); + } catch(parseErr) { + log.warn(log._("storage.localfilesystem.invalid")); + return resolve([]); + } + } else { + log.info(log._("storage.localfilesystem.create")); + resolve([]); } - log.info(log._("storage.localfilesystem.create")); - resolve([]); }); }); },