forked from schmittlauch/Hash2Pub
wait for migration to complete on join
also clean up migration entry after success
This commit is contained in:
parent
414564705a
commit
c49c1a89c9
|
@ -482,7 +482,7 @@ respondJoin nsSTM msgSet = do
|
||||||
-- ....... request sending .......
|
-- ....... request sending .......
|
||||||
|
|
||||||
-- | send a join request and return the joined 'LocalNodeState' including neighbours
|
-- | send a join request and return the joined 'LocalNodeState' including neighbours
|
||||||
requestJoin :: NodeState a => a -- ^ currently responsible node to be contacted
|
requestJoin :: (NodeState a, Service s (RealNodeSTM s)) => a -- ^ currently responsible node to be contacted
|
||||||
-> LocalNodeStateSTM s -- ^ joining NodeState
|
-> LocalNodeStateSTM s -- ^ joining NodeState
|
||||||
-> IO (Either String (LocalNodeStateSTM s)) -- ^ node after join with all its new information
|
-> IO (Either String (LocalNodeStateSTM s)) -- ^ node after join with all its new information
|
||||||
requestJoin toJoinOn ownStateSTM = do
|
requestJoin toJoinOn ownStateSTM = do
|
||||||
|
@ -521,12 +521,15 @@ requestJoin toJoinOn ownStateSTM = do
|
||||||
pure (cacheInsertQ, newState)
|
pure (cacheInsertQ, newState)
|
||||||
-- execute the cache insertions
|
-- execute the cache insertions
|
||||||
mapM_ (\f -> f joinedState) cacheInsertQ
|
mapM_ (\f -> f joinedState) cacheInsertQ
|
||||||
pure $ if responses == Set.empty
|
if responses == Set.empty
|
||||||
then Left $ "join error: got no response from " <> show (getNid toJoinOn)
|
then pure . Left $ "join error: got no response from " <> show (getNid toJoinOn)
|
||||||
else if null (predecessors joinedState) && null (successors joinedState)
|
else if null (predecessors joinedState) && null (successors joinedState)
|
||||||
then Left "join error: no predecessors or successors"
|
then pure $ Left "join error: no predecessors or successors"
|
||||||
-- successful join
|
-- successful join
|
||||||
else Right ownStateSTM
|
else do
|
||||||
|
-- wait for migration data to be completely received
|
||||||
|
waitForMigrationFrom (nodeService prn) (getNid ownState)
|
||||||
|
pure $ Right ownStateSTM
|
||||||
)
|
)
|
||||||
`catch` (\e -> pure . Left $ displayException (e :: IOException))
|
`catch` (\e -> pure . Left $ displayException (e :: IOException))
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,8 @@ nodeStateInit realNodeSTM = do
|
||||||
|
|
||||||
-- | Join a new node into the DHT, using a provided bootstrap node as initial cache seed
|
-- | Join a new node into the DHT, using a provided bootstrap node as initial cache seed
|
||||||
-- for resolving the new node's position.
|
-- for resolving the new node's position.
|
||||||
fediChordBootstrapJoin :: LocalNodeStateSTM s -- ^ the local 'NodeState'
|
fediChordBootstrapJoin :: Service s (RealNodeSTM s)
|
||||||
|
=> LocalNodeStateSTM s -- ^ the local 'NodeState'
|
||||||
-> (String, PortNumber) -- ^ domain and port of a bootstrapping node
|
-> (String, PortNumber) -- ^ domain and port of a bootstrapping node
|
||||||
-> IO (Either String (LocalNodeStateSTM s)) -- ^ the joined 'NodeState' after a
|
-> IO (Either String (LocalNodeStateSTM s)) -- ^ the joined 'NodeState' after a
|
||||||
-- successful join, otherwise an error message
|
-- successful join, otherwise an error message
|
||||||
|
@ -170,7 +171,7 @@ fediChordBootstrapJoin nsSTM bootstrapNode = do
|
||||||
|
|
||||||
-- Periodically lookup own ID through a random bootstrapping node to discover and merge separated DHT clusters.
|
-- Periodically lookup own ID through a random bootstrapping node to discover and merge separated DHT clusters.
|
||||||
-- Unjoined try joining instead.
|
-- Unjoined try joining instead.
|
||||||
convergenceSampleThread :: LocalNodeStateSTM s -> IO ()
|
convergenceSampleThread :: Service s (RealNodeSTM s) => LocalNodeStateSTM s -> IO ()
|
||||||
convergenceSampleThread nsSTM = forever $ do
|
convergenceSampleThread nsSTM = forever $ do
|
||||||
nsSnap <- readTVarIO nsSTM
|
nsSnap <- readTVarIO nsSTM
|
||||||
parentNode <- readTVarIO $ parentRealNode nsSnap
|
parentNode <- readTVarIO $ parentRealNode nsSnap
|
||||||
|
@ -201,7 +202,7 @@ convergenceSampleThread nsSTM = forever $ do
|
||||||
|
|
||||||
|
|
||||||
-- | Try joining the DHT through any of the bootstrapping nodes until it succeeds.
|
-- | Try joining the DHT through any of the bootstrapping nodes until it succeeds.
|
||||||
tryBootstrapJoining :: LocalNodeStateSTM s -> IO (Either String (LocalNodeStateSTM s))
|
tryBootstrapJoining :: Service s (RealNodeSTM s) => LocalNodeStateSTM s -> IO (Either String (LocalNodeStateSTM s))
|
||||||
tryBootstrapJoining nsSTM = do
|
tryBootstrapJoining nsSTM = do
|
||||||
bss <- atomically $ do
|
bss <- atomically $ do
|
||||||
nsSnap <- readTVar nsSTM
|
nsSnap <- readTVar nsSTM
|
||||||
|
@ -249,7 +250,8 @@ bootstrapQueryId nsSTM (bootstrapHost, bootstrapPort) targetID = do
|
||||||
|
|
||||||
-- | join a node to the DHT using the global node cache
|
-- | join a node to the DHT using the global node cache
|
||||||
-- node's position.
|
-- node's position.
|
||||||
fediChordVserverJoin :: LocalNodeStateSTM s -- ^ the local 'NodeState'
|
fediChordVserverJoin :: Service s (RealNodeSTM s)
|
||||||
|
=> LocalNodeStateSTM s -- ^ the local 'NodeState'
|
||||||
-> IO (Either String (LocalNodeStateSTM s)) -- ^ the joined 'NodeState' after a
|
-> IO (Either String (LocalNodeStateSTM s)) -- ^ the joined 'NodeState' after a
|
||||||
-- successful join, otherwise an error message
|
-- successful join, otherwise an error message
|
||||||
fediChordVserverJoin nsSTM = do
|
fediChordVserverJoin nsSTM = do
|
||||||
|
@ -304,7 +306,7 @@ fediChordVserverLeave ns = do
|
||||||
|
|
||||||
-- | Wait for new cache entries to appear and then try joining on them.
|
-- | Wait for new cache entries to appear and then try joining on them.
|
||||||
-- Exits after successful joining.
|
-- Exits after successful joining.
|
||||||
joinOnNewEntriesThread :: LocalNodeStateSTM s -> IO ()
|
joinOnNewEntriesThread :: Service s (RealNodeSTM s) => LocalNodeStateSTM s -> IO ()
|
||||||
joinOnNewEntriesThread nsSTM = loop
|
joinOnNewEntriesThread nsSTM = loop
|
||||||
where
|
where
|
||||||
loop = do
|
loop = do
|
||||||
|
|
|
@ -231,7 +231,11 @@ subscriptionDelivery serv senderID subList = do
|
||||||
-- TODO: potentially log this
|
-- TODO: potentially log this
|
||||||
:: STM (Either String ()))
|
:: STM (Either String ()))
|
||||||
-- TODO: should this always signal migration finished to avoid deadlocksP
|
-- TODO: should this always signal migration finished to avoid deadlocksP
|
||||||
liftIO $ putMVar syncMVar ()
|
liftIO $ putMVar syncMVar () -- wakes up waiting thread
|
||||||
|
liftIO $ putMVar syncMVar () -- blocks until waiting thread has resumed
|
||||||
|
-- delete this migration from ongoing ones
|
||||||
|
liftIO . atomically $ modifyTVar' (migrationsInProgress serv) $
|
||||||
|
HMap.delete (fromInteger senderID)
|
||||||
case res of
|
case res of
|
||||||
Left err -> throwError err410 {errBody = BSUL.fromString err}
|
Left err -> throwError err410 {errBody = BSUL.fromString err}
|
||||||
Right _ -> pure ""
|
Right _ -> pure ""
|
||||||
|
|
Loading…
Reference in a new issue