mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
p2p/discv5: add query delay, fix node address update logic, retry refresh if empty
This commit is contained in:
parent
1a4e68721a
commit
8144830e92
1 changed files with 37 additions and 12 deletions
|
|
@ -569,7 +569,7 @@ loop:
|
||||||
net.ping(n, n.addr())
|
net.ping(n, n.addr())
|
||||||
return n.pingEcho
|
return n.pingEcho
|
||||||
}, func(n *Node, topic Topic) []byte {
|
}, func(n *Node, topic Topic) []byte {
|
||||||
if n.state == known {
|
if n.canQuery() {
|
||||||
return net.conn.send(n, topicQueryPacket, topicQuery{Topic: topic}) // TODO: set expiration
|
return net.conn.send(n, topicQueryPacket, topicQuery{Topic: topic}) // TODO: set expiration
|
||||||
} else {
|
} else {
|
||||||
if n.state == unknown {
|
if n.state == unknown {
|
||||||
|
|
@ -633,15 +633,20 @@ loop:
|
||||||
}
|
}
|
||||||
net.refreshResp <- refreshDone
|
net.refreshResp <- refreshDone
|
||||||
case <-refreshDone:
|
case <-refreshDone:
|
||||||
log.Trace("<-net.refreshDone")
|
log.Trace("<-net.refreshDone", "table size", net.tab.count)
|
||||||
refreshDone = nil
|
if net.tab.count != 0 {
|
||||||
list := searchReqWhenRefreshDone
|
refreshDone = nil
|
||||||
searchReqWhenRefreshDone = nil
|
list := searchReqWhenRefreshDone
|
||||||
go func() {
|
searchReqWhenRefreshDone = nil
|
||||||
for _, req := range list {
|
go func() {
|
||||||
net.topicSearchReq <- req
|
for _, req := range list {
|
||||||
}
|
net.topicSearchReq <- req
|
||||||
}()
|
}
|
||||||
|
}()
|
||||||
|
} else {
|
||||||
|
refreshDone = make(chan struct{})
|
||||||
|
net.refresh(refreshDone)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Trace("loop stopped")
|
log.Trace("loop stopped")
|
||||||
|
|
@ -751,7 +756,15 @@ func (net *Network) internNodeFromNeighbours(sender *net.UDPAddr, rn rpcNode) (n
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
if !n.IP.Equal(rn.IP) || n.UDP != rn.UDP || n.TCP != rn.TCP {
|
if !n.IP.Equal(rn.IP) || n.UDP != rn.UDP || n.TCP != rn.TCP {
|
||||||
err = fmt.Errorf("metadata mismatch: got %v, want %v", rn, n)
|
if n.state == known {
|
||||||
|
// reject address change if node is known by us
|
||||||
|
err = fmt.Errorf("metadata mismatch: got %v, want %v", rn, n)
|
||||||
|
} else {
|
||||||
|
// accept otherwise; this will be handled nicer with signed ENRs
|
||||||
|
n.IP = rn.IP
|
||||||
|
n.UDP = rn.UDP
|
||||||
|
n.TCP = rn.TCP
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
@ -773,6 +786,11 @@ type nodeNetGuts struct {
|
||||||
deferredQueries []*findnodeQuery // queries that can't be sent yet
|
deferredQueries []*findnodeQuery // queries that can't be sent yet
|
||||||
pendingNeighbours *findnodeQuery // current query, waiting for reply
|
pendingNeighbours *findnodeQuery // current query, waiting for reply
|
||||||
queryTimeouts int
|
queryTimeouts int
|
||||||
|
canQueryAfter mclock.AbsTime // cannot query if zero
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *nodeNetGuts) canQuery() bool {
|
||||||
|
return n.canQueryAfter != 0 && mclock.Now() > n.canQueryAfter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *nodeNetGuts) deferQuery(q *findnodeQuery) {
|
func (n *nodeNetGuts) deferQuery(q *findnodeQuery) {
|
||||||
|
|
@ -796,7 +814,7 @@ func (q *findnodeQuery) start(net *Network) bool {
|
||||||
q.reply <- closest.entries
|
q.reply <- closest.entries
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if q.remote.state.canQuery && q.remote.pendingNeighbours == nil {
|
if q.remote.canQuery() && q.remote.pendingNeighbours == nil {
|
||||||
net.conn.sendFindnodeHash(q.remote, q.target)
|
net.conn.sendFindnodeHash(q.remote, q.target)
|
||||||
net.timedEvent(respTimeout, q.remote, neighboursTimeout)
|
net.timedEvent(respTimeout, q.remote, neighboursTimeout)
|
||||||
q.remote.pendingNeighbours = q
|
q.remote.pendingNeighbours = q
|
||||||
|
|
@ -1068,6 +1086,13 @@ func (net *Network) checkPacket(n *Node, ev nodeEvent, pkt *ingressPacket) error
|
||||||
|
|
||||||
func (net *Network) transition(n *Node, next *nodeState) {
|
func (net *Network) transition(n *Node, next *nodeState) {
|
||||||
if n.state != next {
|
if n.state != next {
|
||||||
|
if next.canQuery {
|
||||||
|
if !n.state.canQuery {
|
||||||
|
n.canQueryAfter = mclock.Now()+mclock.AbsTime(time.Second)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
n.canQueryAfter = 0
|
||||||
|
}
|
||||||
n.state = next
|
n.state = next
|
||||||
if next.enter != nil {
|
if next.enter != nil {
|
||||||
next.enter(net, n)
|
next.enter(net, n)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue