in internal/plugin/manager/pluginmanager.go [275:322]
func (m *PluginManager) RemoveAllDynamicPlugins(ctx context.Context) error {
var reqs []*acpb.ConfigurePluginStates_ConfigurePlugin
galog.Infof("Removing all dynamic plugins")
var toRemove []*Plugin
for _, p := range m.list() {
if p.PluginType == PluginTypeCore {
galog.Debugf("Skipping core plugin %q, it will be removed by package manager", p.Name)
continue
}
toRemove = append(toRemove, p)
}
errChan := make(chan error, len(reqs))
wg := sync.WaitGroup{}
for _, plugin := range toRemove {
wg.Add(1)
go func(p *Plugin) {
var err error
defer wg.Done()
if err = m.StopPlugin(ctx, p.Name); err != nil {
galog.Infof("Remove plugin %q completed with error: [%v]", p.FullName(), err)
errChan <- err
}
}(plugin)
}
go func() {
wg.Wait()
baseStateDir := baseState()
if file.Exists(baseStateDir, file.TypeDir) {
if err := os.RemoveAll(baseStateDir); err != nil {
errChan <- fmt.Errorf("failed to remove file %q: %w", baseStateDir, err)
}
}
close(errChan)
}()
var errs error
for err := range errChan {
errs = errors.Join(errs, err)
}
return errs
}