diff --git a/src/Hash2Pub/FediChord.hs b/src/Hash2Pub/FediChord.hs index c52e9f9..9cce7eb 100644 --- a/src/Hash2Pub/FediChord.hs +++ b/src/Hash2Pub/FediChord.hs @@ -38,6 +38,7 @@ module Hash2Pub.FediChord ( , FediChordConf(..) , fediChordInit , fediChordJoin + , fediChordBootstrapJoin , nodeStateInit , mkServerSocket , mkSendSocket @@ -110,11 +111,13 @@ nodeStateInit conf = do } pure initialState -fediChordJoin :: LocalNodeState -- ^ the local 'NodeState' - -> (String, PortNumber) -- ^ domain and port of a bootstrapping node - -> IO (Either String LocalNodeState) -- ^ the joined 'NodeState' after a +-- | Join a new node into the DHT, using a provided bootstrap node as initial cache seed +-- for resolving the new node's position. +fediChordBootstrapJoin :: LocalNodeState -- ^ the local 'NodeState' + -> (String, PortNumber) -- ^ domain and port of a bootstrapping node + -> IO (Either String LocalNodeState) -- ^ the joined 'NodeState' after a -- successful join, otherwise an error message -fediChordJoin ns (joinHost, joinPort) = do +fediChordBootstrapJoin ns (joinHost, joinPort) = do -- can be invoked multiple times with all known bootstrapping nodes until successfully joined sock <- mkSendSocket joinHost joinPort -- 1. get routed to placement of own ID until FOUND: @@ -133,18 +136,24 @@ fediChordJoin ns (joinHost, joinPort) = do Just (FORWARD resultset) -> foldr' (addCacheEntryPure now) cacheAcc resultset ) initCache bootstrapResponse - -- get routed to the currently responsible node, based on the response - -- from the bootstrapping node - currentlyResponsible <- queryIdLookupLoop bootstrapCache ns $ getNid ns - -- do actual join - joinResult <- requestJoin currentlyResponsible ns - case joinResult of - Nothing -> pure . Left $ "Error joining on " <> show currentlyResponsible - Just joinedNS -> pure . Right $ joinedNS - + fediChordJoin bootstrapCache ns +-- | 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 + -- use for ID lookup + -> LocalNodeState -- ^ the local 'NodeState' + -> IO (Either String LocalNodeState) -- ^ the joined 'NodeState' after a + -- successful join, otherwise an error message +fediChordJoin cacheSnapshot ns = do + -- get routed to the currently responsible node, based on the response + -- from the bootstrapping node + currentlyResponsible <- queryIdLookupLoop cacheSnapshot ns $ getNid ns -- 2. then send a join to the currently responsible node - -- after successful join, finally add own node to the cache + joinResult <- requestJoin currentlyResponsible ns + case joinResult of + Nothing -> pure . Left $ "Error joining on " <> show currentlyResponsible + Just joinedNS -> pure . Right $ joinedNS -- | cache updater thread that waits for incoming NodeCache update instructions on diff --git a/src/Hash2Pub/Main.hs b/src/Hash2Pub/Main.hs index 4435f73..f1e6b29 100644 --- a/src/Hash2Pub/Main.hs +++ b/src/Hash2Pub/Main.hs @@ -18,7 +18,7 @@ main = do -- currently no masking is necessary, as there is nothing to clean up cacheWriterThread <- forkIO $ cacheWriter thisNode -- idea: list of bootstrapping nodes, try joining within a timeout - joinedState <- fediChordJoin thisNode $ head . confBootstrapNodes $ conf + joinedState <- fediChordBootstrapJoin thisNode $ head . confBootstrapNodes $ conf -- stop main thread from terminating during development getChar pure ()