forked from schmittlauch/Hash2Pub
check cache slice invariant for predecessor slices as well
closes #30 \0/
This commit is contained in:
parent
2c3ef44064
commit
f7ed0ee8d8
|
@ -253,9 +253,10 @@ checkCacheSliceInvariants :: LocalNodeState
|
||||||
-> NodeCache
|
-> NodeCache
|
||||||
-> [NodeID] -- ^ list of middle IDs of slices not
|
-> [NodeID] -- ^ list of middle IDs of slices not
|
||||||
-- ^ fulfilling the invariant
|
-- ^ 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
|
where
|
||||||
jEntries = jEntriesPerSlice ns
|
jEntries = jEntriesPerSlice ns
|
||||||
|
lastPred = getNid <$> lastMay (predecessors ns)
|
||||||
lastSucc = getNid <$> lastMay (successors ns)
|
lastSucc = getNid <$> lastMay (successors ns)
|
||||||
-- start slice boundary: 1/2 key space
|
-- start slice boundary: 1/2 key space
|
||||||
startBound = getNid ns + 2^(idBits - 1)
|
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
|
-- if not enough entries, add the middle of the slice to list
|
||||||
else middleID : checkSuccessorSlice j ownID (lowerBound - 1) (Just lastSuccID) cache
|
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
|
-- | Periodically send @StabiliseRequest' s to the closest neighbour nodes, until
|
||||||
|
|
Loading…
Reference in a new issue