p2p/discover: permit temporary bond failures for previously known nodes

This commit is contained in:
Péter Szilágyi 2015-05-25 15:22:54 +03:00 committed by Felix Lange
parent 6078aa08eb
commit 5076170f34
1 changed files with 15 additions and 12 deletions

View File

@ -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,12 +346,14 @@ func (tab *Table) bond(pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16
delete(tab.bonding, id)
tab.bondmu.Unlock()
}
// Retrieve the bonding results
result = w.err
if result == nil {
node = w.n
if w.err != nil {
return nil, w.err
}
}
// Bonding succeeded, add to the table and reset previous findnode failures
// Even if bonding temporarily failed, give the node a chance
if node != nil {
tab.mutex.Lock()
defer tab.mutex.Unlock()
@ -359,8 +362,8 @@ func (tab *Table) bond(pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16
tab.pingreplace(node, b)
}
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) {