lib/connections: Separate listener supervisors and lower backoff time (#7644)
This commit is contained in:
+11
-15
@@ -171,19 +171,6 @@ func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *t
|
|||||||
listenersMut: sync.NewRWMutex(),
|
listenersMut: sync.NewRWMutex(),
|
||||||
listeners: make(map[string]genericListener),
|
listeners: make(map[string]genericListener),
|
||||||
listenerTokens: make(map[string]suture.ServiceToken),
|
listenerTokens: make(map[string]suture.ServiceToken),
|
||||||
|
|
||||||
// A listener can fail twice, rapidly. Any more than that and it
|
|
||||||
// will be put on suspension for ten minutes. Restarts and changes
|
|
||||||
// due to config are done by removing and adding services, so are
|
|
||||||
// not subject to these limitations.
|
|
||||||
listenerSupervisor: suture.New("c.S.listenerSupervisor", suture.Spec{
|
|
||||||
EventHook: func(e suture.Event) {
|
|
||||||
l.Infoln(e)
|
|
||||||
},
|
|
||||||
FailureThreshold: 2,
|
|
||||||
FailureBackoff: 600 * time.Second,
|
|
||||||
PassThroughPanics: true,
|
|
||||||
}),
|
|
||||||
}
|
}
|
||||||
cfg.Subscribe(service)
|
cfg.Subscribe(service)
|
||||||
|
|
||||||
@@ -201,7 +188,6 @@ func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *t
|
|||||||
|
|
||||||
service.Add(svcutil.AsService(service.connect, fmt.Sprintf("%s/connect", service)))
|
service.Add(svcutil.AsService(service.connect, fmt.Sprintf("%s/connect", service)))
|
||||||
service.Add(svcutil.AsService(service.handle, fmt.Sprintf("%s/handle", service)))
|
service.Add(svcutil.AsService(service.handle, fmt.Sprintf("%s/handle", service)))
|
||||||
service.Add(service.listenerSupervisor)
|
|
||||||
service.Add(service.natService)
|
service.Add(service.natService)
|
||||||
|
|
||||||
svcutil.OnSupervisorDone(service.Supervisor, func() {
|
svcutil.OnSupervisorDone(service.Supervisor, func() {
|
||||||
@@ -648,8 +634,18 @@ func (s *service) createListener(factory listenerFactory, uri *url.URL) bool {
|
|||||||
|
|
||||||
listener := factory.New(uri, s.cfg, s.tlsCfg, s.conns, s.natService)
|
listener := factory.New(uri, s.cfg, s.tlsCfg, s.conns, s.natService)
|
||||||
listener.OnAddressesChanged(s.logListenAddressesChangedEvent)
|
listener.OnAddressesChanged(s.logListenAddressesChangedEvent)
|
||||||
|
|
||||||
|
// Retrying a listener many times in rapid succession is unlikely to help,
|
||||||
|
// thus back off quickly. A listener may soon be functional again, e.g. due
|
||||||
|
// to a network interface coming back online - retry every minute.
|
||||||
|
spec := svcutil.SpecWithInfoLogger(l)
|
||||||
|
spec.FailureThreshold = 2
|
||||||
|
spec.FailureBackoff = time.Minute
|
||||||
|
sup := suture.New(fmt.Sprintf("listenerSupervisor@%v", listener), spec)
|
||||||
|
sup.Add(listener)
|
||||||
|
|
||||||
s.listeners[uri.String()] = listener
|
s.listeners[uri.String()] = listener
|
||||||
s.listenerTokens[uri.String()] = s.listenerSupervisor.Add(listener)
|
s.listenerTokens[uri.String()] = s.Add(sup)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user