Fixed deadlock in plugin manager close

- Moved all mutex away from defer
- Updated plugin manager close logic to prevent deadlock
This commit is contained in:
Toby Chui 2025-03-11 21:22:09 +08:00
parent dfd5ef5578
commit 4a99afa2f0
3 changed files with 17 additions and 13 deletions

View File

@ -108,8 +108,8 @@ func (m *Manager) LoadPluginsFromDisk() error {
// GetPluginByID returns a plugin by its ID
func (m *Manager) GetPluginByID(pluginID string) (*Plugin, error) {
m.loadedPluginsMutex.RLock()
defer m.loadedPluginsMutex.RUnlock()
plugin, ok := m.LoadedPlugins[pluginID]
m.loadedPluginsMutex.RUnlock()
if !ok {
return nil, errors.New("plugin not found")
}
@ -155,10 +155,10 @@ func (m *Manager) GetPluginPreviousEnableState(pluginID string) bool {
func (m *Manager) ListLoadedPlugins() ([]*Plugin, error) {
plugins := []*Plugin{}
m.loadedPluginsMutex.RLock()
defer m.loadedPluginsMutex.RUnlock()
for _, plugin := range m.LoadedPlugins {
plugins = append(plugins, plugin)
}
m.loadedPluginsMutex.RUnlock()
return plugins, nil
}
@ -175,13 +175,19 @@ func (m *Manager) LogForPlugin(p *Plugin, message string, err error) {
// Terminate all plugins and exit
func (m *Manager) Close() {
m.loadedPluginsMutex.Lock()
defer m.loadedPluginsMutex.Unlock()
pluginsToStop := make([]*Plugin, 0)
for _, plugin := range m.LoadedPlugins {
if plugin.Enabled {
m.Options.Logger.PrintAndLog("plugin-manager", "Stopping plugin: "+plugin.Spec.Name, nil)
m.StopPlugin(plugin.Spec.ID)
pluginsToStop = append(pluginsToStop, plugin)
}
}
m.loadedPluginsMutex.Unlock()
for _, thisPlugin := range pluginsToStop {
m.Options.Logger.PrintAndLog("plugin-manager", "Stopping plugin: "+thisPlugin.Spec.Name, nil)
m.StopPlugin(thisPlugin.Spec.ID)
}
}
/* Plugin Functions */

View File

@ -46,7 +46,6 @@ func (m *Manager) GetForwarderRadixTreeFromPlugins(pluginIds []string) *radix.Tr
// Iterate over the loaded plugins and insert their paths into the radix tree
m.loadedPluginsMutex.RLock()
defer m.loadedPluginsMutex.RUnlock()
for _, plugin := range m.LoadedPlugins {
if !plugin.Enabled {
//Ignore disabled plugins
@ -90,6 +89,6 @@ func (m *Manager) GetForwarderRadixTreeFromPlugins(pluginIds []string) *radix.Tr
}
}
}
m.loadedPluginsMutex.RUnlock()
return r
}

View File

@ -320,12 +320,11 @@ func startupSequence() {
},
})
/*
err = pluginManager.LoadPluginsFromDisk()
if err != nil {
SystemWideLogger.PrintAndLog("Plugin Manager", "Failed to load plugins", err)
}
*/
err = pluginManager.LoadPluginsFromDisk()
if err != nil {
SystemWideLogger.PrintAndLog("Plugin Manager", "Failed to load plugins", err)
}
/* Docker UX Optimizer */
if runtime.GOOS == "windows" && *runningInDocker {
SystemWideLogger.PrintAndLog("warning", "Invalid start flag combination: docker=true && runtime.GOOS == windows. Running in docker UX development mode.", nil)