diff options
author | Joe Crayne <joe@jerkface.net> | 2019-12-26 18:43:54 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-01-01 23:28:00 -0500 |
commit | d187c97aa8fd1c5385a99a8b061793d7a000fadb (patch) | |
tree | 40fd9702e7d7177bcb0c79673db37abb8beb7144 | |
parent | 46c096abcb269407b0927587520dda644aca9b51 (diff) |
Reverted 6ebe91b6: abandoning the async search design for now.
-rw-r--r-- | dht/TCPProber.hs | 2 | ||||
-rw-r--r-- | dht/examples/dhtd.hs | 9 | ||||
-rw-r--r-- | dht/src/Network/BitTorrent/MainlineDHT.hs | 2 | ||||
-rw-r--r-- | dht/src/Network/Tox/DHT/Handlers.hs | 6 | ||||
-rw-r--r-- | dht/src/Network/Tox/Onion/Handlers.hs | 2 | ||||
-rw-r--r-- | kad/src/Network/Kademlia/Search.hs | 33 |
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 | |||
177 | nodeSearch prober tcp = Search | 177 | nodeSearch 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 = "*" | |||
355 | showPolicy OpenToConnect = "o" | 355 | showPolicy OpenToConnect = "o" |
356 | showPolicy RefusingToConnect = "x" | 356 | showPolicy RefusingToConnect = "x" |
357 | 357 | ||
358 | waitOn :: (nid -> ni -> (result -> IO ()) -> IO ()) | ||
359 | -> nid -> ni -> IO result | ||
360 | waitOn bg nid ni = do | ||
361 | mvar <- newEmptyMVar | ||
362 | bg nid ni $ putMVar mvar | ||
363 | takeMVar mvar | ||
364 | |||
365 | getSessions :: TVar (Map.Map Uniq24 AggregateSession) -> Uniq24 -> STM [Tox.Session] | 358 | getSessions :: TVar (Map.Map Uniq24 AggregateSession) -> Uniq24 -> STM [Tox.Session] |
366 | getSessions ssvar u24 = do | 359 | getSessions 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)) | |||
1082 | mainlineSearch qry = Search | 1082 | mainlineSearch 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 | |||
541 | nodeSearch client cbvar = Search | 541 | nodeSearch 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)) | |||
222 | toxidSearch getTimeout crypto client = Search | 222 | toxidSearch 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) | |||
40 | data Search nid addr tok ni r = Search | 40 | data 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 | ||
125 | sendAsyncQuery :: forall addr nid tok ni r. | 124 | sendQuery :: 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 () |
138 | sendAsyncQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) g = | 136 | sendQuery 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) |