diff --git a/app/Main.hs b/app/Main.hs index 03f72f1..cc93c26 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -21,17 +21,8 @@ main = do (serverSock, thisNode) <- fediChordInit conf -- currently no masking is necessary, as there is nothing to clean up cacheWriterThread <- forkIO $ cacheWriter thisNode - thisNodeSnap <- readTVarIO thisNode - realNode <- readTVarIO $ parentRealNode thisNodeSnap -- try joining the DHT using one of the provided bootstrapping nodes - let - tryJoining (bn:bns) = do - j <- fediChordBootstrapJoin thisNode bn - case j of - Left err -> putStrLn ("join error: " <> err) >> tryJoining bns - Right joined -> pure $ Right joined - tryJoining [] = pure $ Left "Exhausted all bootstrap points for joining." - joinedState <- tryJoining $ bootstrapNodes realNode + joinedState <- tryBootstrapJoining thisNode either (\err -> do -- handle unsuccessful join diff --git a/src/Hash2Pub/FediChord.hs b/src/Hash2Pub/FediChord.hs index ba7edb4..de9a462 100644 --- a/src/Hash2Pub/FediChord.hs +++ b/src/Hash2Pub/FediChord.hs @@ -40,6 +40,7 @@ module Hash2Pub.FediChord ( , fediChordInit , fediChordJoin , fediChordBootstrapJoin + , tryBootstrapJoining , fediMainThreads , RealNode (..) , nodeStateInit @@ -166,6 +167,25 @@ fediChordBootstrapJoin nsSTM (joinHost, joinPort) = ) `catch` (\e -> pure . Left $ "Error at bootstrap joining: " <> displayException (e :: IOException)) + +-- | Try joining the DHT through any of the bootstrapping nodes until it succeeds. +tryBootstrapJoining :: LocalNodeStateSTM -> IO (Either String LocalNodeStateSTM) +tryBootstrapJoining nsSTM = do + bss <- atomically $ do + nsSnap <- readTVar nsSTM + realNodeSnap <- readTVar $ parentRealNode nsSnap + pure $ bootstrapNodes realNodeSnap + tryJoining bss + where + tryJoining (bn:bns) = do + j <- fediChordBootstrapJoin nsSTM bn + case j of + Left err -> putStrLn ("join error: " <> err) >> tryJoining bns + Right joined -> pure $ Right joined + tryJoining [] = pure $ Left "Exhausted all bootstrap points for joining." + + + -- | join a node to the DHT, using the provided cache snapshot for resolving the new -- node's position. fediChordJoin :: NodeCache -- ^ a snapshot of the NodeCache to