summaryrefslogtreecommitdiff
path: root/kad
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-01-03 18:22:16 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-07 13:24:59 -0500
commit15ab3290ad04280764968ba4760474a8c0cbfa52 (patch)
tree8df7bdfe38005f5478243427bb2b692d32843283 /kad
parentb411ab66ceee7386e4829e2337c735a08fb3d54d (diff)
Modify kademlia search to distinguish a Canceled from timed-out query.
Diffstat (limited to 'kad')
-rw-r--r--kad/kad.cabal1
-rw-r--r--kad/src/Network/Kademlia/Search.hs11
2 files changed, 8 insertions, 4 deletions
diff --git a/kad/kad.cabal b/kad/kad.cabal
index 4a86bc4f..7c92f809 100644
--- a/kad/kad.cabal
+++ b/kad/kad.cabal
@@ -86,6 +86,7 @@ library
86 , network-addr 86 , network-addr
87 , cereal 87 , cereal
88 , tasks 88 , tasks
89 , server
89 hs-source-dirs: src 90 hs-source-dirs: src
90 default-language: Haskell2010 91 default-language: Haskell2010
91 92
diff --git a/kad/src/Network/Kademlia/Search.hs b/kad/src/Network/Kademlia/Search.hs
index 03c18d0e..8d9c997b 100644
--- a/kad/src/Network/Kademlia/Search.hs
+++ b/kad/src/Network/Kademlia/Search.hs
@@ -29,7 +29,8 @@ import qualified Data.MinMaxPSQ as MM
29 ;import Data.MinMaxPSQ (MinMaxPSQ, MinMaxPSQ') 29 ;import Data.MinMaxPSQ (MinMaxPSQ, MinMaxPSQ')
30import qualified Data.Wrapper.PSQ as PSQ 30import qualified Data.Wrapper.PSQ as PSQ
31 ;import Data.Wrapper.PSQ (pattern (:->), Binding, pattern Binding, Binding', PSQKey) 31 ;import Data.Wrapper.PSQ (pattern (:->), Binding, pattern Binding, Binding', PSQKey)
32import Network.Kademlia.Routing as R 32import Network.Kademlia.Routing as R
33import Network.QueryResponse (Result(..))
33#ifdef THREAD_DEBUG 34#ifdef THREAD_DEBUG
34import Control.Concurrent.Lifted.Instrument 35import Control.Concurrent.Lifted.Instrument
35#else 36#else
@@ -40,7 +41,7 @@ import GHC.Conc (labelThread)
40data Search nid addr tok ni r = Search 41data Search nid addr tok ni r = Search
41 { searchSpace :: KademliaSpace nid ni 42 { searchSpace :: KademliaSpace nid ni
42 , searchNodeAddress :: ni -> addr 43 , searchNodeAddress :: ni -> addr
43 , searchQuery :: nid -> ni -> IO (Maybe ([ni], [r], Maybe tok)) 44 , searchQuery :: nid -> ni -> IO (Result ([ni], [r], Maybe tok))
44 , searchAlpha :: Int -- α = 8 45 , searchAlpha :: Int -- α = 8
45 -- | 'searchK' should be larger than 'searchAlpha'. How much larger depends on 46 -- | 'searchK' should be larger than 'searchAlpha'. How much larger depends on
46 -- how fast the queries are. For Tox's much slower onion-routed queries, we 47 -- how fast the queries are. For Tox's much slower onion-routed queries, we
@@ -138,12 +139,14 @@ sendQuery :: forall addr nid tok ni r.
138 -> IO () 139 -> IO ()
139sendQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) = do 140sendQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) = do
140 myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget) 141 myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget)
141 reply <- searchQuery searchTarget ni `catchIOError` const (return Nothing) 142 reply <- searchQuery searchTarget ni `catchIOError` const (return Canceled)
142 -- (ns,rs) 143 -- (ns,rs)
143 let tok = error "TODO: token" 144 let tok = error "TODO: token"
144 atomically $ do 145 atomically $ do
145 modifyTVar searchPendingCount pred 146 modifyTVar searchPendingCount pred
146 maybe (return ()) go reply 147 case reply of
148 Success x -> go x
149 _ -> return ()
147 where 150 where
148 go (ns,rs,tok) = do 151 go (ns,rs,tok) = do
149 vs <- readTVar searchVisited 152 vs <- readTVar searchVisited