From 56ca2b53ccb723497b682b40b3e36988370f05d0 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Tue, 7 Jul 2020 18:07:01 +0200 Subject: [PATCH] refactor trying to join on any bootstrap node into own function contributes to #56 --- app/Main.hs | 11 +---------- src/Hash2Pub/FediChord.hs | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) 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