diff --git a/lib/connections/relay_dial.go b/lib/connections/relay_dial.go index fcd696e46..d859859fb 100644 --- a/lib/connections/relay_dial.go +++ b/lib/connections/relay_dial.go @@ -21,7 +21,7 @@ import ( const relayPriority = 200 func init() { - dialers["relay"] = newRelayDialer + dialers["relay"] = relayDialerFactory{} } type relayDialer struct { @@ -74,9 +74,15 @@ func (d *relayDialer) String() string { return "Relay Dialer" } -func newRelayDialer(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { +type relayDialerFactory struct{} + +func (relayDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { return &relayDialer{ cfg: cfg, tlsCfg: tlsCfg, } } + +func (relayDialerFactory) Priority() int { + return relayPriority +} diff --git a/lib/connections/service.go b/lib/connections/service.go index d98265d9d..857b44803 100644 --- a/lib/connections/service.go +++ b/lib/connections/service.go @@ -240,6 +240,13 @@ func (s *Service) connect() { delay := time.Second sleep := time.Second + bestDialerPrio := 1<<31 - 1 // worse prio won't build on 32 bit + for _, df := range dialers { + if prio := df.Priority(); prio < bestDialerPrio { + bestDialerPrio = prio + } + } + for { l.Debugln("Reconnect loop") @@ -257,13 +264,18 @@ func (s *Service) connect() { continue } - l.Debugln("Reconnect loop for", deviceID) - connected := s.model.ConnectedTo(deviceID) s.curConMut.Lock() ct := s.currentConnection[deviceID] s.curConMut.Unlock() + if connected && ct.Priority == bestDialerPrio { + // Things are already as good as they can get. + continue + } + + l.Debugln("Reconnect loop for", deviceID) + var addrs []string for _, addr := range deviceCfg.Addresses { if addr == "dynamic" { @@ -292,7 +304,7 @@ func (s *Service) connect() { continue } - dialer := dialerFactory(s.cfg, s.tlsCfg) + dialer := dialerFactory.New(s.cfg, s.tlsCfg) nextDialAt, ok := nextDial[uri.String()] // See below for comments on this delay >= sleep check diff --git a/lib/connections/structs.go b/lib/connections/structs.go index e9e04e9c4..73fb9e124 100644 --- a/lib/connections/structs.go +++ b/lib/connections/structs.go @@ -28,7 +28,10 @@ type Connection struct { protocol.Connection } -type dialerFactory func(*config.Wrapper, *tls.Config) genericDialer +type dialerFactory interface { + New(*config.Wrapper, *tls.Config) genericDialer + Priority() int +} type genericDialer interface { Dial(protocol.DeviceID, *url.URL) (IntermediateConnection, error) diff --git a/lib/connections/tcp_dial.go b/lib/connections/tcp_dial.go index be413e915..2d111dda0 100644 --- a/lib/connections/tcp_dial.go +++ b/lib/connections/tcp_dial.go @@ -21,7 +21,7 @@ const tcpPriority = 10 func init() { for _, scheme := range []string{"tcp", "tcp4", "tcp6"} { - dialers[scheme] = newTCPDialer + dialers[scheme] = tcpDialerFactory{} } } @@ -67,9 +67,15 @@ func (d *tcpDialer) String() string { return "TCP Dialer" } -func newTCPDialer(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { +type tcpDialerFactory struct{} + +func (tcpDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { return &tcpDialer{ cfg: cfg, tlsCfg: tlsCfg, } } + +func (tcpDialerFactory) Priority() int { + return tcpPriority +}