aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/discv5/udp.go
diff options
context:
space:
mode:
authorFelföldi Zsolt <zsfelfoldi@gmail.com>2018-02-09 01:06:31 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-02-09 01:06:31 +0800
commitc4712bf96bc1bae4a5ad4600e9719e4a74bde7d5 (patch)
tree9b1faeb171246e07d9b43c97671e1b5f94510740 /p2p/discv5/udp.go
parent2b4c7e9b37958984525ba63f2ec637662b384090 (diff)
downloaddexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar.gz
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar.bz2
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar.lz
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar.xz
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.tar.zst
dexon-c4712bf96bc1bae4a5ad4600e9719e4a74bde7d5.zip
p2p/discv5: fix multiple discovery issues (#16036)
* p2p/discv5: add query delay, fix node address update logic, retry refresh if empty * p2p/discv5: remove unnecessary ping before topic query * p2p/discv5: do not filter local address from topicNodes * p2p/discv5: remove canQuery() * p2p/discv5: gofmt
Diffstat (limited to 'p2p/discv5/udp.go')
-rw-r--r--p2p/discv5/udp.go20
1 files changed, 10 insertions, 10 deletions
diff --git a/p2p/discv5/udp.go b/p2p/discv5/udp.go
index 543771817..6ce72d2c1 100644
--- a/p2p/discv5/udp.go
+++ b/p2p/discv5/udp.go
@@ -49,7 +49,7 @@ var (
// Timeouts
const (
respTimeout = 500 * time.Millisecond
- sendTimeout = 500 * time.Millisecond
+ queryDelay = 1000 * time.Millisecond
expiration = 20 * time.Second
ntpFailureThreshold = 32 // Continuous timeouts after which to check NTP
@@ -318,20 +318,20 @@ func (t *udp) sendTopicRegister(remote *Node, topics []Topic, idx int, pong []by
func (t *udp) sendTopicNodes(remote *Node, queryHash common.Hash, nodes []*Node) {
p := topicNodes{Echo: queryHash}
- if len(nodes) == 0 {
- t.sendPacket(remote.ID, remote.addr(), byte(topicNodesPacket), p)
- return
- }
- for i, result := range nodes {
- if netutil.CheckRelayIP(remote.IP, result.IP) != nil {
- continue
+ var sent bool
+ for _, result := range nodes {
+ if result.IP.Equal(t.net.tab.self.IP) || netutil.CheckRelayIP(remote.IP, result.IP) == nil {
+ p.Nodes = append(p.Nodes, nodeToRPC(result))
}
- p.Nodes = append(p.Nodes, nodeToRPC(result))
- if len(p.Nodes) == maxTopicNodes || i == len(nodes)-1 {
+ if len(p.Nodes) == maxTopicNodes {
t.sendPacket(remote.ID, remote.addr(), byte(topicNodesPacket), p)
p.Nodes = p.Nodes[:0]
+ sent = true
}
}
+ if !sent || len(p.Nodes) > 0 {
+ t.sendPacket(remote.ID, remote.addr(), byte(topicNodesPacket), p)
+ }
}
func (t *udp) sendPacket(toid NodeID, toaddr *net.UDPAddr, ptype byte, req interface{}) (hash []byte, err error) {