diff options
author | Joey Hess <joey@kitenet.net> | 2013-10-27 16:42:13 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-10-27 16:42:13 -0400 |
commit | be581a2722e78f8a2e59e5ca78a1090efc432307 (patch) | |
tree | a24cb16a152bcce74bf4ae279056ac1f17ab4695 /Assistant/Sync.hs | |
parent | 4b0b07f1783705714dd75ca1812ab676260e5728 (diff) |
automatically launch git repository repair
Added a RemoteChecker thread, that waits for problems to be reported with
remotes, and checks if their git repository is in need of repair.
Currently, only failures to sync with the remote cause a problem to be
reported. This seems enough, but we'll see.
Plugging in a removable drive with a repository on it that is corrupted
does automatically repair the repository, as long as the corruption causes
git push or git pull to fail. Some types of corruption do not, eg
missing/corrupt objects for blobs that git push doesn't need to look at.
So, this is not really a replacement for scheduled git repository fscking.
But it does make the assistant more robust.
This commit is sponsored by Fernando Jimenez.
Diffstat (limited to 'Assistant/Sync.hs')
-rw-r--r-- | Assistant/Sync.hs | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/Assistant/Sync.hs b/Assistant/Sync.hs index 6a66802d5..5715901d6 100644 --- a/Assistant/Sync.hs +++ b/Assistant/Sync.hs @@ -33,6 +33,7 @@ import Assistant.NamedThread import Assistant.Threads.Watcher (watchThread, WatcherControl(..)) import Assistant.TransferSlots import Assistant.TransferQueue +import Assistant.RemoteProblem import Logs.Transfer import Data.Time.Clock @@ -59,11 +60,14 @@ import Control.Concurrent reconnectRemotes :: Bool -> [Remote] -> Assistant () reconnectRemotes _ [] = noop reconnectRemotes notifypushes rs = void $ do - rs' <- filterM (checkavailable . Remote.repo) rs + rs' <- liftIO $ filterM (Remote.checkAvailable True) rs unless (null rs') $ do modifyDaemonStatus_ $ \s -> s { desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) } failedrs <- syncAction rs' (const go) + forM_ failedrs $ \r -> + whenM (liftIO $ Remote.checkAvailable False r) $ + remoteHasProblem r mapM_ signal $ filter (`notElem` failedrs) rs' where gitremotes = filter (notspecialremote . Remote.repo) rs @@ -90,10 +94,6 @@ reconnectRemotes notifypushes rs = void $ do signal r = liftIO . mapM_ (flip tryPutMVar ()) =<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers <$> getDaemonStatus - checkavailable r - | Git.repoIsLocal r || Git.repoIsLocalUnknown r = - liftIO $ doesDirectoryExist $ Git.repoPath r - | otherwise = return True {- Updates the local sync branch, then pushes it to all remotes, in - parallel, along with the git-annex branch. This is the same |