eb59da9dd2
This can reduce the size of the branch by up to 8%. My test was running git-annex add 1000 times on one file each. Lots of different high-resolution timestamps were recorded before and eliminating those, after packing, the git repo was 8% smaller. Due to the use of vector clocks, high resolution timestamps are not necessary to make clear which information is most recent when eg, a value is changed repeatedly in the same second. In such a case, the vector clock will be advanced to the next second after the last modification. For example, running git-annex numcopies 1; git-annex numcopies 2 The first will record the current second, while the next records the second after that even if it runs in the same second. As for conflicting information written to two different clones of the repository, this will make git-annex sometimes pick information that was written earlier in a second over information written later in the same second. Usually git-annex does not write conflicting information, but there are some cases where it could. Eg, storing an object on a remote can update the remote state log with some state. If two repos both store the same object, and end up storing different remote state for some reason, this can result in one that ran a tiny bit later winning. Such a situation seems unlikely to be user visible. And a small amount of clock skew could already result in such things. The only case I can think of where this might be a user visible change is if a configuration command like git-annex numcopies is being run in 2 clones of a repository on the same machine at very close to the same time. Then the user will know which they ran last, and git-annex won't. If that did become a problem, this could be dialed back to eg log milliseconds with still some space saving.
33 lines
1 KiB
Haskell
33 lines
1 KiB
Haskell
{- git-annex vector clock utilities
|
|
-
|
|
- Copyright 2017-2020 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Annex.VectorClock.Utility where
|
|
|
|
import Data.Time.Clock.POSIX
|
|
|
|
import Types.VectorClock
|
|
import Utility.Env
|
|
import Utility.TimeStamp
|
|
|
|
startVectorClock :: IO (IO CandidateVectorClock)
|
|
startVectorClock = go =<< getEnv "GIT_ANNEX_VECTOR_CLOCK"
|
|
where
|
|
go Nothing = timebased
|
|
go (Just s) = case parsePOSIXTime s of
|
|
Just t -> return (pure (CandidateVectorClock t))
|
|
Nothing -> timebased
|
|
-- Avoid using fractional seconds in the CandidateVectorClock.
|
|
-- This reduces the size of the packed git-annex branch by up
|
|
-- to 8%.
|
|
--
|
|
-- Due to the use of vector clocks, high resolution timestamps are
|
|
-- not necessary to make clear which information is most recent when
|
|
-- eg, a value is changed repeatedly in the same second. In such a
|
|
-- case, the vector clock will be advanced to the next second after
|
|
-- the last modification.
|
|
timebased = return $
|
|
CandidateVectorClock . truncateResolution 0 <$> getPOSIXTime
|