[worker] simplify exception catching

parent 29113f05
Pipeline #6510 failed with stages
in 8 minutes and 14 seconds
...@@ -39,7 +39,7 @@ import Async.Worker.Broker ...@@ -39,7 +39,7 @@ import Async.Worker.Broker
import Async.Worker.Types import Async.Worker.Types
import Control.Concurrent.STM (atomically) import Control.Concurrent.STM (atomically)
import Control.Concurrent.STM.TVar (readTVarIO, newTVarIO, writeTVar) import Control.Concurrent.STM.TVar (readTVarIO, newTVarIO, writeTVar)
import Control.Exception.Safe (catch, fromException, throwIO, SomeException, Exception) import Control.Exception.Safe (catches, Handler(..), throwIO, SomeException, Exception)
import Control.Monad (forever, void, when) import Control.Monad (forever, void, when)
import Debug.Trace (traceStack) import Debug.Trace (traceStack)
import System.Timeout qualified as Timeout import System.Timeout qualified as Timeout
...@@ -70,40 +70,40 @@ run state@(State { .. }) = do ...@@ -70,40 +70,40 @@ run state@(State { .. }) = do
-- exception handling. -- exception handling.
mBrokerMessageTVar <- newTVarIO Nothing -- :: IO (TVar (Maybe (BrokerMessage b (Job a)))) mBrokerMessageTVar <- newTVarIO Nothing -- :: IO (TVar (Maybe (BrokerMessage b (Job a))))
catch (do catches (do
brokerMessage <- readMessageWaiting broker queueName brokerMessage <- readMessageWaiting broker queueName
atomically $ writeTVar mBrokerMessageTVar (Just brokerMessage) atomically $ writeTVar mBrokerMessageTVar (Just brokerMessage)
handleMessage state brokerMessage handleMessage state brokerMessage
callWorkerJobEvent onJobFinish state brokerMessage callWorkerJobEvent onJobFinish state brokerMessage
atomically $ writeTVar mBrokerMessageTVar Nothing ) [
) (\err -> do Handler $ \(_err :: KillWorkerSafely) -> do
mBrokerMessage <- readTVarIO mBrokerMessageTVar mBrokerMessage <- readTVarIO mBrokerMessageTVar
case fromException err of case mBrokerMessage of
Just KillWorkerSafely -> do Just brokerMessage -> do
case mBrokerMessage of let job = toA $ getMessage brokerMessage
Just brokerMessage -> do let mdata = metadata job
let job = toA $ getMessage brokerMessage -- Should we resend this message?
let mdata = metadata job when (resendWhenWorkerKilled mdata) $ do
-- Should we resend this message? putStrLn $ formatStr state $ "resending job: " <> show job
when (resendWhenWorkerKilled mdata) $ do void $ sendJob broker queueName (job { metadata = mdata { readCount = readCount mdata + 1 } })
putStrLn $ formatStr state $ "resending job: " <> show job size <- getQueueSize broker queueName
void $ sendJob broker queueName (job { metadata = mdata { readCount = readCount mdata + 1 } }) putStrLn $ formatStr state $ "queue size: " <> show size
size <- getQueueSize broker queueName
putStrLn $ formatStr state $ "queue size: " <> show size
-- In any case, deinit the broker (i.e. close connection)
-- deinitBroker broker
-- kill worker -- In any case, deinit the broker (i.e. close connection)
throwIO KillWorkerSafely -- deinitBroker broker
Nothing -> pure ()
Nothing -> case fromException err of -- kill worker
Just jt@(JobTimeout {}) -> handleTimeoutError state jt throwIO KillWorkerSafely
Nothing -> case mBrokerMessage of Nothing -> pure ()
, Handler $ \(err :: JobTimeout b a) -> handleTimeoutError state err
, Handler $ \err -> do
mBrokerMessage <- readTVarIO mBrokerMessageTVar
case mBrokerMessage of
Just brokerMessage -> do Just brokerMessage -> do
callWorkerJobEvent onJobError state brokerMessage callWorkerJobEvent onJobError state brokerMessage
handleJobError state brokerMessage handleJobError state brokerMessage
_ -> handleUnknownError state err) Nothing -> handleUnknownError state err
]
handleMessage :: (HasWorkerBroker b a) => State b a -> BrokerMessage b (Job a) -> IO () handleMessage :: (HasWorkerBroker b a) => State b a -> BrokerMessage b (Job a) -> IO ()
handleMessage state@(State { .. }) brokerMessage = do handleMessage state@(State { .. }) brokerMessage = do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment