Avoid unncessary write to the location log when a file is unlocked and then added back with unchanged content.
Implemented with no additional overhead of compares etc. This is safe to do for presence logs because of their locality of change; a given repo's presence logs are only ever changed in that repo, or in a repo that has just been actively changing the content of that repo. So, we don't need to worry about a split-brain situation where there'd be disagreement about the location of a key in a repo. And so, it's ok to not update the timestamp when that's the only change that would be made due to logging presence info.
This commit is contained in:
parent
82ba8c9a6a
commit
f9adb905fc
7 changed files with 65 additions and 14 deletions
|
@ -61,21 +61,39 @@ filterPresent = filter (\l -> InfoPresent == status l) . compactLog
|
|||
{- Compacts a set of logs, returning a subset that contains the current
|
||||
- status. -}
|
||||
compactLog :: [LogLine] -> [LogLine]
|
||||
compactLog = M.elems . foldr mapLog M.empty
|
||||
compactLog = mapLog . logMap
|
||||
|
||||
type LogMap = M.Map String LogLine
|
||||
|
||||
{- Inserts a log into a map of logs, if the log has better (ie, newer)
|
||||
- information than the other logs in the map -}
|
||||
mapLog :: LogLine -> LogMap -> LogMap
|
||||
mapLog l m
|
||||
| better = M.insert i l m
|
||||
| otherwise = m
|
||||
mapLog :: LogMap -> [LogLine]
|
||||
mapLog = M.elems
|
||||
|
||||
logMap :: [LogLine] -> LogMap
|
||||
logMap = foldr insertNewerLogLine M.empty
|
||||
|
||||
insertBetter :: (LogLine -> Bool) -> LogLine -> LogMap -> Maybe LogMap
|
||||
insertBetter betterthan l m
|
||||
| better = Just (M.insert i l m)
|
||||
| otherwise = Nothing
|
||||
where
|
||||
better = maybe True newer $ M.lookup i m
|
||||
newer l' = date l' <= date l
|
||||
better = maybe True betterthan (M.lookup i m)
|
||||
i = info l
|
||||
|
||||
{- Inserts a log into a map of logs, if the log has newer
|
||||
- information than the other logs in the map for the same info. -}
|
||||
insertNewerLogLine :: LogLine -> LogMap -> LogMap
|
||||
insertNewerLogLine l m = fromMaybe m $ insertBetter newer l m
|
||||
where
|
||||
newer l' = date l' <= date l
|
||||
|
||||
{- Inserts the log unless there's already one in the map with
|
||||
- the same status for its info, in which case there's no need to
|
||||
- change anything, to avoid log churn. -}
|
||||
insertNewStatus :: LogLine -> LogMap -> Maybe LogMap
|
||||
insertNewStatus l m = insertBetter diffstatus l m
|
||||
where
|
||||
diffstatus l' = status l' /= status l
|
||||
|
||||
instance Arbitrary LogLine where
|
||||
arbitrary = LogLine
|
||||
<$> arbitrary
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue