summaryrefslogtreecommitdiff
path: root/kad/src/Network/Kademlia/Bootstrap.hs
diff options
context:
space:
mode:
Diffstat (limited to 'kad/src/Network/Kademlia/Bootstrap.hs')
-rw-r--r--kad/src/Network/Kademlia/Bootstrap.hs36
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
55data BucketRefresher nid ni = forall tok addr. Ord addr => BucketRefresher 55data 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
84newBucketRefresher :: ( Ord addr, Hashable addr 84newBucketRefresher :: ( 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)
90newBucketRefresher bkts sch ping = do 90newBucketRefresher 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'.
114updateRefresherIO :: Ord addr 114updateRefresherIO :: 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
118updateRefresherIO sch ping BucketRefresher{..} = BucketRefresher 118updateRefresherIO 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.
131forkPollForRefresh :: SensibleNodeId nid ni => BucketRefresher nid ni -> IO ThreadId 131forkPollForRefresh :: Ord qk => SensibleNodeId nid ni => BucketRefresher nid ni qk -> IO ThreadId
132forkPollForRefresh r@BucketRefresher{ refreshInterval 132forkPollForRefresh 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.
197onFinishedRefresh :: BucketRefresher nid ni -> Int -> POSIXTime -> STM (IO ()) 197onFinishedRefresh :: BucketRefresher nid ni qk -> Int -> POSIXTime -> STM (IO ())
198onFinishedRefresh BucketRefresher { bootstrapCountdown 198onFinishedRefresh 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
238data BucketSearch nid ni = forall addr tok. BucketSearch 238data 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
253insertBucketState bst Nothing = Just [bst] 253insertBucketState bst Nothing = Just [bst]
254insertBucketState bst (Just xs) = Just (bst : xs) 254insertBucketState bst (Just xs) = Just (bst : xs)
255 255
256refreshBucket :: (Show nid, Ord ni, Ord nid, Hashable nid, Hashable ni) => 256refreshBucket :: (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
258refreshBucket r@BucketRefresher{ refreshSearch = sch 258refreshBucket 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
300refreshLastBucket :: SensibleNodeId nid ni => BucketRefresher nid ni -> IO () 300refreshLastBucket :: SensibleNodeId nid ni => BucketRefresher nid ni qk -> IO ()
301refreshLastBucket r@BucketRefresher { refreshBuckets 301refreshLastBucket 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
310restartBootstrap :: (Hashable ni, Hashable nid, Ord ni, Ord nid, Show nid) => 310restartBootstrap :: (Hashable ni, Hashable nid, Ord ni, Ord nid, Show nid) =>
311 BucketRefresher nid ni -> STM (IO ()) 311 BucketRefresher nid ni qk -> STM (IO ())
312restartBootstrap r@BucketRefresher{ bootstrapMode, bootstrapCountdown } = do 312restartBootstrap 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
321bootstrap :: (Ord ni, Ord nid, Hashable nid, Hashable ni, Foldable t, Foldable t1, Show nid) => 321bootstrap :: (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
359effectiveRefreshInterval :: BucketRefresher nid ni -> Int -> STM POSIXTime 359effectiveRefreshInterval :: BucketRefresher nid ni qk -> Int -> STM POSIXTime
360effectiveRefreshInterval BucketRefresher{ refreshInterval 360effectiveRefreshInterval 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?
431touchBucket :: SensibleNodeId nid ni 431touchBucket :: 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 ())
435touchBucket r@BucketRefresher{ refreshSearch 435touchBucket 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
464refreshKademlia :: SensibleNodeId nid ni => BucketRefresher nid ni -> Kademlia nid ni 464refreshKademlia :: SensibleNodeId nid ni => BucketRefresher nid ni qk -> Kademlia nid ni
465refreshKademlia r@BucketRefresher { refreshSearch = sch 465refreshKademlia r@BucketRefresher { refreshSearch = sch
466 , refreshPing = ping 466 , refreshPing = ping
467 , refreshBuckets = bkts 467 , refreshBuckets = bkts