46 lines
754 B
Go
46 lines
754 B
Go
package peer
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
func (r *Router) manageMediator() {
|
|
var (
|
|
ip = byte(0)
|
|
mediators = make([]*route, 0, 32)
|
|
)
|
|
|
|
for range time.Tick(8 * time.Second) {
|
|
// If the current mediator is up, keep it.
|
|
route := r.routes[ip].Load()
|
|
if route != nil && route.Up {
|
|
continue
|
|
}
|
|
|
|
// If the current mediator is up, keep it.
|
|
mediators = mediators[:0]
|
|
|
|
for i := range r.routes {
|
|
route := r.routes[i].Load()
|
|
if route == nil || !route.Mediator {
|
|
continue
|
|
}
|
|
|
|
mediators = append(mediators, route)
|
|
}
|
|
|
|
if len(mediators) == 0 {
|
|
ip = 0
|
|
} else {
|
|
ip = mediators[rand.Intn(len(mediators))].PeerIP
|
|
}
|
|
|
|
for _, conn := range r.conns {
|
|
if conn != nil {
|
|
conn.UpdateMediator(ip)
|
|
}
|
|
}
|
|
}
|
|
}
|