|
|
@@ -565,11 +565,8 @@ loop:
|
|
|
if lookupChn := searchInfo[res.target.topic].lookupChn; lookupChn != nil {
|
|
|
lookupChn <- net.ticketStore.radius[res.target.topic].converged
|
|
|
}
|
|
|
- net.ticketStore.searchLookupDone(res.target, res.nodes, func(n *Node) []byte {
|
|
|
- net.ping(n, n.addr())
|
|
|
- return n.pingEcho
|
|
|
- }, func(n *Node, topic Topic) []byte {
|
|
|
- if n.state == known {
|
|
|
+ net.ticketStore.searchLookupDone(res.target, res.nodes, func(n *Node, topic Topic) []byte {
|
|
|
+ if n.state != nil && n.state.canQuery {
|
|
|
return net.conn.send(n, topicQueryPacket, topicQuery{Topic: topic}) // TODO: set expiration
|
|
|
} else {
|
|
|
if n.state == unknown {
|
|
|
@@ -633,15 +630,20 @@ loop:
|
|
|
}
|
|
|
net.refreshResp <- refreshDone
|
|
|
case <-refreshDone:
|
|
|
- log.Trace("<-net.refreshDone")
|
|
|
- refreshDone = nil
|
|
|
- list := searchReqWhenRefreshDone
|
|
|
- searchReqWhenRefreshDone = nil
|
|
|
- go func() {
|
|
|
- for _, req := range list {
|
|
|
- net.topicSearchReq <- req
|
|
|
- }
|
|
|
- }()
|
|
|
+ log.Trace("<-net.refreshDone", "table size", net.tab.count)
|
|
|
+ if net.tab.count != 0 {
|
|
|
+ refreshDone = nil
|
|
|
+ list := searchReqWhenRefreshDone
|
|
|
+ searchReqWhenRefreshDone = nil
|
|
|
+ go func() {
|
|
|
+ for _, req := range list {
|
|
|
+ net.topicSearchReq <- req
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ } else {
|
|
|
+ refreshDone = make(chan struct{})
|
|
|
+ net.refresh(refreshDone)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
log.Trace("loop stopped")
|
|
|
@@ -751,7 +753,15 @@ func (net *Network) internNodeFromNeighbours(sender *net.UDPAddr, rn rpcNode) (n
|
|
|
return n, err
|
|
|
}
|
|
|
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
|
|
|
}
|