|
|
|
@ -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) { |
|
|
|
|