diff options
Diffstat (limited to 'kad/src/Network/Kademlia/Bootstrap.hs')
-rw-r--r-- | kad/src/Network/Kademlia/Bootstrap.hs | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/kad/src/Network/Kademlia/Bootstrap.hs b/kad/src/Network/Kademlia/Bootstrap.hs index c07b3c6c..bd09214f 100644 --- a/kad/src/Network/Kademlia/Bootstrap.hs +++ b/kad/src/Network/Kademlia/Bootstrap.hs | |||
@@ -52,7 +52,7 @@ type SensibleNodeId nid ni = | |||
52 | , Hashable nid | 52 | , Hashable nid |
53 | , Hashable ni ) | 53 | , Hashable ni ) |
54 | 54 | ||
55 | data BucketRefresher nid ni = forall tok addr. Ord addr => BucketRefresher | 55 | data BucketRefresher nid ni qk = forall tok addr. Ord addr => BucketRefresher |
56 | { -- | A staleness threshold (if a bucket goes this long without being | 56 | { -- | A staleness threshold (if a bucket goes this long without being |
57 | -- touched, a refresh will be triggered). | 57 | -- touched, a refresh will be triggered). |
58 | refreshInterval :: POSIXTime | 58 | refreshInterval :: POSIXTime |
@@ -63,7 +63,7 @@ data BucketRefresher nid ni = forall tok addr. Ord addr => BucketRefresher | |||
63 | -- priority in this priority search queue. | 63 | -- priority in this priority search queue. |
64 | , refreshQueue :: TVar (Int.PSQ POSIXTime) | 64 | , refreshQueue :: TVar (Int.PSQ POSIXTime) |
65 | -- | This is the kademlia node search specification. | 65 | -- | This is the kademlia node search specification. |
66 | , refreshSearch :: Search nid addr tok ni ni | 66 | , refreshSearch :: Search nid addr tok ni ni qk |
67 | -- | The current kademlia routing table buckets. | 67 | -- | The current kademlia routing table buckets. |
68 | , refreshBuckets :: TVar (R.BucketList ni) | 68 | , refreshBuckets :: TVar (R.BucketList ni) |
69 | -- | Action to ping a node. This is used only during initial bootstrap | 69 | -- | Action to ping a node. This is used only during initial bootstrap |
@@ -84,9 +84,9 @@ data BucketRefresher nid ni = forall tok addr. Ord addr => BucketRefresher | |||
84 | newBucketRefresher :: ( Ord addr, Hashable addr | 84 | newBucketRefresher :: ( Ord addr, Hashable addr |
85 | , SensibleNodeId nid ni ) | 85 | , SensibleNodeId nid ni ) |
86 | => TVar (R.BucketList ni) | 86 | => TVar (R.BucketList ni) |
87 | -> Search nid addr tok ni ni | 87 | -> Search nid addr tok ni ni qk |
88 | -> (ni -> IO Bool) | 88 | -> (ni -> IO Bool) |
89 | -> STM (BucketRefresher nid ni) | 89 | -> STM (BucketRefresher nid ni qk) |
90 | newBucketRefresher bkts sch ping = do | 90 | newBucketRefresher bkts sch ping = do |
91 | let spc = searchSpace sch | 91 | let spc = searchSpace sch |
92 | nodeId = kademliaLocation spc | 92 | nodeId = kademliaLocation spc |
@@ -112,9 +112,9 @@ newBucketRefresher bkts sch ping = do | |||
112 | -- insufficiently polymorphic field" when trying to update the existentially | 112 | -- insufficiently polymorphic field" when trying to update the existentially |
113 | -- quantified field 'refreshSearch'. | 113 | -- quantified field 'refreshSearch'. |
114 | updateRefresherIO :: Ord addr | 114 | updateRefresherIO :: Ord addr |
115 | => Search nid addr tok ni ni | 115 | => Search nid addr tok ni ni qk |
116 | -> (ni -> IO Bool) | 116 | -> (ni -> IO Bool) |
117 | -> BucketRefresher nid ni -> BucketRefresher nid ni | 117 | -> BucketRefresher nid ni qk -> BucketRefresher nid ni qk |
118 | updateRefresherIO sch ping BucketRefresher{..} = BucketRefresher | 118 | updateRefresherIO sch ping BucketRefresher{..} = BucketRefresher |
119 | { refreshSearch = sch | 119 | { refreshSearch = sch |
120 | , refreshPing = ping | 120 | , refreshPing = ping |
@@ -128,7 +128,7 @@ updateRefresherIO sch ping BucketRefresher{..} = BucketRefresher | |||
128 | } | 128 | } |
129 | 129 | ||
130 | -- | Fork a refresh loop. Kill the returned thread to terminate it. | 130 | -- | Fork a refresh loop. Kill the returned thread to terminate it. |
131 | forkPollForRefresh :: SensibleNodeId nid ni => BucketRefresher nid ni -> IO ThreadId | 131 | forkPollForRefresh :: Ord qk => SensibleNodeId nid ni => BucketRefresher nid ni qk -> IO ThreadId |
132 | forkPollForRefresh r@BucketRefresher{ refreshInterval | 132 | forkPollForRefresh r@BucketRefresher{ refreshInterval |
133 | , refreshQueue | 133 | , refreshQueue |
134 | , refreshBuckets | 134 | , refreshBuckets |
@@ -194,7 +194,7 @@ checkBucketFull space var resultCounter fin n found_node = do | |||
194 | 194 | ||
195 | -- | Called from 'refreshBucket' with the current time when a refresh of the | 195 | -- | Called from 'refreshBucket' with the current time when a refresh of the |
196 | -- supplied bucket number finishes. | 196 | -- supplied bucket number finishes. |
197 | onFinishedRefresh :: BucketRefresher nid ni -> Int -> POSIXTime -> STM (IO ()) | 197 | onFinishedRefresh :: BucketRefresher nid ni qk -> Int -> POSIXTime -> STM (IO ()) |
198 | onFinishedRefresh BucketRefresher { bootstrapCountdown | 198 | onFinishedRefresh BucketRefresher { bootstrapCountdown |
199 | , bootstrapMode | 199 | , bootstrapMode |
200 | , refreshQueue | 200 | , refreshQueue |
@@ -235,11 +235,11 @@ onFinishedRefresh BucketRefresher { bootstrapCountdown | |||
235 | return $ do action ; dput XRefresh $ "BOOTSTRAP complete (" ++ show (R.shape tbl) ++ ")." | 235 | return $ do action ; dput XRefresh $ "BOOTSTRAP complete (" ++ show (R.shape tbl) ++ ")." |
236 | else return $ do action ; dput XRefresh $ "BOOTSTRAP progress " ++ show (num,R.shape tbl,cnt) | 236 | else return $ do action ; dput XRefresh $ "BOOTSTRAP progress " ++ show (num,R.shape tbl,cnt) |
237 | 237 | ||
238 | data BucketSearch nid ni = forall addr tok. BucketSearch | 238 | data BucketSearch nid ni = forall addr tok qk. BucketSearch |
239 | { bucketSample :: nid | 239 | { bucketSample :: nid |
240 | , bucketResults :: TVar (Set.Set ni) | 240 | , bucketResults :: TVar (Set.Set ni) |
241 | , bucketFinFlag :: TVar Bool | 241 | , bucketFinFlag :: TVar Bool |
242 | , bucketState :: SearchState nid addr tok ni ni | 242 | , bucketState :: SearchState nid addr tok ni ni qk |
243 | , bucketThread :: ThreadId | 243 | , bucketThread :: ThreadId |
244 | } | 244 | } |
245 | 245 | ||
@@ -253,8 +253,8 @@ insertBucketState :: BucketSearch nid ni -> Maybe [BucketSearch nid ni] -> Maybe | |||
253 | insertBucketState bst Nothing = Just [bst] | 253 | insertBucketState bst Nothing = Just [bst] |
254 | insertBucketState bst (Just xs) = Just (bst : xs) | 254 | insertBucketState bst (Just xs) = Just (bst : xs) |
255 | 255 | ||
256 | refreshBucket :: (Show nid, Ord ni, Ord nid, Hashable nid, Hashable ni) => | 256 | refreshBucket :: (Show nid, Ord ni, Ord nid, Hashable nid, Hashable ni, Ord qk) => |
257 | BucketRefresher nid ni -> Int -> IO Int | 257 | BucketRefresher nid ni qk -> Int -> IO Int |
258 | refreshBucket r@BucketRefresher{ refreshSearch = sch | 258 | refreshBucket r@BucketRefresher{ refreshSearch = sch |
259 | , refreshBuckets = var | 259 | , refreshBuckets = var |
260 | , refreshState = rstate } | 260 | , refreshState = rstate } |
@@ -297,7 +297,7 @@ refreshBucket r@BucketRefresher{ refreshSearch = sch | |||
297 | return $ if b then 1 else c | 297 | return $ if b then 1 else c |
298 | return rcount | 298 | return rcount |
299 | 299 | ||
300 | refreshLastBucket :: SensibleNodeId nid ni => BucketRefresher nid ni -> IO () | 300 | refreshLastBucket :: SensibleNodeId nid ni => BucketRefresher nid ni qk -> IO () |
301 | refreshLastBucket r@BucketRefresher { refreshBuckets | 301 | refreshLastBucket r@BucketRefresher { refreshBuckets |
302 | , refreshQueue } = do | 302 | , refreshQueue } = do |
303 | 303 | ||
@@ -308,7 +308,7 @@ refreshLastBucket r@BucketRefresher { refreshBuckets | |||
308 | modifyTVar' refreshQueue $ Int.insert (cnt-1) (now - 1) | 308 | modifyTVar' refreshQueue $ Int.insert (cnt-1) (now - 1) |
309 | 309 | ||
310 | restartBootstrap :: (Hashable ni, Hashable nid, Ord ni, Ord nid, Show nid) => | 310 | restartBootstrap :: (Hashable ni, Hashable nid, Ord ni, Ord nid, Show nid) => |
311 | BucketRefresher nid ni -> STM (IO ()) | 311 | BucketRefresher nid ni qk -> STM (IO ()) |
312 | restartBootstrap r@BucketRefresher{ bootstrapMode, bootstrapCountdown } = do | 312 | restartBootstrap r@BucketRefresher{ bootstrapMode, bootstrapCountdown } = do |
313 | unchanged <- readTVar bootstrapMode | 313 | unchanged <- readTVar bootstrapMode |
314 | writeTVar bootstrapMode True | 314 | writeTVar bootstrapMode True |
@@ -319,7 +319,7 @@ restartBootstrap r@BucketRefresher{ bootstrapMode, bootstrapCountdown } = do | |||
319 | else return $ dput XRefresh "BOOTSTRAP already bootstrapping" | 319 | else return $ dput XRefresh "BOOTSTRAP already bootstrapping" |
320 | 320 | ||
321 | bootstrap :: (Ord ni, Ord nid, Hashable nid, Hashable ni, Foldable t, Foldable t1, Show nid) => | 321 | bootstrap :: (Ord ni, Ord nid, Hashable nid, Hashable ni, Foldable t, Foldable t1, Show nid) => |
322 | BucketRefresher nid ni | 322 | BucketRefresher nid ni qk |
323 | -> t1 ni -- ^ Nodes to bootstrap from. | 323 | -> t1 ni -- ^ Nodes to bootstrap from. |
324 | -> t ni -- ^ Fallback nodes; used only if the others are unresponsive. | 324 | -> t ni -- ^ Fallback nodes; used only if the others are unresponsive. |
325 | -> IO () | 325 | -> IO () |
@@ -356,7 +356,7 @@ bootstrap r@BucketRefresher { refreshSearch = sch | |||
356 | -- maintenance. | 356 | -- maintenance. |
357 | 357 | ||
358 | 358 | ||
359 | effectiveRefreshInterval :: BucketRefresher nid ni -> Int -> STM POSIXTime | 359 | effectiveRefreshInterval :: BucketRefresher nid ni qk -> Int -> STM POSIXTime |
360 | effectiveRefreshInterval BucketRefresher{ refreshInterval | 360 | effectiveRefreshInterval BucketRefresher{ refreshInterval |
361 | , refreshBuckets | 361 | , refreshBuckets |
362 | , bootstrapMode } num = do | 362 | , bootstrapMode } num = do |
@@ -429,7 +429,7 @@ effectiveRefreshInterval BucketRefresher{ refreshInterval | |||
429 | -- We embed the result in the STM monad but currently, no STM state changes | 429 | -- We embed the result in the STM monad but currently, no STM state changes |
430 | -- occur until the returned IO action is invoked. TODO: simplify? | 430 | -- occur until the returned IO action is invoked. TODO: simplify? |
431 | touchBucket :: SensibleNodeId nid ni | 431 | touchBucket :: SensibleNodeId nid ni |
432 | => BucketRefresher nid ni | 432 | => BucketRefresher nid ni qk |
433 | -> RoutingTransition ni -- ^ What happened to the bucket? | 433 | -> RoutingTransition ni -- ^ What happened to the bucket? |
434 | -> STM (IO ()) | 434 | -> STM (IO ()) |
435 | touchBucket r@BucketRefresher{ refreshSearch | 435 | touchBucket r@BucketRefresher{ refreshSearch |
@@ -461,7 +461,7 @@ touchBucket r@BucketRefresher{ refreshSearch | |||
461 | writeTVar refreshLastTouch now | 461 | writeTVar refreshLastTouch now |
462 | return action | 462 | return action |
463 | 463 | ||
464 | refreshKademlia :: SensibleNodeId nid ni => BucketRefresher nid ni -> Kademlia nid ni | 464 | refreshKademlia :: SensibleNodeId nid ni => BucketRefresher nid ni qk -> Kademlia nid ni |
465 | refreshKademlia r@BucketRefresher { refreshSearch = sch | 465 | refreshKademlia r@BucketRefresher { refreshSearch = sch |
466 | , refreshPing = ping | 466 | , refreshPing = ping |
467 | , refreshBuckets = bkts | 467 | , refreshBuckets = bkts |