mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-30 05:01:44 +00:00
improve seed dialing logic
This commit is contained in:
@ -72,6 +72,11 @@ func (r *PEXReactor) OnStart() error {
|
||||
if err != nil && err != cmn.ErrAlreadyStarted {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := r.checkSeeds(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go r.ensurePeersRoutine()
|
||||
return nil
|
||||
}
|
||||
@ -222,6 +227,11 @@ func (r *PEXReactor) ensurePeersRoutine() {
|
||||
ensurePeersPeriodMs := r.ensurePeersPeriod.Nanoseconds() / 1e6
|
||||
time.Sleep(time.Duration(rand.Int63n(ensurePeersPeriodMs)) * time.Millisecond)
|
||||
|
||||
// fire once immediately.
|
||||
// ensures we dial the seeds right away if the book is empty
|
||||
r.ensurePeers()
|
||||
|
||||
// fire periodically
|
||||
ticker := time.NewTicker(r.ensurePeersPeriod)
|
||||
for {
|
||||
select {
|
||||
@ -301,10 +311,43 @@ func (r *PEXReactor) ensurePeers() {
|
||||
}
|
||||
}
|
||||
|
||||
// If we are not connected to nor dialing anybody, fallback to dialing seeds.
|
||||
// If we are not connected to nor dialing anybody, fallback to dialing a seed.
|
||||
if numOutPeers+numInPeers+numDialing+len(toDial) == 0 {
|
||||
r.Logger.Info("No addresses to dial nor connected peers. Will dial seeds", "seeds", r.config.Seeds)
|
||||
r.Switch.DialPeersAsync(r.book, r.config.Seeds, false)
|
||||
r.Logger.Info("No addresses to dial nor connected peers. Falling back to seeds")
|
||||
r.dialSeed()
|
||||
}
|
||||
}
|
||||
|
||||
func (r *PEXReactor) checkSeeds() error {
|
||||
lSeeds := len(r.config.Seeds)
|
||||
if lSeeds > 0 {
|
||||
seedAddrs, errs := NewNetAddressStrings(r.config.Seeds)
|
||||
for _, err := range errs {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *PEXReactor) dialSeed() error {
|
||||
lSeeds := len(r.config.Seeds)
|
||||
if lSeeds > 0 {
|
||||
seedAddrs, _ := NewNetAddressStrings(r.config.Seeds)
|
||||
|
||||
perm := r.Switch.rng.Perm(lSeeds)
|
||||
for _, i := range perm {
|
||||
// dial a random seed
|
||||
seedAddr := seedAddrs[i]
|
||||
peer, err := sw.DialPeerWithAddress(seedAddr, false)
|
||||
if err != nil {
|
||||
sw.Logger.Error("Error dialing seed", "err", err, "seed", seedAddr)
|
||||
} else {
|
||||
sw.Logger.Info("Connected to seed", "peer", peer)
|
||||
return
|
||||
}
|
||||
}
|
||||
sw.Logger.Error("Couldn't connect to any seeds")
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user