aboutsummaryrefslogtreecommitdiffstats
path: root/p2p
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-04-27 19:56:42 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-04-27 19:56:42 +0800
commit706da56f751a6ec98c9f2f29bebc66dffe8d1e2c (patch)
tree1b3f197f54bc328bc1b61ef4af1e755e5d855419 /p2p
parent85b4b44235aac41b95c34dbc4de7de91a597ec3c (diff)
downloaddexon-706da56f751a6ec98c9f2f29bebc66dffe8d1e2c.tar.gz
dexon-706da56f751a6ec98c9f2f29bebc66dffe8d1e2c.tar.zst
dexon-706da56f751a6ec98c9f2f29bebc66dffe8d1e2c.zip
p2p/discover: wrap the pinger to update the node db too
Diffstat (limited to 'p2p')
-rw-r--r--p2p/discover/table.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/p2p/discover/table.go b/p2p/discover/table.go
index 4058c7bb7..ecfb8d672 100644
--- a/p2p/discover/table.go
+++ b/p2p/discover/table.go
@@ -288,8 +288,7 @@ func (tab *Table) pingpong(w *bondproc, pinged bool, id NodeID, addr *net.UDPAdd
defer func() { tab.bondslots <- struct{}{} }()
// Ping the remote side and wait for a pong
- tab.db.updateLastPing(id, time.Now())
- if w.err = tab.net.ping(id, addr); w.err != nil {
+ if w.err = tab.ping(id, addr); w.err != nil {
close(w.done)
return
}
@@ -307,14 +306,13 @@ func (tab *Table) pingpong(w *bondproc, pinged bool, id NodeID, addr *net.UDPAdd
TCPPort: int(tcpPort),
}
tab.db.updateNode(w.n)
- tab.db.updateLastPong(id, time.Now())
close(w.done)
}
func (tab *Table) pingreplace(new *Node, b *bucket) {
if len(b.entries) == bucketSize {
oldest := b.entries[bucketSize-1]
- if err := tab.net.ping(oldest.ID, oldest.addr()); err == nil {
+ if err := tab.ping(oldest.ID, oldest.addr()); err == nil {
// The node responded, we don't need to replace it.
return
}
@@ -327,6 +325,19 @@ func (tab *Table) pingreplace(new *Node, b *bucket) {
b.entries[0] = new
}
+// ping a remote endpoint and wait for a reply, also updating the node database
+// accordingly.
+func (tab *Table) ping(id NodeID, addr *net.UDPAddr) error {
+ // Update the last ping and send the message
+ tab.db.updateLastPing(id, time.Now())
+ if err := tab.net.ping(id, addr); err != nil {
+ return err
+ }
+ // Pong received, update the database and return
+ tab.db.updateLastPong(id, time.Now())
+ return nil
+}
+
// add puts the entries into the table if their corresponding
// bucket is not full. The caller must hold tab.mutex.
func (tab *Table) add(entries []*Node) {