fixed the race breaking moving files from archive in direct mode
assistant: Fix bug in direct mode that could occur when a symlink is moved out of an archive directory, and resulted in the file not being set to direct mode when it was transferred. The bug was that the direct mode mapping was not up-to-date when the transferrer finished. So, finding no direct mode place to store the object, it was put into .git/annex in indirect mode. To fix this, just make the watcher update the direct mode mapping to include the new file before it starts the transfer. (Seems we don't need to update it to remove the old file if the link was moved, because the direct mode code will notice it's not present and the mapping gets updated for its removal later.) The reason this was a race, and was probably not seen often is because the committer came along and updated the direct mode mapping as part of adding the moved symlink. But when the file was sufficiently small or the remote sufficiently fast, this could happen after the transfer finished.
This commit is contained in:
parent
051622c6da
commit
1d388d5579
3 changed files with 11 additions and 4 deletions
|
@ -19,6 +19,7 @@ import qualified Git.Config
|
|||
import Utility.ThreadScheduler
|
||||
import qualified Assistant.Threads.Watcher as Watcher
|
||||
import Utility.LogFile
|
||||
import Config
|
||||
|
||||
import Data.Time.Clock.POSIX
|
||||
|
||||
|
@ -105,7 +106,8 @@ dailyCheck = do
|
|||
liftAnnex $ warning msg
|
||||
void $ addAlert $ sanityCheckFixAlert msg
|
||||
addsymlink file s = do
|
||||
Watcher.runHandler Watcher.onAddSymlink file s
|
||||
isdirect <- liftAnnex isDirect
|
||||
Watcher.runHandler (Watcher.onAddSymlink isdirect) file s
|
||||
insanity $ "found unstaged symlink: " ++ file
|
||||
|
||||
hourlyCheck :: Assistant ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue