From e1c7d35ce4bf988999d0610a1574a0c2d53bbea0 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Sun, 7 Mar 2021 13:39:17 +0100 Subject: [PATCH] Fix plugin shutdown not called on bad startup During startup the plugins are loaded one by one and init is called for each of them. But due to the already loaded plugins being discarded if one of the plugins throw an error an unclean shutdown that might hang on timers started by plugins occurs. This leads to the master server starting up, printing an error, displaying the shutdown sequence and then hang forever. Fix by storing the plugins loaded into masterPlugins as they are loaded instead only after all of them have been loaded. --- packages/master/master.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/master/master.js b/packages/master/master.js index 6db0952f..b7af2e5d 100755 --- a/packages/master/master.js +++ b/packages/master/master.js @@ -1693,7 +1693,6 @@ ${err.stack}` }); async function loadPlugins() { - let plugins = new Map(); for (let pluginInfo of pluginInfos) { if (!masterConfig.group(pluginInfo.name).get("load_plugin")) { continue; @@ -1712,7 +1711,7 @@ async function loadPlugins() { pluginInfo, { app, config: masterConfig, db, slaveConnections }, { endpointHitCounter }, logger ); await masterPlugin.init(); - plugins.set(pluginInfo.name, masterPlugin); + masterPlugins.set(pluginInfo.name, masterPlugin); } catch (err) { throw new libErrors.PluginError(pluginInfo.name, err); @@ -1720,13 +1719,12 @@ async function loadPlugins() { logger.info(`Loaded plugin ${pluginInfo.name} in ${Date.now() - pluginLoadStarted}ms`); } - return plugins; } // handle plugins on the master async function pluginManagement() { let startPluginLoad = Date.now(); - masterPlugins = await loadPlugins(); + await loadPlugins(); logger.info(`All plugins loaded in ${Date.now() - startPluginLoad}ms`); }