From e00da9b84fbc81f84c48fd48cfff15b64efc3802 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Sat, 6 Jun 2020 18:02:40 +0200 Subject: [PATCH] respond to and handle Leave requests contributes to #28 --- src/Hash2Pub/DHTProtocol.hs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Hash2Pub/DHTProtocol.hs b/src/Hash2Pub/DHTProtocol.hs index 2df852b..5cbba56 100644 --- a/src/Hash2Pub/DHTProtocol.hs +++ b/src/Hash2Pub/DHTProtocol.hs @@ -38,7 +38,7 @@ import Data.Foldable (foldl', foldr') import Data.Functor.Identity import Data.IP (IPv6, fromHostAddress6, toHostAddress6) -import Data.List (sortBy) +import Data.List (delete, sortBy) import qualified Data.Map as Map import Data.Maybe (fromJust, fromMaybe, mapMaybe, maybe) @@ -209,6 +209,32 @@ handleIncomingRequest nsSTM sendQ msgSet sourceAddr = do -- TODO: could all these respond* functions be in STM instead of IO? +-- | Respond to a Leave request by removing the leaving node from local data structures +-- and confirming with response. +-- TODO: copy over key data from leaver and confirm +respondLeave :: LocalNodeStateSTM -> Set.Set FediChordMessage -> IO (Map.Map Integer BS.ByteString) +respondLeave nsSTM msgSet = do + responseMsg <- atomically $ do + nsSnap <- readTVar nsSTM + let + aRequestPart = Set.elemAt 0 msgSet + senderID = getNid . sender $ aRequestPart + -- remove leaving node from successors, predecessors and NodeCache + writeTQueue (cacheWriteQueue nsSnap) $ deleteCacheEntry senderID + writeTVar nsSTM $ + setPredecessors (delete senderID $ predecessors nsSnap) + . setSuccessors (delete senderID $ successors nsSnap) $ nsSnap + -- TODO: handle handover of key data + let leaveResponse = Response { + responseTo = requestID aRequestPart + , senderID = getNid nsSnap + , part = if Set.size msgSet == 1 then 1 else fromIntegral $ Set.size msgSet + 1 + , isFinalPart = False + , action = Leave + , payload = Just LeaveResponsePayload + } + pure leaveResponse + pure $ serialiseMessage sendMessageSize responseMsg -- | respond to stabilise requests by returning successor and predecessor list respondStabilise :: LocalNodeStateSTM -> Set.Set FediChordMessage -> IO (Map.Map Integer BS.ByteString)