summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-12-26 18:43:54 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-01 23:28:00 -0500
commitd187c97aa8fd1c5385a99a8b061793d7a000fadb (patch)
tree40fd9702e7d7177bcb0c79673db37abb8beb7144
parent46c096abcb269407b0927587520dda644aca9b51 (diff)
Reverted 6ebe91b6: abandoning the async search design for now.
-rw-r--r--dht/TCPProber.hs2
-rw-r--r--dht/examples/dhtd.hs9
-rw-r--r--dht/src/Network/BitTorrent/MainlineDHT.hs2
-rw-r--r--dht/src/Network/Tox/DHT/Handlers.hs6
-rw-r--r--dht/src/Network/Tox/Onion/Handlers.hs2
-rw-r--r--kad/src/Network/Kademlia/Search.hs33
6 files changed, 19 insertions, 35 deletions
diff --git a/dht/TCPProber.hs b/dht/TCPProber.hs
index d58b8b60..faf8b35c 100644
--- a/dht/TCPProber.hs
+++ b/dht/TCPProber.hs
@@ -177,7 +177,7 @@ nodeSearch :: TCPProber -> TCP.TCPClient err Nonce8 -> Search NodeId (IP, PortNu
177nodeSearch prober tcp = Search 177nodeSearch prober tcp = Search
178 { searchSpace = TCP.tcpSpace 178 { searchSpace = TCP.tcpSpace
179 , searchNodeAddress = TCP.nodeIP &&& TCP.tcpPort 179 , searchNodeAddress = TCP.nodeIP &&& TCP.tcpPort
180 , searchQuery = Left $ getNodes prober tcp 180 , searchQuery = getNodes prober tcp
181 , searchAlpha = 8 181 , searchAlpha = 8
182 , searchK = 16 182 , searchK = 16
183 } 183 }
diff --git a/dht/examples/dhtd.hs b/dht/examples/dhtd.hs
index 71be24eb..ef3f6bd4 100644
--- a/dht/examples/dhtd.hs
+++ b/dht/examples/dhtd.hs
@@ -355,13 +355,6 @@ showPolicy TryingToConnect = "*"
355showPolicy OpenToConnect = "o" 355showPolicy OpenToConnect = "o"
356showPolicy RefusingToConnect = "x" 356showPolicy RefusingToConnect = "x"
357 357
358waitOn :: (nid -> ni -> (result -> IO ()) -> IO ())
359 -> nid -> ni -> IO result
360waitOn bg nid ni = do
361 mvar <- newEmptyMVar
362 bg nid ni $ putMVar mvar
363 takeMVar mvar
364
365getSessions :: TVar (Map.Map Uniq24 AggregateSession) -> Uniq24 -> STM [Tox.Session] 358getSessions :: TVar (Map.Map Uniq24 AggregateSession) -> Uniq24 -> STM [Tox.Session]
366getSessions ssvar u24 = do 359getSessions ssvar u24 = do
367 agmap <- readTVar ssvar 360 agmap <- readTVar ssvar
@@ -788,7 +781,7 @@ clientSession s@Session{..} sock cnum h = do
788 go | null destination = fmap Right . qhandler self 781 go | null destination = fmap Right . qhandler self
789 | otherwise = case readEither destination of 782 | otherwise = case readEither destination of
790 Right ni -> fmap (maybe (Left "Timeout.") Right) 783 Right ni -> fmap (maybe (Left "Timeout.") Right)
791 . flip (either id waitOn $ searchQuery qsearch) ni 784 . flip (searchQuery qsearch) ni
792 Left e -> const $ return $ Left ("Bad destination: "++e) 785 Left e -> const $ return $ Left ("Bad destination: "++e)
793 maybe (hPutClient h ("Unsupported method: "++method)) 786 maybe (hPutClient h ("Unsupported method: "++method))
794 goQuery 787 goQuery
diff --git a/dht/src/Network/BitTorrent/MainlineDHT.hs b/dht/src/Network/BitTorrent/MainlineDHT.hs
index 0269268f..bb556bc6 100644
--- a/dht/src/Network/BitTorrent/MainlineDHT.hs
+++ b/dht/src/Network/BitTorrent/MainlineDHT.hs
@@ -1082,7 +1082,7 @@ mainlineSearch :: (NodeId -> NodeInfo -> IO (Maybe ([NodeInfo], [r], Maybe tok))
1082mainlineSearch qry = Search 1082mainlineSearch qry = Search
1083 { searchSpace = mainlineSpace 1083 { searchSpace = mainlineSpace
1084 , searchNodeAddress = nodeIP &&& nodePort 1084 , searchNodeAddress = nodeIP &&& nodePort
1085 , searchQuery = Left qry 1085 , searchQuery = qry
1086 , searchAlpha = 8 1086 , searchAlpha = 8
1087 , searchK = 16 1087 , searchK = 16
1088 } 1088 }
diff --git a/dht/src/Network/Tox/DHT/Handlers.hs b/dht/src/Network/Tox/DHT/Handlers.hs
index 73bc2229..7806da78 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 = Left $ \_ _ -> return Nothing 201 , searchQuery = \_ _ -> return Nothing
202 , searchAlpha = 1 202 , searchAlpha = 1
203 , searchK = 2 203 , searchK = 2
204 } 204 }
@@ -541,9 +541,7 @@ nodeSearch :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> Search NodeI
541nodeSearch client cbvar = Search 541nodeSearch client cbvar = Search
542 { searchSpace = toxSpace 542 { searchSpace = toxSpace
543 , searchNodeAddress = nodeIP &&& nodePort 543 , searchNodeAddress = nodeIP &&& nodePort
544 -- searchQuery :: Either (nid -> ni -> IO (Maybe ([ni], [r], Maybe tok))) 544 , searchQuery = getNodesUDP client cbvar
545 -- (nid -> ni -> (Maybe ([ni],[r],Maybe tok) -> IO ()) -> IO ())
546 , searchQuery = Left $ getNodesUDP client cbvar
547 , searchAlpha = 8 545 , searchAlpha = 8
548 , searchK = 16 546 , searchK = 16
549 } 547 }
diff --git a/dht/src/Network/Tox/Onion/Handlers.hs b/dht/src/Network/Tox/Onion/Handlers.hs
index 7951e707..65ec846c 100644
--- a/dht/src/Network/Tox/Onion/Handlers.hs
+++ b/dht/src/Network/Tox/Onion/Handlers.hs
@@ -222,7 +222,7 @@ toxidSearch :: (OnionDestination r -> STM (OnionDestination r, Int))
222toxidSearch getTimeout crypto client = Search 222toxidSearch getTimeout crypto client = Search
223 { searchSpace = toxSpace 223 { searchSpace = toxSpace
224 , searchNodeAddress = nodeIP &&& nodePort 224 , searchNodeAddress = nodeIP &&& nodePort
225 , searchQuery = Left $ getRendezvous getTimeout crypto client 225 , searchQuery = getRendezvous getTimeout crypto client
226 , searchAlpha = 3 226 , searchAlpha = 3
227 , searchK = 6 227 , searchK = 6
228 } 228 }
diff --git a/kad/src/Network/Kademlia/Search.hs b/kad/src/Network/Kademlia/Search.hs
index 16786d1c..5b60c303 100644
--- a/kad/src/Network/Kademlia/Search.hs
+++ b/kad/src/Network/Kademlia/Search.hs
@@ -40,8 +40,7 @@ import GHC.Conc (labelThread)
40data Search nid addr tok ni r = Search 40data Search nid addr tok ni r = Search
41 { searchSpace :: KademliaSpace nid ni 41 { searchSpace :: KademliaSpace nid ni
42 , searchNodeAddress :: ni -> addr 42 , searchNodeAddress :: ni -> addr
43 , searchQuery :: Either (nid -> ni -> IO (Maybe ([ni], [r], Maybe tok))) 43 , searchQuery :: nid -> ni -> IO (Maybe ([ni], [r], Maybe tok))
44 (nid -> ni -> (Maybe ([ni],[r],Maybe tok) -> IO ()) -> IO ())
45 , searchAlpha :: Int -- α = 8 44 , searchAlpha :: Int -- α = 8
46 -- | 'searchK' should be larger than 'searchAlpha'. How much larger depends on 45 -- | 'searchK' should be larger than 'searchAlpha'. How much larger depends on
47 -- how fast the queries are. For Tox's much slower onion-routed queries, we 46 -- how fast the queries are. For Tox's much slower onion-routed queries, we
@@ -122,7 +121,7 @@ reset nearestNodes qsearch target st = do
122 writeTVar (searchPendingCount st) 0 121 writeTVar (searchPendingCount st) 0
123 return st 122 return st
124 123
125sendAsyncQuery :: forall addr nid tok ni r. 124sendQuery :: forall addr nid tok ni r.
126 ( Ord addr 125 ( Ord addr
127 , PSQKey nid 126 , PSQKey nid
128 , PSQKey ni 127 , PSQKey ni
@@ -133,23 +132,15 @@ sendAsyncQuery :: forall addr nid tok ni r.
133 -> (r -> STM Bool) -- ^ return False to terminate the search. 132 -> (r -> STM Bool) -- ^ return False to terminate the search.
134 -> SearchState nid addr tok ni r 133 -> SearchState nid addr tok ni r
135 -> Binding ni nid 134 -> Binding ni nid
136 -> TaskGroup
137 -> IO () 135 -> IO ()
138sendAsyncQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) g = 136sendQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) = do
139 case searchQuery of 137 myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget)
140 Left blockingQuery -> 138 reply <- searchQuery searchTarget ni `catchIOError` const (return Nothing)
141 forkTask g "searchQuery" $ do 139 -- (ns,rs)
142 -- forkTask will label the thread. 140 let tok = error "TODO: token"
143 -- -- myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget) 141 atomically $ do
144 reply <- blockingQuery searchTarget ni `catchIOError` const (return Nothing) 142 modifyTVar searchPendingCount pred
145 atomically $ do 143 maybe (return ()) go reply
146 modifyTVar searchPendingCount pred
147 maybe (return ()) go reply
148 Right nonblockingQuery -> do
149 nonblockingQuery searchTarget ni $ \reply ->
150 atomically $ do
151 modifyTVar searchPendingCount pred
152 maybe (return ()) go reply
153 where 144 where
154 go (ns,rs,tok) = do 145 go (ns,rs,tok) = do
155 vs <- readTVar searchVisited 146 vs <- readTVar searchVisited
@@ -239,7 +230,9 @@ searchLoop sch@Search{..} target result s@SearchState{..} = do
239 modifyTVar searchVisited $ Set.insert (searchNodeAddress ni) 230 modifyTVar searchVisited $ Set.insert (searchNodeAddress ni)
240 modifyTVar searchPendingCount succ 231 modifyTVar searchPendingCount succ
241 return $ do 232 return $ do
242 sendAsyncQuery sch target result s (ni :-> d) g 233 forkTask g
234 "searchQuery"
235 $ sendQuery sch target result s (ni :-> d)
243 again 236 again
244 _ -> -- Otherwise, we are finished. 237 _ -> -- Otherwise, we are finished.
245 do check (cnt == 0) 238 do check (cnt == 0)