diff --git a/src/Hash2Pub/FediChord.hs b/src/Hash2Pub/FediChord.hs index 59f5bfb..ce8b5b9 100644 --- a/src/Hash2Pub/FediChord.hs +++ b/src/Hash2Pub/FediChord.hs @@ -253,9 +253,10 @@ checkCacheSliceInvariants :: LocalNodeState -> NodeCache -> [NodeID] -- ^ list of middle IDs of slices not -- ^ fulfilling the invariant -checkCacheSliceInvariants ns = checkSuccessorSlice jEntries (getNid ns) startBound lastSucc +checkCacheSliceInvariants ns = checkPredecessorSlice jEntries (getNid ns) startBound lastPred <> checkSuccessorSlice jEntries (getNid ns) startBound lastSucc where jEntries = jEntriesPerSlice ns + lastPred = getNid <$> lastMay (predecessors ns) lastSucc = getNid <$> lastMay (successors ns) -- start slice boundary: 1/2 key space startBound = getNid ns + 2^(idBits - 1) @@ -279,6 +280,24 @@ checkCacheSliceInvariants ns = checkSuccessorSlice jEntries (getNid ns) startBou -- if not enough entries, add the middle of the slice to list else middleID : checkSuccessorSlice j ownID (lowerBound - 1) (Just lastSuccID) cache + checkPredecessorSlice :: Integral i => i -> NodeID -> NodeID -> Maybe NodeID -> NodeCache -> [NodeID] + checkPredecessorSlice _ _ _ Nothing _ = [] + checkPredecessorSlice j ownID lowerBound (Just lastPredID) cache + | (lowerBound `localCompare` lastPredID) == GT = [] + | otherwise = + let + diff = getNodeID $ ownID - lowerBound + upperBound = ownID - fromInteger (diff `div` 2) + middleID = lowerBound + fromInteger (diff `div` 4) + lookupResult = Set.map (getNid . remoteNode) $ closestCachePredecessors jEntries upperBound cache + in + -- check whether j entries are in the slice + if length lookupResult == jEntries + && all (\r -> (r `localCompare` lowerBound) == GT) lookupResult + && all (\r -> (r `localCompare` upperBound) == LT) lookupResult + then checkPredecessorSlice j ownID (upperBound + 1) (Just lastPredID) cache + -- if not enough entries, add the middle of the slice to list + else middleID : checkPredecessorSlice j ownID (upperBound + 1) (Just lastPredID) cache -- | Periodically send @StabiliseRequest' s to the closest neighbour nodes, until