diff options
author | Jakob Borg <jakob@nym.se> | 2016-05-09 15:33:25 +0000 |
---|---|---|
committer | Audrius Butkevicius <audrius.butkevicius@gmail.com> | 2016-05-09 15:33:25 +0000 |
commit | d77d8ff80330888f3c67db8d9c9cd2622af3ea59 (patch) | |
tree | 0edad48f1ce7d56a142129cc60f226eccf1119eb | |
parent | 31f64186ae03999b2709782a523f7e7e7f510dbe (diff) |
lib/connections: Don't look at devices that are already optimally connected
Just an optimization. Required exposing the priority from the factory,
so made that an interface with an extra method instead of just a func
type.
GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3071
-rw-r--r-- | lib/connections/relay_dial.go | 10 | ||||
-rw-r--r-- | lib/connections/service.go | 18 | ||||
-rw-r--r-- | lib/connections/structs.go | 5 | ||||
-rw-r--r-- | lib/connections/tcp_dial.go | 10 |
4 files changed, 35 insertions, 8 deletions
diff --git a/lib/connections/relay_dial.go b/lib/connections/relay_dial.go index fcd696e468..d859859fb1 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 d98265d9d9..857b448039 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 e9e04e9c42..73fb9e1247 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 be413e9157..2d111dda08 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 +} |