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 {
|
if err != nil && err != cmn.ErrAlreadyStarted {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := r.checkSeeds(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
go r.ensurePeersRoutine()
|
go r.ensurePeersRoutine()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -222,6 +227,11 @@ func (r *PEXReactor) ensurePeersRoutine() {
|
|||||||
ensurePeersPeriodMs := r.ensurePeersPeriod.Nanoseconds() / 1e6
|
ensurePeersPeriodMs := r.ensurePeersPeriod.Nanoseconds() / 1e6
|
||||||
time.Sleep(time.Duration(rand.Int63n(ensurePeersPeriodMs)) * time.Millisecond)
|
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)
|
ticker := time.NewTicker(r.ensurePeersPeriod)
|
||||||
for {
|
for {
|
||||||
select {
|
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 {
|
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.Logger.Info("No addresses to dial nor connected peers. Falling back to seeds")
|
||||||
r.Switch.DialPeersAsync(r.book, r.config.Seeds, false)
|
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