diff options
author | Joe Crayne <joe@jerkface.net> | 2020-01-03 18:22:16 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-01-07 13:24:59 -0500 |
commit | 15ab3290ad04280764968ba4760474a8c0cbfa52 (patch) | |
tree | 8df7bdfe38005f5478243427bb2b692d32843283 /dht/src/Network/Tox/DHT | |
parent | b411ab66ceee7386e4829e2337c735a08fb3d54d (diff) |
Modify kademlia search to distinguish a Canceled from timed-out query.
Diffstat (limited to 'dht/src/Network/Tox/DHT')
-rw-r--r-- | dht/src/Network/Tox/DHT/Handlers.hs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/dht/src/Network/Tox/DHT/Handlers.hs b/dht/src/Network/Tox/DHT/Handlers.hs index dc4ca5fa..d132da88 100644 --- a/dht/src/Network/Tox/DHT/Handlers.hs +++ b/dht/src/Network/Tox/DHT/Handlers.hs | |||
@@ -198,7 +198,7 @@ newRouting addr crypto update4 update6 = do | |||
198 | nullSearch = Search | 198 | nullSearch = Search |
199 | { searchSpace = toxSpace | 199 | { searchSpace = toxSpace |
200 | , searchNodeAddress = nodeIP &&& nodePort | 200 | , searchNodeAddress = nodeIP &&& nodePort |
201 | , searchQuery = \_ _ -> return Nothing | 201 | , searchQuery = \_ _ -> return Canceled |
202 | , searchAlpha = 1 | 202 | , searchAlpha = 1 |
203 | , searchK = 2 | 203 | , searchK = 2 |
204 | } | 204 | } |
@@ -410,7 +410,8 @@ unsendNodes _ = Nothing | |||
410 | unwrapNodes :: SendNodes -> ( [NodeInfo], [NodeInfo], Maybe () ) | 410 | unwrapNodes :: SendNodes -> ( [NodeInfo], [NodeInfo], Maybe () ) |
411 | unwrapNodes (SendNodes ns) = (map udpNodeInfo ns,map udpNodeInfo ns,Just ()) | 411 | unwrapNodes (SendNodes ns) = (map udpNodeInfo ns,map udpNodeInfo ns,Just ()) |
412 | 412 | ||
413 | getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> Multi.NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) | 413 | getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> Multi.NodeInfo |
414 | -> IO (QR.Result ([NodeInfo],[NodeInfo],Maybe ())) | ||
414 | getNodes client cbvar nid addr = do | 415 | getNodes client cbvar nid addr = do |
415 | -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid | 416 | -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid |
416 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr | 417 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr |
@@ -423,9 +424,12 @@ getNodes client cbvar nid addr = do | |||
423 | forM_ mcbs $ \cbs -> do | 424 | forM_ mcbs $ \cbs -> do |
424 | forM_ cbs $ \cb -> do | 425 | forM_ cbs $ \cb -> do |
425 | rumoredAddress cb now addr (udpNodeInfo n) | 426 | rumoredAddress cb now addr (udpNodeInfo n) |
426 | return $ fmap unwrapNodes $ join $ resultToMaybe reply | 427 | return $ case reply of |
428 | Success x -> maybe Canceled (Success . unwrapNodes) x | ||
429 | _ -> fmap (error "Network.Tox.DHT.Handlers.getNodes: the impossible happened!") reply | ||
427 | 430 | ||
428 | getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) | 431 | getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo |
432 | -> IO (QR.Result ([NodeInfo],[NodeInfo],Maybe ())) | ||
429 | getNodesUDP client cbvar nid addr = getNodes client cbvar nid (Multi.UDP ==> addr) | 433 | getNodesUDP client cbvar nid addr = getNodes client cbvar nid (Multi.UDP ==> addr) |
430 | 434 | ||
431 | updateRouting :: Client -> Routing | 435 | updateRouting :: Client -> Routing |