From 15ab3290ad04280764968ba4760474a8c0cbfa52 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Fri, 3 Jan 2020 18:22:16 -0500 Subject: Modify kademlia search to distinguish a Canceled from timed-out query. --- dht/src/Network/Tox/DHT/Handlers.hs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'dht/src/Network/Tox/DHT') 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 nullSearch = Search { searchSpace = toxSpace , searchNodeAddress = nodeIP &&& nodePort - , searchQuery = \_ _ -> return Nothing + , searchQuery = \_ _ -> return Canceled , searchAlpha = 1 , searchK = 2 } @@ -410,7 +410,8 @@ unsendNodes _ = Nothing unwrapNodes :: SendNodes -> ( [NodeInfo], [NodeInfo], Maybe () ) unwrapNodes (SendNodes ns) = (map udpNodeInfo ns,map udpNodeInfo ns,Just ()) -getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> Multi.NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) +getNodes :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> Multi.NodeInfo + -> IO (QR.Result ([NodeInfo],[NodeInfo],Maybe ())) getNodes client cbvar nid addr = do -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr @@ -423,9 +424,12 @@ getNodes client cbvar nid addr = do forM_ mcbs $ \cbs -> do forM_ cbs $ \cb -> do rumoredAddress cb now addr (udpNodeInfo n) - return $ fmap unwrapNodes $ join $ resultToMaybe reply + return $ case reply of + Success x -> maybe Canceled (Success . unwrapNodes) x + _ -> fmap (error "Network.Tox.DHT.Handlers.getNodes: the impossible happened!") reply -getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) +getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo + -> IO (QR.Result ([NodeInfo],[NodeInfo],Maybe ())) getNodesUDP client cbvar nid addr = getNodes client cbvar nid (Multi.UDP ==> addr) updateRouting :: Client -> Routing -- cgit v1.2.3