Fix goroutine leak in throttler logic.

This commit is contained in:
Timo Reimann 2018-01-23 12:44:03 +01:00 committed by Traefiker
parent b6af61fa6e
commit 4cc17e112f

View file

@ -66,6 +66,7 @@ type Server struct {
stopChan chan bool stopChan chan bool
providers []provider.Provider providers []provider.Provider
currentConfigurations safe.Safe currentConfigurations safe.Safe
providerConfigUpdateMap map[string]chan types.ConfigMessage
globalConfiguration configuration.GlobalConfiguration globalConfiguration configuration.GlobalConfiguration
accessLoggerMiddleware *accesslog.LogHandler accessLoggerMiddleware *accesslog.LogHandler
routinesPool *safe.Pool routinesPool *safe.Pool
@ -105,6 +106,7 @@ func NewServer(globalConfiguration configuration.GlobalConfiguration) *Server {
server.configureSignals() server.configureSignals()
currentConfigurations := make(types.Configurations) currentConfigurations := make(types.Configurations)
server.currentConfigurations.Set(currentConfigurations) server.currentConfigurations.Set(currentConfigurations)
server.providerConfigUpdateMap = make(map[string]chan types.ConfigMessage)
server.globalConfiguration = globalConfiguration server.globalConfiguration = globalConfiguration
if server.globalConfiguration.API != nil { if server.globalConfiguration.API != nil {
server.globalConfiguration.API.CurrentConfigurations = &server.currentConfigurations server.globalConfiguration.API.CurrentConfigurations = &server.currentConfigurations
@ -350,7 +352,6 @@ func (s *Server) listenProviders(stop chan bool) {
} }
func (s *Server) preLoadConfiguration(configMsg types.ConfigMessage) { func (s *Server) preLoadConfiguration(configMsg types.ConfigMessage) {
providerConfigUpdateMap := map[string]chan types.ConfigMessage{}
providersThrottleDuration := time.Duration(s.globalConfiguration.ProvidersThrottleDuration) providersThrottleDuration := time.Duration(s.globalConfiguration.ProvidersThrottleDuration)
s.defaultConfigurationValues(configMsg.Configuration) s.defaultConfigurationValues(configMsg.Configuration)
currentConfigurations := s.currentConfigurations.Get().(types.Configurations) currentConfigurations := s.currentConfigurations.Get().(types.Configurations)
@ -361,14 +362,15 @@ func (s *Server) preLoadConfiguration(configMsg types.ConfigMessage) {
} else if reflect.DeepEqual(currentConfigurations[configMsg.ProviderName], configMsg.Configuration) { } else if reflect.DeepEqual(currentConfigurations[configMsg.ProviderName], configMsg.Configuration) {
log.Infof("Skipping same configuration for provider %s", configMsg.ProviderName) log.Infof("Skipping same configuration for provider %s", configMsg.ProviderName)
} else { } else {
if _, ok := providerConfigUpdateMap[configMsg.ProviderName]; !ok { providerConfigUpdateCh, ok := s.providerConfigUpdateMap[configMsg.ProviderName]
providerConfigUpdate := make(chan types.ConfigMessage) if !ok {
providerConfigUpdateMap[configMsg.ProviderName] = providerConfigUpdate providerConfigUpdateCh = make(chan types.ConfigMessage)
s.providerConfigUpdateMap[configMsg.ProviderName] = providerConfigUpdateCh
s.routinesPool.Go(func(stop chan bool) { s.routinesPool.Go(func(stop chan bool) {
throttleProviderConfigReload(providersThrottleDuration, s.configurationValidatedChan, providerConfigUpdate, stop) throttleProviderConfigReload(providersThrottleDuration, s.configurationValidatedChan, providerConfigUpdateCh, stop)
}) })
} }
providerConfigUpdateMap[configMsg.ProviderName] <- configMsg providerConfigUpdateCh <- configMsg
} }
} }