diff --git a/config.go b/config.go index afef1993..2441f110 100644 --- a/config.go +++ b/config.go @@ -53,6 +53,7 @@ const ( defaultInactiveChanTimeout = 20 * time.Minute defaultMaxLogFiles = 3 defaultMaxLogFileSize = 10 + defaultMinBackoff = time.Second defaultMaxBackoff = time.Hour defaultTorSOCKSPort = 9050 @@ -197,6 +198,7 @@ type config struct { ExternalIPs []net.Addr DisableListen bool `long:"nolisten" description:"Disable listening for incoming peer connections"` NAT bool `long:"nat" description:"Toggle NAT traversal support (using either UPnP or NAT-PMP) to automatically advertise your external IP address to the network -- NOTE this does not support devices behind multiple NATs"` + MinBackoff time.Duration `long:"minbackoff" description:"Shortest backoff when reconnecting to persistent peers. Valid time units are {s, m, h}."` MaxBackoff time.Duration `long:"maxbackoff" description:"Longest backoff when reconnecting to persistent peers. Valid time units are {s, m, h}."` DebugLevel string `short:"d" long:"debuglevel" description:"Logging level for all subsystems {trace, debug, info, warn, error, critical} -- You may also specify =,=,... to set the log level for individual subsystems -- Use show to list available subsystems"` @@ -300,6 +302,7 @@ func loadConfig() (*config, error) { }, MaxPendingChannels: defaultMaxPendingChannels, NoSeedBackup: defaultNoSeedBackup, + MinBackoff: defaultMinBackoff, MaxBackoff: defaultMaxBackoff, SubRPCServers: &subRPCServerConfigs{ SignRPC: &signrpc.Config{}, @@ -959,6 +962,13 @@ func loadConfig() (*config, error) { } } + // Ensure that the specified minimum backoff is below or equal to the + // maximum backoff. + if cfg.MinBackoff > cfg.MaxBackoff { + return nil, fmt.Errorf("maxbackoff must be greater than " + + "minbackoff") + } + // Finally, ensure that the user's color is correctly formatted, // otherwise the server will not be able to start after the unlocking // the wallet. diff --git a/server.go b/server.go index ab5f39bc..c3378839 100644 --- a/server.go +++ b/server.go @@ -49,10 +49,6 @@ const ( // connected to. defaultMinPeers = 3 - // defaultBackoff is the starting point for exponential backoff for - // reconnecting to persistent peers. - defaultBackoff = time.Second - // defaultStableConnDuration is a floor under which all reconnection // attempts will apply exponential randomized backoff. Connections // durations exceeding this value will be eligible to have their @@ -1752,7 +1748,7 @@ func (s *server) establishPersistentConnections() error { // persistent connection with. s.persistentPeers[pubStr] = struct{}{} if _, ok := s.persistentPeersBackoff[pubStr]; !ok { - s.persistentPeersBackoff[pubStr] = defaultBackoff + s.persistentPeersBackoff[pubStr] = cfg.MinBackoff } for _, address := range nodeAddr.addresses { @@ -2023,7 +2019,7 @@ func (s *server) nextPeerBackoff(pubStr string, backoff, ok := s.persistentPeersBackoff[pubStr] if !ok { // If an existing backoff was unknown, use the default. - return defaultBackoff + return cfg.MinBackoff } // If the peer failed to start properly, we'll just use the previous @@ -2045,17 +2041,17 @@ func (s *server) nextPeerBackoff(pubStr string, // reduce the timeout duration by the length of the connection after // applying randomized exponential backoff. We'll only apply this in the // case that: - // reb(curBackoff) - connDuration > defaultBackoff + // reb(curBackoff) - connDuration > cfg.MinBackoff relaxedBackoff := computeNextBackoff(backoff) - connDuration - if relaxedBackoff > defaultBackoff { + if relaxedBackoff > cfg.MinBackoff { return relaxedBackoff } - // Lastly, if reb(currBackoff) - connDuration <= defaultBackoff, meaning + // Lastly, if reb(currBackoff) - connDuration <= cfg.MinBackoff, meaning // the stable connection lasted much longer than our previous backoff. // To reward such good behavior, we'll reconnect after the default // timeout. - return defaultBackoff + return cfg.MinBackoff } // shouldDropConnection determines if our local connection to a remote peer @@ -2711,7 +2707,7 @@ func (s *server) ConnectToPeer(addr *lnwire.NetAddress, perm bool) error { s.persistentPeers[targetPub] = struct{}{} if _, ok := s.persistentPeersBackoff[targetPub]; !ok { - s.persistentPeersBackoff[targetPub] = defaultBackoff + s.persistentPeersBackoff[targetPub] = cfg.MinBackoff } s.persistentConnReqs[targetPub] = append( s.persistentConnReqs[targetPub], connReq)