improve error message when commitDb' fails due to disk full or IO error
There's still a 60 second delay in this situation because it retries, in case the failure was due to something recoverable like another process. Sponsored-by: unqueued on Patreon
This commit is contained in:
parent
31e4b6dee1
commit
a3f433eac8
1 changed files with 11 additions and 7 deletions
|
@ -96,32 +96,36 @@ queryDb (DbHandle _db _ jobs errvar) a = do
|
||||||
- process at least once each 30 seconds.
|
- process at least once each 30 seconds.
|
||||||
-}
|
-}
|
||||||
commitDb :: DbHandle -> SqlPersistM () -> IO ()
|
commitDb :: DbHandle -> SqlPersistM () -> IO ()
|
||||||
commitDb h@(DbHandle db _ _ _) wa =
|
commitDb h@(DbHandle db _ _ errvar) wa =
|
||||||
robustly (commitDb' h wa) maxretries emptyDatabaseInodeCache
|
robustly (commitDb' h wa) maxretries emptyDatabaseInodeCache
|
||||||
where
|
where
|
||||||
robustly a retries ic = do
|
robustly a retries ic = do
|
||||||
r <- a
|
r <- a
|
||||||
case r of
|
case r of
|
||||||
Right _ -> return ()
|
Right (Right _) -> return ()
|
||||||
Left err -> do
|
Right (Left err) -> do
|
||||||
threadDelay briefdelay
|
threadDelay briefdelay
|
||||||
retryHelper "write to" err maxretries db retries ic $
|
retryHelper "write to" err maxretries db retries ic $
|
||||||
robustly a
|
robustly a
|
||||||
|
Left BlockedIndefinitelyOnMVar -> do
|
||||||
|
err <- takeMVar errvar
|
||||||
|
giveup $ "sqlite worker thread crashed: " ++ err
|
||||||
|
|
||||||
briefdelay = 100000 -- 1/10th second
|
briefdelay = 100000 -- 1/10th second
|
||||||
|
|
||||||
maxretries = 300 :: Int -- 30 seconds of briefdelay
|
maxretries = 300 :: Int -- 30 seconds of briefdelay
|
||||||
|
|
||||||
commitDb' :: DbHandle -> SqlPersistM () -> IO (Either SomeException ())
|
commitDb' :: DbHandle -> SqlPersistM () -> IO (Either BlockedIndefinitelyOnMVar (Either SomeException ()))
|
||||||
commitDb' (DbHandle _ _ jobs _) a = do
|
commitDb' (DbHandle _ _ jobs _) a = do
|
||||||
debug "Database.Handle" "commitDb start"
|
debug "Database.Handle" "commitDb start"
|
||||||
res <- newEmptyMVar
|
res <- newEmptyMVar
|
||||||
putMVar jobs $ ChangeJob $
|
putMVar jobs $ ChangeJob $
|
||||||
debugLocks $ liftIO . putMVar res =<< tryNonAsync a
|
debugLocks $ liftIO . putMVar res =<< tryNonAsync a
|
||||||
r <- debugLocks $ takeMVar res
|
r <- debugLocks $ takeMVarSafe res
|
||||||
case r of
|
case r of
|
||||||
Right () -> debug "Database.Handle" "commitDb done"
|
Right (Right ()) -> debug "Database.Handle" "commitDb done"
|
||||||
Left e -> debug "Database.Handle" ("commitDb failed: " ++ show e)
|
Right (Left e) -> debug "Database.Handle" ("commitDb failed: " ++ show e)
|
||||||
|
Left BlockedIndefinitelyOnMVar -> debug "Database.Handle" ("commitDb BlockedIndefinitelyOnMVar")
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue