forked from cerc-io/plugeth
p2p/discover: permit temporary bond failures for previously known nodes
This commit is contained in:
parent
6078aa08eb
commit
5076170f34
@ -324,6 +324,7 @@ func (tab *Table) bond(pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16
|
||||
fails = tab.db.findFails(id)
|
||||
}
|
||||
// If the node is unknown (non-bonded) or failed (remotely unknown), bond from scratch
|
||||
var result error
|
||||
if node == nil || fails > 0 {
|
||||
glog.V(logger.Detail).Infof("Bonding %x: known=%v, fails=%v", id[:8], node != nil, fails)
|
||||
|
||||
@ -345,22 +346,24 @@ func (tab *Table) bond(pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16
|
||||
delete(tab.bonding, id)
|
||||
tab.bondmu.Unlock()
|
||||
}
|
||||
node = w.n
|
||||
if w.err != nil {
|
||||
return nil, w.err
|
||||
// Retrieve the bonding results
|
||||
result = w.err
|
||||
if result == nil {
|
||||
node = w.n
|
||||
}
|
||||
}
|
||||
// Bonding succeeded, add to the table and reset previous findnode failures
|
||||
tab.mutex.Lock()
|
||||
defer tab.mutex.Unlock()
|
||||
// Even if bonding temporarily failed, give the node a chance
|
||||
if node != nil {
|
||||
tab.mutex.Lock()
|
||||
defer tab.mutex.Unlock()
|
||||
|
||||
b := tab.buckets[logdist(tab.self.sha, node.sha)]
|
||||
if !b.bump(node) {
|
||||
tab.pingreplace(node, b)
|
||||
b := tab.buckets[logdist(tab.self.sha, node.sha)]
|
||||
if !b.bump(node) {
|
||||
tab.pingreplace(node, b)
|
||||
}
|
||||
tab.db.updateFindFails(id, 0)
|
||||
}
|
||||
tab.db.updateFindFails(id, 0)
|
||||
|
||||
return node, nil
|
||||
return node, result
|
||||
}
|
||||
|
||||
func (tab *Table) pingpong(w *bondproc, pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16) {
|
||||
|
Loading…
Reference in New Issue
Block a user