MM-27570,MM-27757 - Activate/Deactivate plugins concurrently (#15244)
* Start plugins concurrently * Determine which plugins need to be activated/deactivated before changing their state * Test activation/deactivation of plugins in TestSyncPluginsActiveState * Change test comments * remove unneeded temp var
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
eaabf96b1b
Коммит
2029a3b48a
@@ -86,46 +86,52 @@ func (a *App) SyncPluginsActiveState() {
|
||||
return
|
||||
}
|
||||
|
||||
// Deactivate any plugins that have been disabled.
|
||||
// Determine which plugins need to be activated or deactivated.
|
||||
disabledPlugins := []*model.BundleInfo{}
|
||||
enabledPlugins := []*model.BundleInfo{}
|
||||
for _, plugin := range availablePlugins {
|
||||
// Determine if plugin is enabled
|
||||
pluginId := plugin.Manifest.Id
|
||||
pluginEnabled := false
|
||||
if state, ok := config.PluginStates[pluginId]; ok {
|
||||
pluginEnabled = state.Enable
|
||||
}
|
||||
|
||||
// If it's not enabled we need to deactivate it
|
||||
if !pluginEnabled {
|
||||
deactivated := pluginsEnvironment.Deactivate(pluginId)
|
||||
if pluginEnabled {
|
||||
enabledPlugins = append(enabledPlugins, plugin)
|
||||
} else {
|
||||
disabledPlugins = append(disabledPlugins, plugin)
|
||||
}
|
||||
}
|
||||
|
||||
// Concurrently activate/deactivate each plugin appropriately.
|
||||
var wg sync.WaitGroup
|
||||
|
||||
// Deactivate any plugins that have been disabled.
|
||||
for _, plugin := range disabledPlugins {
|
||||
wg.Add(1)
|
||||
go func(plugin *model.BundleInfo) {
|
||||
defer wg.Done()
|
||||
|
||||
deactivated := pluginsEnvironment.Deactivate(plugin.Manifest.Id)
|
||||
if deactivated && plugin.Manifest.HasClient() {
|
||||
message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_PLUGIN_DISABLED, "", "", "", nil)
|
||||
message.Add("manifest", plugin.Manifest.ClientManifest())
|
||||
a.Publish(message)
|
||||
}
|
||||
}
|
||||
}(plugin)
|
||||
}
|
||||
|
||||
// Activate any plugins that have been enabled
|
||||
for _, plugin := range availablePlugins {
|
||||
if plugin.Manifest == nil {
|
||||
plugin.WrapLogger(a.Log()).Error("Plugin manifest could not be loaded", mlog.Err(plugin.ManifestError))
|
||||
continue
|
||||
}
|
||||
for _, plugin := range enabledPlugins {
|
||||
wg.Add(1)
|
||||
go func(plugin *model.BundleInfo) {
|
||||
defer wg.Done()
|
||||
|
||||
// Determine if plugin is enabled
|
||||
pluginId := plugin.Manifest.Id
|
||||
pluginEnabled := false
|
||||
if state, ok := config.PluginStates[pluginId]; ok {
|
||||
pluginEnabled = state.Enable
|
||||
}
|
||||
|
||||
// Activate plugin if enabled
|
||||
if pluginEnabled {
|
||||
pluginId := plugin.Manifest.Id
|
||||
updatedManifest, activated, err := pluginsEnvironment.Activate(pluginId)
|
||||
if err != nil {
|
||||
plugin.WrapLogger(a.Log()).Error("Unable to activate plugin", mlog.Err(err))
|
||||
continue
|
||||
return
|
||||
}
|
||||
|
||||
if activated {
|
||||
@@ -134,8 +140,9 @@ func (a *App) SyncPluginsActiveState() {
|
||||
a.Log().Error("Failed to notify cluster on plugin enable", mlog.Err(err))
|
||||
}
|
||||
}
|
||||
}
|
||||
}(plugin)
|
||||
}
|
||||
wg.Wait()
|
||||
} else { // If plugins are disabled, shutdown plugins.
|
||||
pluginsEnvironment.Shutdown()
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user