|
|
|
@ -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 |
|
|
|
|
} |
|
|
|
|