{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE OverloadedStrings #-}
module Arbiter.Worker.Config
(
WorkerConfig (..)
, transactionalWorkerConfig
, manualWorkerConfig
, batchedWorkerConfig
, withHooks
, withMaintenance
, HandlerMode (..)
, handlerBatchSize
, MaintenanceOp (..)
, maintenanceOpName
, ResultOf
, WorkerConfigException (..)
, validateWorkerConfig
, defaultMaintenanceSparseInterval
, defaultMaintenanceBucketIdle
, defaultMaintenanceTimeout
, BatchCallbacks (..)
, hoistBatchCallbacks
, WorkerState (..)
, WorkerRuntime
, shutdownWorkerPool
, getWorkerState
, getListenerReady
, readEffectiveState
, writePause
, writePauseIfCurrent
, workerStateVar
, pauseVar
, pauseEpoch
, heartbeatSignal
, pulseHeartbeat
, listenerReadyVar
) where
import Arbiter.Core.Job.Types (JobRead, JobWrite, ObservabilityHooks, andThen, defaultObservabilityHooks)
import Arbiter.Core.MonadArbiter (JobHandler, MonadArbiter, ResultOf)
import Arbiter.Core.Operations (singleJobBatchSize)
import Control.Exception (Exception)
import Control.Monad (void, when)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Aeson (Value, (.=))
import Data.Bifunctor (first)
import Data.Foldable (toList)
import Data.Int (Int64)
import Data.List.NonEmpty (NonEmpty ((:|)))
import Data.Text (Text)
import Data.Text qualified as T
import Data.Time (NominalDiffTime)
import Data.UUID (UUID, toString)
import Data.UUID.V4 qualified as UUID
import Data.Word (Word64)
import Network.HostName (getHostName)
import System.Directory (getTemporaryDirectory)
import UnliftIO (MonadUnliftIO)
import UnliftIO.STM (TMVar, TVar, newEmptyTMVarIO, newTVarIO)
import UnliftIO.STM qualified as STM
import Arbiter.Worker.BackoffStrategy (BackoffStrategy, Jitter (..), exponentialBackoff)
import Arbiter.Worker.Cron.Types (CronJob)
import Arbiter.Worker.Logger (LogConfig, defaultLogConfig, withIdentity)
import Arbiter.Worker.WorkerState (WorkerState (..))
data MaintenanceOp
=
RefreshGroups
|
SweepStaleWorkers
|
SweepExhaustedJobs
|
SweepCancelledJobs
|
PruneRateLimitBuckets
|
ReconcileConcurrencyStale
|
ReconcilePruneConcurrency
|
PurgeArchives
|
PurgeDLQ
deriving stock (MaintenanceOp
MaintenanceOp -> MaintenanceOp -> Bounded MaintenanceOp
forall a. a -> a -> Bounded a
$cminBound :: MaintenanceOp
minBound :: MaintenanceOp
$cmaxBound :: MaintenanceOp
maxBound :: MaintenanceOp
Bounded, Int -> MaintenanceOp
MaintenanceOp -> Int
MaintenanceOp -> [MaintenanceOp]
MaintenanceOp -> MaintenanceOp
MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
MaintenanceOp -> MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
(MaintenanceOp -> MaintenanceOp)
-> (MaintenanceOp -> MaintenanceOp)
-> (Int -> MaintenanceOp)
-> (MaintenanceOp -> Int)
-> (MaintenanceOp -> [MaintenanceOp])
-> (MaintenanceOp -> MaintenanceOp -> [MaintenanceOp])
-> (MaintenanceOp -> MaintenanceOp -> [MaintenanceOp])
-> (MaintenanceOp
-> MaintenanceOp -> MaintenanceOp -> [MaintenanceOp])
-> Enum MaintenanceOp
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: MaintenanceOp -> MaintenanceOp
succ :: MaintenanceOp -> MaintenanceOp
$cpred :: MaintenanceOp -> MaintenanceOp
pred :: MaintenanceOp -> MaintenanceOp
$ctoEnum :: Int -> MaintenanceOp
toEnum :: Int -> MaintenanceOp
$cfromEnum :: MaintenanceOp -> Int
fromEnum :: MaintenanceOp -> Int
$cenumFrom :: MaintenanceOp -> [MaintenanceOp]
enumFrom :: MaintenanceOp -> [MaintenanceOp]
$cenumFromThen :: MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
enumFromThen :: MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
$cenumFromTo :: MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
enumFromTo :: MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
$cenumFromThenTo :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
enumFromThenTo :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp -> [MaintenanceOp]
Enum, MaintenanceOp -> MaintenanceOp -> Bool
(MaintenanceOp -> MaintenanceOp -> Bool)
-> (MaintenanceOp -> MaintenanceOp -> Bool) -> Eq MaintenanceOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MaintenanceOp -> MaintenanceOp -> Bool
== :: MaintenanceOp -> MaintenanceOp -> Bool
$c/= :: MaintenanceOp -> MaintenanceOp -> Bool
/= :: MaintenanceOp -> MaintenanceOp -> Bool
Eq, Eq MaintenanceOp
Eq MaintenanceOp =>
(MaintenanceOp -> MaintenanceOp -> Ordering)
-> (MaintenanceOp -> MaintenanceOp -> Bool)
-> (MaintenanceOp -> MaintenanceOp -> Bool)
-> (MaintenanceOp -> MaintenanceOp -> Bool)
-> (MaintenanceOp -> MaintenanceOp -> Bool)
-> (MaintenanceOp -> MaintenanceOp -> MaintenanceOp)
-> (MaintenanceOp -> MaintenanceOp -> MaintenanceOp)
-> Ord MaintenanceOp
MaintenanceOp -> MaintenanceOp -> Bool
MaintenanceOp -> MaintenanceOp -> Ordering
MaintenanceOp -> MaintenanceOp -> MaintenanceOp
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MaintenanceOp -> MaintenanceOp -> Ordering
compare :: MaintenanceOp -> MaintenanceOp -> Ordering
$c< :: MaintenanceOp -> MaintenanceOp -> Bool
< :: MaintenanceOp -> MaintenanceOp -> Bool
$c<= :: MaintenanceOp -> MaintenanceOp -> Bool
<= :: MaintenanceOp -> MaintenanceOp -> Bool
$c> :: MaintenanceOp -> MaintenanceOp -> Bool
> :: MaintenanceOp -> MaintenanceOp -> Bool
$c>= :: MaintenanceOp -> MaintenanceOp -> Bool
>= :: MaintenanceOp -> MaintenanceOp -> Bool
$cmax :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp
max :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp
$cmin :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp
min :: MaintenanceOp -> MaintenanceOp -> MaintenanceOp
Ord, Int -> MaintenanceOp -> ShowS
[MaintenanceOp] -> ShowS
MaintenanceOp -> String
(Int -> MaintenanceOp -> ShowS)
-> (MaintenanceOp -> String)
-> ([MaintenanceOp] -> ShowS)
-> Show MaintenanceOp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MaintenanceOp -> ShowS
showsPrec :: Int -> MaintenanceOp -> ShowS
$cshow :: MaintenanceOp -> String
show :: MaintenanceOp -> String
$cshowList :: [MaintenanceOp] -> ShowS
showList :: [MaintenanceOp] -> ShowS
Show)
maintenanceOpName :: MaintenanceOp -> Text
maintenanceOpName :: MaintenanceOp -> Text
maintenanceOpName MaintenanceOp
operation = case MaintenanceOp
operation of
MaintenanceOp
RefreshGroups -> Text
"refresh-all-groups"
MaintenanceOp
SweepStaleWorkers -> Text
"sweep-stale-workers"
MaintenanceOp
SweepExhaustedJobs -> Text
"sweep-exhausted-jobs"
MaintenanceOp
SweepCancelledJobs -> Text
"sweep-cancelled-jobs"
MaintenanceOp
PruneRateLimitBuckets -> Text
"prune-rate-limit-buckets"
MaintenanceOp
ReconcileConcurrencyStale -> Text
"reconcile-concurrency-stale"
MaintenanceOp
ReconcilePruneConcurrency -> Text
"reconcile-prune-concurrency"
MaintenanceOp
PurgeArchives -> Text
"purge-archives"
MaintenanceOp
PurgeDLQ -> Text
"purge-dlq"
newtype WorkerConfigException = WorkerConfigException Text
deriving stock (WorkerConfigException -> WorkerConfigException -> Bool
(WorkerConfigException -> WorkerConfigException -> Bool)
-> (WorkerConfigException -> WorkerConfigException -> Bool)
-> Eq WorkerConfigException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WorkerConfigException -> WorkerConfigException -> Bool
== :: WorkerConfigException -> WorkerConfigException -> Bool
$c/= :: WorkerConfigException -> WorkerConfigException -> Bool
/= :: WorkerConfigException -> WorkerConfigException -> Bool
Eq, Int -> WorkerConfigException -> ShowS
[WorkerConfigException] -> ShowS
WorkerConfigException -> String
(Int -> WorkerConfigException -> ShowS)
-> (WorkerConfigException -> String)
-> ([WorkerConfigException] -> ShowS)
-> Show WorkerConfigException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WorkerConfigException -> ShowS
showsPrec :: Int -> WorkerConfigException -> ShowS
$cshow :: WorkerConfigException -> String
show :: WorkerConfigException -> String
$cshowList :: [WorkerConfigException] -> ShowS
showList :: [WorkerConfigException] -> ShowS
Show)
deriving anyclass (Show WorkerConfigException
Typeable WorkerConfigException
(Typeable WorkerConfigException, Show WorkerConfigException) =>
(WorkerConfigException -> SomeException)
-> (SomeException -> Maybe WorkerConfigException)
-> (WorkerConfigException -> String)
-> (WorkerConfigException -> Bool)
-> Exception WorkerConfigException
SomeException -> Maybe WorkerConfigException
WorkerConfigException -> Bool
WorkerConfigException -> String
WorkerConfigException -> SomeException
forall e.
(Typeable e, Show e) =>
(e -> SomeException)
-> (SomeException -> Maybe e)
-> (e -> String)
-> (e -> Bool)
-> Exception e
$ctoException :: WorkerConfigException -> SomeException
toException :: WorkerConfigException -> SomeException
$cfromException :: SomeException -> Maybe WorkerConfigException
fromException :: SomeException -> Maybe WorkerConfigException
$cdisplayException :: WorkerConfigException -> String
displayException :: WorkerConfigException -> String
$cbacktraceDesired :: WorkerConfigException -> Bool
backtraceDesired :: WorkerConfigException -> Bool
Exception)
data WorkerRuntime = WorkerRuntime
{ WorkerRuntime -> TVar WorkerState
runtimeStateVar :: TVar WorkerState
, WorkerRuntime -> TVar Bool
runtimePauseVar :: TVar Bool
, WorkerRuntime -> TVar Word64
runtimePauseEpoch :: TVar Word64
, WorkerRuntime -> TMVar ()
runtimeHeartbeatSignal :: TMVar ()
, WorkerRuntime -> TVar Bool
runtimeListenerReadyVar :: TVar Bool
}
data WorkerConfig m payload = WorkerConfig
{ forall (m :: * -> *) payload. WorkerConfig m payload -> Int
workerCount :: Int
, forall (m :: * -> *) payload.
WorkerConfig m payload -> HandlerMode m payload
handlerMode :: HandlerMode m payload
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
pollInterval :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
visibilityTimeout :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
jobHeartbeatInterval :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe NominalDiffTime
maxJobDuration :: Maybe NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerHeartbeatInterval :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> BackoffStrategy
backoffStrategy :: BackoffStrategy
, forall (m :: * -> *) payload. WorkerConfig m payload -> Jitter
jitter :: Jitter
, forall (m :: * -> *) payload.
WorkerConfig m payload -> ObservabilityHooks m payload
observabilityHooks :: ObservabilityHooks m payload
, forall (m :: * -> *) payload.
WorkerConfig m payload -> MaintenanceOp -> Int64 -> m ()
onMaintenance :: MaintenanceOp -> Int64 -> m ()
, forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime :: WorkerRuntime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe String
livenessFile :: Maybe FilePath
, forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe NominalDiffTime
gracefulShutdownTimeout :: Maybe NominalDiffTime
, forall (m :: * -> *) payload. WorkerConfig m payload -> LogConfig
logConfig :: LogConfig
, forall (m :: * -> *) payload.
WorkerConfig m payload -> [CronJob payload]
cronJobs :: [CronJob payload]
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperInterval :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperSparseInterval :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperBucketIdle :: NominalDiffTime
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperTimeout :: NominalDiffTime
, forall (m :: * -> *) payload. WorkerConfig m payload -> UUID
workerId :: UUID
, forall (m :: * -> *) payload. WorkerConfig m payload -> Maybe Text
workerHost :: Maybe Text
, forall (m :: * -> *) payload. WorkerConfig m payload -> Maybe Value
workerMetadata :: Maybe Value
, forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerStaleThreshold :: NominalDiffTime
}
data BatchCallbacks m payload result = BatchCallbacks
{ forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> m ()
ack :: JobRead payload -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> result -> m ()
ackWith :: JobRead payload -> result -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> [JobRead payload] -> m ()
ackAll :: [JobRead payload] -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> [(JobRead payload, result)] -> m ()
ackAllWith :: [(JobRead payload, result)] -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
failRetry :: JobRead payload -> Text -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> Text -> m ()
failRetryAfter :: JobRead payload -> NominalDiffTime -> Text -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
failPermanent :: JobRead payload -> Text -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
cancelBranch :: JobRead payload -> Text -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
cancelTree :: JobRead payload -> Text -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> m ()
nack :: JobRead payload -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> m ()
nackAfter :: JobRead payload -> NominalDiffTime -> m ()
, forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NonEmpty (JobWrite payload) -> m ()
spawn :: JobRead payload -> NonEmpty (JobWrite payload) -> m ()
}
hoistBatchCallbacks :: (forall a. m a -> n a) -> BatchCallbacks m payload result -> BatchCallbacks n payload result
hoistBatchCallbacks :: forall (m :: * -> *) (n :: * -> *) payload result.
(forall a. m a -> n a)
-> BatchCallbacks m payload result
-> BatchCallbacks n payload result
hoistBatchCallbacks forall a. m a -> n a
nat BatchCallbacks m payload result
callbacks =
BatchCallbacks
{ ack :: JobRead payload -> n ()
ack = m () -> n ()
forall a. m a -> n a
nat (m () -> n ())
-> (JobRead payload -> m ()) -> JobRead payload -> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BatchCallbacks m payload result -> JobRead payload -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> m ()
ack BatchCallbacks m payload result
callbacks
, ackWith :: JobRead payload -> result -> n ()
ackWith = \JobRead payload
job result
result -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result
-> JobRead payload -> result -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> result -> m ()
ackWith BatchCallbacks m payload result
callbacks JobRead payload
job result
result)
, ackAll :: [JobRead payload] -> n ()
ackAll = m () -> n ()
forall a. m a -> n a
nat (m () -> n ())
-> ([JobRead payload] -> m ()) -> [JobRead payload] -> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BatchCallbacks m payload result -> [JobRead payload] -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> [JobRead payload] -> m ()
ackAll BatchCallbacks m payload result
callbacks
, ackAllWith :: [(JobRead payload, result)] -> n ()
ackAllWith = m () -> n ()
forall a. m a -> n a
nat (m () -> n ())
-> ([(JobRead payload, result)] -> m ())
-> [(JobRead payload, result)]
-> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BatchCallbacks m payload result
-> [(JobRead payload, result)] -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> [(JobRead payload, result)] -> m ()
ackAllWith BatchCallbacks m payload result
callbacks
, failRetry :: JobRead payload -> Text -> n ()
failRetry = \JobRead payload
job Text
msg -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
failRetry BatchCallbacks m payload result
callbacks JobRead payload
job Text
msg)
, failRetryAfter :: JobRead payload -> NominalDiffTime -> Text -> n ()
failRetryAfter = \JobRead payload
job NominalDiffTime
delay Text
msg -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> Text -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> Text -> m ()
failRetryAfter BatchCallbacks m payload result
callbacks JobRead payload
job NominalDiffTime
delay Text
msg)
, failPermanent :: JobRead payload -> Text -> n ()
failPermanent = \JobRead payload
job Text
msg -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
failPermanent BatchCallbacks m payload result
callbacks JobRead payload
job Text
msg)
, cancelBranch :: JobRead payload -> Text -> n ()
cancelBranch = \JobRead payload
job Text
msg -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
cancelBranch BatchCallbacks m payload result
callbacks JobRead payload
job Text
msg)
, cancelTree :: JobRead payload -> Text -> n ()
cancelTree = \JobRead payload
job Text
msg -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> Text -> m ()
cancelTree BatchCallbacks m payload result
callbacks JobRead payload
job Text
msg)
, nack :: JobRead payload -> n ()
nack = m () -> n ()
forall a. m a -> n a
nat (m () -> n ())
-> (JobRead payload -> m ()) -> JobRead payload -> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BatchCallbacks m payload result -> JobRead payload -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result -> JobRead payload -> m ()
nack BatchCallbacks m payload result
callbacks
, nackAfter :: JobRead payload -> NominalDiffTime -> n ()
nackAfter = \JobRead payload
job NominalDiffTime
delay -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NominalDiffTime -> m ()
nackAfter BatchCallbacks m payload result
callbacks JobRead payload
job NominalDiffTime
delay)
, spawn :: JobRead payload -> NonEmpty (JobWrite payload) -> n ()
spawn = \JobRead payload
job NonEmpty (JobWrite payload)
children -> m () -> n ()
forall a. m a -> n a
nat (BatchCallbacks m payload result
-> JobRead payload -> NonEmpty (JobWrite payload) -> m ()
forall (m :: * -> *) payload result.
BatchCallbacks m payload result
-> JobRead payload -> NonEmpty (JobWrite payload) -> m ()
spawn BatchCallbacks m payload result
callbacks JobRead payload
job NonEmpty (JobWrite payload)
children)
}
data HandlerMode m payload
=
SingleJobMode (JobHandler m payload (ResultOf m payload))
|
BatchedJobsMode
Int
(NonEmpty (JobRead payload) -> BatchCallbacks m payload (ResultOf m payload) -> m ())
handlerBatchSize :: WorkerConfig m payload -> Int
handlerBatchSize :: forall (m :: * -> *) payload. WorkerConfig m payload -> Int
handlerBatchSize WorkerConfig m payload
config = case WorkerConfig m payload -> HandlerMode m payload
forall (m :: * -> *) payload.
WorkerConfig m payload -> HandlerMode m payload
handlerMode WorkerConfig m payload
config of
SingleJobMode JobHandler m payload (ResultOf m payload)
_ -> Int
singleJobBatchSize
BatchedJobsMode Int
batchSize NonEmpty (JobRead payload)
-> BatchCallbacks m payload (ResultOf m payload) -> m ()
_ -> Int
batchSize
validateWorkerConfig :: WorkerConfig m payload -> Either Text ()
validateWorkerConfig :: forall (m :: * -> *) payload.
WorkerConfig m payload -> Either Text ()
validateWorkerConfig WorkerConfig m payload
config =
let Validation Either (NonEmpty Text) ()
result = WorkerConfig m payload -> Validation (WorkerConfig m payload)
forall (m :: * -> *) payload.
WorkerConfig m payload -> Validation (WorkerConfig m payload)
fieldInvariants WorkerConfig m payload
config Validation (WorkerConfig m payload)
-> Validation () -> Validation ()
forall a b. Validation a -> Validation b -> Validation b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> WorkerConfig m payload -> Validation ()
forall (m :: * -> *) payload.
WorkerConfig m payload -> Validation ()
crossFieldInvariants WorkerConfig m payload
config
in (NonEmpty Text -> Text)
-> Either (NonEmpty Text) () -> Either Text ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Text -> [Text] -> Text
T.intercalate Text
"; " ([Text] -> Text)
-> (NonEmpty Text -> [Text]) -> NonEmpty Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty Text -> [Text]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList) Either (NonEmpty Text) ()
result
fieldInvariants :: WorkerConfig m payload -> Validation (WorkerConfig m payload)
fieldInvariants :: forall (m :: * -> *) payload.
WorkerConfig m payload -> Validation (WorkerConfig m payload)
fieldInvariants WorkerConfig m payload
config =
Int
-> HandlerMode m payload
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload
forall (m :: * -> *) payload.
Int
-> HandlerMode m payload
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload
WorkerConfig
(Int
-> HandlerMode m payload
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation Int
-> Validation
(HandlerMode m payload
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Int -> Validation Int
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"workerCount" (WorkerConfig m payload -> Int
forall (m :: * -> *) payload. WorkerConfig m payload -> Int
workerCount WorkerConfig m payload
config)
Validation
(HandlerMode m payload
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (HandlerMode m payload)
-> Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (WorkerConfig m payload -> HandlerMode m payload
forall (m :: * -> *) payload.
WorkerConfig m payload -> HandlerMode m payload
handlerMode WorkerConfig m payload
config HandlerMode m payload
-> Validation Int -> Validation (HandlerMode m payload)
forall a b. a -> Validation b -> Validation a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Int -> Validation Int
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"handler batch size" (WorkerConfig m payload -> Int
forall (m :: * -> *) payload. WorkerConfig m payload -> Int
handlerBatchSize WorkerConfig m payload
config))
Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"pollInterval" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
pollInterval WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"visibilityTimeout" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
visibilityTimeout WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"jobHeartbeatInterval" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
jobHeartbeatInterval WorkerConfig m payload
config)
Validation
(Maybe NominalDiffTime
-> NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (Maybe NominalDiffTime)
-> Validation
(NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NominalDiffTime -> Validation NominalDiffTime)
-> Maybe NominalDiffTime -> Validation (Maybe NominalDiffTime)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"maxJobDuration") (WorkerConfig m payload -> Maybe NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe NominalDiffTime
maxJobDuration WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"workerHeartbeatInterval" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerHeartbeatInterval WorkerConfig m payload
config)
Validation
(BackoffStrategy
-> Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation BackoffStrategy
-> Validation
(Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BackoffStrategy -> Validation BackoffStrategy
forall a. a -> Validation a
waived (WorkerConfig m payload -> BackoffStrategy
forall (m :: * -> *) payload.
WorkerConfig m payload -> BackoffStrategy
backoffStrategy WorkerConfig m payload
config)
Validation
(Jitter
-> ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation Jitter
-> Validation
(ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Jitter -> Validation Jitter
forall a. a -> Validation a
waived (WorkerConfig m payload -> Jitter
forall (m :: * -> *) payload. WorkerConfig m payload -> Jitter
jitter WorkerConfig m payload
config)
Validation
(ObservabilityHooks m payload
-> (MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (ObservabilityHooks m payload)
-> Validation
((MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ObservabilityHooks m payload
-> Validation (ObservabilityHooks m payload)
forall a. a -> Validation a
waived (WorkerConfig m payload -> ObservabilityHooks m payload
forall (m :: * -> *) payload.
WorkerConfig m payload -> ObservabilityHooks m payload
observabilityHooks WorkerConfig m payload
config)
Validation
((MaintenanceOp -> Int64 -> m ())
-> WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (MaintenanceOp -> Int64 -> m ())
-> Validation
(WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (MaintenanceOp -> Int64 -> m ())
-> Validation (MaintenanceOp -> Int64 -> m ())
forall a. a -> Validation a
waived (WorkerConfig m payload -> MaintenanceOp -> Int64 -> m ()
forall (m :: * -> *) payload.
WorkerConfig m payload -> MaintenanceOp -> Int64 -> m ()
onMaintenance WorkerConfig m payload
config)
Validation
(WorkerRuntime
-> Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation WorkerRuntime
-> Validation
(Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> WorkerRuntime -> Validation WorkerRuntime
forall a. a -> Validation a
waived (WorkerConfig m payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime WorkerConfig m payload
config)
Validation
(Maybe String
-> Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (Maybe String)
-> Validation
(Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe String -> Validation (Maybe String)
forall a. a -> Validation a
waived (WorkerConfig m payload -> Maybe String
forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe String
livenessFile WorkerConfig m payload
config)
Validation
(Maybe NominalDiffTime
-> LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation (Maybe NominalDiffTime)
-> Validation
(LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NominalDiffTime -> Validation NominalDiffTime)
-> Maybe NominalDiffTime -> Validation (Maybe NominalDiffTime)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
nonNegative Text
"gracefulShutdownTimeout") (WorkerConfig m payload -> Maybe NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> Maybe NominalDiffTime
gracefulShutdownTimeout WorkerConfig m payload
config)
Validation
(LogConfig
-> [CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation LogConfig
-> Validation
([CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> LogConfig -> Validation LogConfig
forall a. a -> Validation a
waived (WorkerConfig m payload -> LogConfig
forall (m :: * -> *) payload. WorkerConfig m payload -> LogConfig
logConfig WorkerConfig m payload
config)
Validation
([CronJob payload]
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation [CronJob payload]
-> Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [CronJob payload] -> Validation [CronJob payload]
forall a. a -> Validation a
waived (WorkerConfig m payload -> [CronJob payload]
forall (m :: * -> *) payload.
WorkerConfig m payload -> [CronJob payload]
cronJobs WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"reaperInterval" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperInterval WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"reaperSparseInterval" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperSparseInterval WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"reaperBucketIdle" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperBucketIdle WorkerConfig m payload
config)
Validation
(NominalDiffTime
-> UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation
(UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"reaperTimeout" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
reaperTimeout WorkerConfig m payload
config)
Validation
(UUID
-> Maybe Text
-> Maybe Value
-> NominalDiffTime
-> WorkerConfig m payload)
-> Validation UUID
-> Validation
(Maybe Text
-> Maybe Value -> NominalDiffTime -> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> UUID -> Validation UUID
forall a. a -> Validation a
waived (WorkerConfig m payload -> UUID
forall (m :: * -> *) payload. WorkerConfig m payload -> UUID
workerId WorkerConfig m payload
config)
Validation
(Maybe Text
-> Maybe Value -> NominalDiffTime -> WorkerConfig m payload)
-> Validation (Maybe Text)
-> Validation
(Maybe Value -> NominalDiffTime -> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Text -> Validation (Maybe Text)
forall a. a -> Validation a
waived (WorkerConfig m payload -> Maybe Text
forall (m :: * -> *) payload. WorkerConfig m payload -> Maybe Text
workerHost WorkerConfig m payload
config)
Validation
(Maybe Value -> NominalDiffTime -> WorkerConfig m payload)
-> Validation (Maybe Value)
-> Validation (NominalDiffTime -> WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Value -> Validation (Maybe Value)
forall a. a -> Validation a
waived (WorkerConfig m payload -> Maybe Value
forall (m :: * -> *) payload. WorkerConfig m payload -> Maybe Value
workerMetadata WorkerConfig m payload
config)
Validation (NominalDiffTime -> WorkerConfig m payload)
-> Validation NominalDiffTime
-> Validation (WorkerConfig m payload)
forall a b. Validation (a -> b) -> Validation a -> Validation b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> NominalDiffTime -> Validation NominalDiffTime
forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
"workerStaleThreshold" (WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerStaleThreshold WorkerConfig m payload
config)
crossFieldInvariants :: WorkerConfig m payload -> Validation ()
crossFieldInvariants :: forall (m :: * -> *) payload.
WorkerConfig m payload -> Validation ()
crossFieldInvariants WorkerConfig m payload
config =
Bool -> Text -> Validation ()
require
(WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
jobHeartbeatInterval WorkerConfig m payload
config NominalDiffTime -> NominalDiffTime -> Bool
forall a. Ord a => a -> a -> Bool
< WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
visibilityTimeout WorkerConfig m payload
config)
Text
"jobHeartbeatInterval must be less than visibilityTimeout"
Validation () -> Validation () -> Validation ()
forall a b. Validation a -> Validation b -> Validation b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> Text -> Validation ()
require
(WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerHeartbeatInterval WorkerConfig m payload
config NominalDiffTime -> NominalDiffTime -> Bool
forall a. Ord a => a -> a -> Bool
< WorkerConfig m payload -> NominalDiffTime
forall (m :: * -> *) payload.
WorkerConfig m payload -> NominalDiffTime
workerStaleThreshold WorkerConfig m payload
config)
Text
"workerHeartbeatInterval must be less than workerStaleThreshold"
newtype Validation a = Validation (Either (NonEmpty Text) a)
deriving newtype ((forall a b. (a -> b) -> Validation a -> Validation b)
-> (forall a b. a -> Validation b -> Validation a)
-> Functor Validation
forall a b. a -> Validation b -> Validation a
forall a b. (a -> b) -> Validation a -> Validation b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Validation a -> Validation b
fmap :: forall a b. (a -> b) -> Validation a -> Validation b
$c<$ :: forall a b. a -> Validation b -> Validation a
<$ :: forall a b. a -> Validation b -> Validation a
Functor)
instance Applicative Validation where
pure :: forall a. a -> Validation a
pure = Either (NonEmpty Text) a -> Validation a
forall a. Either (NonEmpty Text) a -> Validation a
Validation (Either (NonEmpty Text) a -> Validation a)
-> (a -> Either (NonEmpty Text) a) -> a -> Validation a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either (NonEmpty Text) a
forall a b. b -> Either a b
Right
Validation (Left NonEmpty Text
left) <*> :: forall a b. Validation (a -> b) -> Validation a -> Validation b
<*> Validation (Left NonEmpty Text
right) = Either (NonEmpty Text) b -> Validation b
forall a. Either (NonEmpty Text) a -> Validation a
Validation (NonEmpty Text -> Either (NonEmpty Text) b
forall a b. a -> Either a b
Left (NonEmpty Text
left NonEmpty Text -> NonEmpty Text -> NonEmpty Text
forall a. Semigroup a => a -> a -> a
<> NonEmpty Text
right))
Validation Either (NonEmpty Text) (a -> b)
apply <*> Validation Either (NonEmpty Text) a
value = Either (NonEmpty Text) b -> Validation b
forall a. Either (NonEmpty Text) a -> Validation a
Validation (Either (NonEmpty Text) (a -> b)
apply Either (NonEmpty Text) (a -> b)
-> Either (NonEmpty Text) a -> Either (NonEmpty Text) b
forall a b.
Either (NonEmpty Text) (a -> b)
-> Either (NonEmpty Text) a -> Either (NonEmpty Text) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Either (NonEmpty Text) a
value)
waived :: a -> Validation a
waived :: forall a. a -> Validation a
waived = a -> Validation a
forall a. a -> Validation a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
positive :: (Num a, Ord a) => Text -> a -> Validation a
positive :: forall a. (Num a, Ord a) => Text -> a -> Validation a
positive Text
label a
value = a
value a -> Validation () -> Validation a
forall a b. a -> Validation b -> Validation a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Text -> Validation ()
require (a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0) (Text
label Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" must be greater than zero")
nonNegative :: (Num a, Ord a) => Text -> a -> Validation a
nonNegative :: forall a. (Num a, Ord a) => Text -> a -> Validation a
nonNegative Text
label a
value = a
value a -> Validation () -> Validation a
forall a b. a -> Validation b -> Validation a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Text -> Validation ()
require (a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
0) (Text
label Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" must not be negative")
require :: Bool -> Text -> Validation ()
require :: Bool -> Text -> Validation ()
require Bool
condition Text
message = Either (NonEmpty Text) () -> Validation ()
forall a. Either (NonEmpty Text) a -> Validation a
Validation (if Bool
condition then () -> Either (NonEmpty Text) ()
forall a b. b -> Either a b
Right () else NonEmpty Text -> Either (NonEmpty Text) ()
forall a b. a -> Either a b
Left (Text
message Text -> [Text] -> NonEmpty Text
forall a. a -> [a] -> NonEmpty a
:| []))
transactionalWorkerConfig
:: (MonadArbiter n, MonadIO m)
=> Int
-> JobHandler n payload (ResultOf n payload)
-> m (WorkerConfig n payload)
transactionalWorkerConfig :: forall (n :: * -> *) (m :: * -> *) payload.
(MonadArbiter n, MonadIO m) =>
Int
-> JobHandler n payload (ResultOf n payload)
-> m (WorkerConfig n payload)
transactionalWorkerConfig Int
workerCnt JobHandler n payload (ResultOf n payload)
handler =
Int -> HandlerMode n payload -> m (WorkerConfig n payload)
forall (n :: * -> *) (m :: * -> *) payload.
(Applicative n, MonadIO m) =>
Int -> HandlerMode n payload -> m (WorkerConfig n payload)
mkDefaultConfig Int
workerCnt (JobHandler n payload (ResultOf n payload) -> HandlerMode n payload
forall (m :: * -> *) payload.
JobHandler m payload (ResultOf m payload) -> HandlerMode m payload
SingleJobMode JobHandler n payload (ResultOf n payload)
handler)
batchedWorkerConfig
:: (MonadArbiter n, MonadIO m)
=> Int
-> Int
-> (NonEmpty (JobRead payload) -> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
batchedWorkerConfig :: forall (n :: * -> *) (m :: * -> *) payload.
(MonadArbiter n, MonadIO m) =>
Int
-> Int
-> (NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
batchedWorkerConfig Int
workerCnt Int
batchSize NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ()
handler =
Int -> HandlerMode n payload -> m (WorkerConfig n payload)
forall (n :: * -> *) (m :: * -> *) payload.
(Applicative n, MonadIO m) =>
Int -> HandlerMode n payload -> m (WorkerConfig n payload)
mkDefaultConfig Int
workerCnt (Int
-> (NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> HandlerMode n payload
forall (m :: * -> *) payload.
Int
-> (NonEmpty (JobRead payload)
-> BatchCallbacks m payload (ResultOf m payload) -> m ())
-> HandlerMode m payload
BatchedJobsMode Int
batchSize NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ()
handler)
manualWorkerConfig
:: (MonadArbiter n, MonadIO m)
=> Int
-> (JobRead payload -> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
manualWorkerConfig :: forall (n :: * -> *) (m :: * -> *) payload.
(MonadArbiter n, MonadIO m) =>
Int
-> (JobRead payload
-> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
manualWorkerConfig Int
workerCnt JobRead payload
-> BatchCallbacks n payload (ResultOf n payload) -> n ()
handler =
Int
-> Int
-> (NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
forall (n :: * -> *) (m :: * -> *) payload.
(MonadArbiter n, MonadIO m) =>
Int
-> Int
-> (NonEmpty (JobRead payload)
-> BatchCallbacks n payload (ResultOf n payload) -> n ())
-> m (WorkerConfig n payload)
batchedWorkerConfig Int
workerCnt Int
singleJobBatchSize (\(JobRead payload
job :| [JobRead payload]
_) -> JobRead payload
-> BatchCallbacks n payload (ResultOf n payload) -> n ()
handler JobRead payload
job)
withHooks
:: (ObservabilityHooks m payload -> ObservabilityHooks m payload)
-> WorkerConfig m payload
-> WorkerConfig m payload
withHooks :: forall (m :: * -> *) payload.
(ObservabilityHooks m payload -> ObservabilityHooks m payload)
-> WorkerConfig m payload -> WorkerConfig m payload
withHooks ObservabilityHooks m payload -> ObservabilityHooks m payload
rework WorkerConfig m payload
cfg = WorkerConfig m payload
cfg {observabilityHooks = rework (observabilityHooks cfg)}
withMaintenance
:: (MonadUnliftIO m)
=> (MaintenanceOp -> Int64 -> m ())
-> WorkerConfig m payload
-> WorkerConfig m payload
withMaintenance :: forall (m :: * -> *) payload.
MonadUnliftIO m =>
(MaintenanceOp -> Int64 -> m ())
-> WorkerConfig m payload -> WorkerConfig m payload
withMaintenance MaintenanceOp -> Int64 -> m ()
report WorkerConfig m payload
cfg =
WorkerConfig m payload
cfg {onMaintenance = \MaintenanceOp
operation Int64
count -> MaintenanceOp -> Int64 -> m ()
report MaintenanceOp
operation Int64
count m () -> m () -> m ()
forall (m :: * -> *). MonadUnliftIO m => m () -> m () -> m ()
`andThen` WorkerConfig m payload -> MaintenanceOp -> Int64 -> m ()
forall (m :: * -> *) payload.
WorkerConfig m payload -> MaintenanceOp -> Int64 -> m ()
onMaintenance WorkerConfig m payload
cfg MaintenanceOp
operation Int64
count}
defaultPollInterval :: NominalDiffTime
defaultPollInterval :: NominalDiffTime
defaultPollInterval = NominalDiffTime
5
defaultVisibilityTimeout :: NominalDiffTime
defaultVisibilityTimeout :: NominalDiffTime
defaultVisibilityTimeout = NominalDiffTime
60
defaultJobHeartbeatInterval :: NominalDiffTime
defaultJobHeartbeatInterval :: NominalDiffTime
defaultJobHeartbeatInterval = NominalDiffTime
30
defaultWorkerHeartbeatInterval :: NominalDiffTime
defaultWorkerHeartbeatInterval :: NominalDiffTime
defaultWorkerHeartbeatInterval = NominalDiffTime
10
defaultBackoffBase :: Double
defaultBackoffBase :: Double
defaultBackoffBase = Double
2.0
defaultBackoffCap :: NominalDiffTime
defaultBackoffCap :: NominalDiffTime
defaultBackoffCap = NominalDiffTime
1_048_576
defaultGracefulShutdownTimeout :: NominalDiffTime
defaultGracefulShutdownTimeout :: NominalDiffTime
defaultGracefulShutdownTimeout = NominalDiffTime
30
defaultReaperInterval :: NominalDiffTime
defaultReaperInterval :: NominalDiffTime
defaultReaperInterval = NominalDiffTime
300
defaultWorkerStaleThreshold :: NominalDiffTime
defaultWorkerStaleThreshold :: NominalDiffTime
defaultWorkerStaleThreshold = NominalDiffTime
300
defaultMaintenanceSparseInterval :: NominalDiffTime
defaultMaintenanceSparseInterval :: NominalDiffTime
defaultMaintenanceSparseInterval = NominalDiffTime
3600
defaultMaintenanceBucketIdle :: NominalDiffTime
defaultMaintenanceBucketIdle :: NominalDiffTime
defaultMaintenanceBucketIdle = NominalDiffTime
300
defaultMaintenanceTimeout :: NominalDiffTime
defaultMaintenanceTimeout :: NominalDiffTime
defaultMaintenanceTimeout = NominalDiffTime
300
mkDefaultConfig
:: (Applicative n, MonadIO m)
=> Int
-> HandlerMode n payload
-> m (WorkerConfig n payload)
mkDefaultConfig :: forall (n :: * -> *) (m :: * -> *) payload.
(Applicative n, MonadIO m) =>
Int -> HandlerMode n payload -> m (WorkerConfig n payload)
mkDefaultConfig Int
workerCnt HandlerMode n payload
mode = do
heartbeatTMVar <- m (TMVar ())
forall (m :: * -> *) a. MonadIO m => m (TMVar a)
newEmptyTMVarIO
stateTVar <- newTVarIO Running
pauseTVar <- newTVarIO False
pauseEpochTVar <- newTVarIO 0
listenerReadyTVar <- newTVarIO False
uuid <- liftIO UUID.nextRandom
tmpDir <- liftIO getTemporaryDirectory
host <- liftIO getHostName
let livenessPath = String
tmpDir String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/arbiter-worker-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> UUID -> String
toString UUID
uuid
pure
WorkerConfig
{ workerCount = workerCnt
, handlerMode = mode
, pollInterval = defaultPollInterval
, visibilityTimeout = defaultVisibilityTimeout
, jobHeartbeatInterval = defaultJobHeartbeatInterval
, maxJobDuration = Nothing
, workerHeartbeatInterval = defaultWorkerHeartbeatInterval
, backoffStrategy = exponentialBackoff defaultBackoffBase defaultBackoffCap
, jitter = EqualJitter
, observabilityHooks = defaultObservabilityHooks
, onMaintenance = \MaintenanceOp
_ Int64
_ -> () -> n ()
forall a. a -> n a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
, workerRuntime =
WorkerRuntime
{ runtimeStateVar = stateTVar
, runtimePauseVar = pauseTVar
, runtimePauseEpoch = pauseEpochTVar
, runtimeHeartbeatSignal = heartbeatTMVar
, runtimeListenerReadyVar = listenerReadyTVar
}
, livenessFile = Just livenessPath
, gracefulShutdownTimeout = Just defaultGracefulShutdownTimeout
, logConfig = withIdentity ("worker_id" .= uuid) defaultLogConfig
, cronJobs = []
, reaperInterval = defaultReaperInterval
, reaperSparseInterval = defaultMaintenanceSparseInterval
, reaperBucketIdle = defaultMaintenanceBucketIdle
, reaperTimeout = defaultMaintenanceTimeout
, workerId = uuid
, workerHost = Just (T.pack host)
, workerMetadata = Nothing
, workerStaleThreshold = defaultWorkerStaleThreshold
}
workerStateVar :: WorkerConfig n payload -> TVar WorkerState
workerStateVar :: forall (n :: * -> *) payload.
WorkerConfig n payload -> TVar WorkerState
workerStateVar = WorkerRuntime -> TVar WorkerState
runtimeStateVar (WorkerRuntime -> TVar WorkerState)
-> (WorkerConfig n payload -> WorkerRuntime)
-> WorkerConfig n payload
-> TVar WorkerState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WorkerConfig n payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime
pauseVar :: WorkerConfig n payload -> TVar Bool
pauseVar :: forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Bool
pauseVar = WorkerRuntime -> TVar Bool
runtimePauseVar (WorkerRuntime -> TVar Bool)
-> (WorkerConfig n payload -> WorkerRuntime)
-> WorkerConfig n payload
-> TVar Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WorkerConfig n payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime
pauseEpoch :: WorkerConfig n payload -> TVar Word64
pauseEpoch :: forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Word64
pauseEpoch = WorkerRuntime -> TVar Word64
runtimePauseEpoch (WorkerRuntime -> TVar Word64)
-> (WorkerConfig n payload -> WorkerRuntime)
-> WorkerConfig n payload
-> TVar Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WorkerConfig n payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime
heartbeatSignal :: WorkerConfig n payload -> TMVar ()
heartbeatSignal :: forall (n :: * -> *) payload. WorkerConfig n payload -> TMVar ()
heartbeatSignal = WorkerRuntime -> TMVar ()
runtimeHeartbeatSignal (WorkerRuntime -> TMVar ())
-> (WorkerConfig n payload -> WorkerRuntime)
-> WorkerConfig n payload
-> TMVar ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WorkerConfig n payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime
pulseHeartbeat :: WorkerConfig n payload -> STM.STM ()
pulseHeartbeat :: forall (n :: * -> *) payload. WorkerConfig n payload -> STM ()
pulseHeartbeat WorkerConfig n payload
config = STM Bool -> STM ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (TMVar () -> () -> STM Bool
forall a. TMVar a -> a -> STM Bool
STM.tryPutTMVar (WorkerConfig n payload -> TMVar ()
forall (n :: * -> *) payload. WorkerConfig n payload -> TMVar ()
heartbeatSignal WorkerConfig n payload
config) ())
listenerReadyVar :: WorkerConfig n payload -> TVar Bool
listenerReadyVar :: forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Bool
listenerReadyVar = WorkerRuntime -> TVar Bool
runtimeListenerReadyVar (WorkerRuntime -> TVar Bool)
-> (WorkerConfig n payload -> WorkerRuntime)
-> WorkerConfig n payload
-> TVar Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WorkerConfig n payload -> WorkerRuntime
forall (m :: * -> *) payload.
WorkerConfig m payload -> WorkerRuntime
workerRuntime
shutdownWorkerPool :: (MonadIO m) => WorkerConfig n payload -> m ()
shutdownWorkerPool :: forall (m :: * -> *) (n :: * -> *) payload.
MonadIO m =>
WorkerConfig n payload -> m ()
shutdownWorkerPool WorkerConfig n payload
config = STM () -> m ()
forall (m :: * -> *) a. MonadIO m => STM a -> m a
STM.atomically (STM () -> m ()) -> STM () -> m ()
forall a b. (a -> b) -> a -> b
$ TVar WorkerState -> WorkerState -> STM ()
forall a. TVar a -> a -> STM ()
STM.writeTVar (WorkerConfig n payload -> TVar WorkerState
forall (n :: * -> *) payload.
WorkerConfig n payload -> TVar WorkerState
workerStateVar WorkerConfig n payload
config) WorkerState
ShuttingDown
getWorkerState :: (MonadIO m) => WorkerConfig n payload -> m WorkerState
getWorkerState :: forall (m :: * -> *) (n :: * -> *) payload.
MonadIO m =>
WorkerConfig n payload -> m WorkerState
getWorkerState WorkerConfig n payload
config = STM WorkerState -> m WorkerState
forall (m :: * -> *) a. MonadIO m => STM a -> m a
STM.atomically (STM WorkerState -> m WorkerState)
-> STM WorkerState -> m WorkerState
forall a b. (a -> b) -> a -> b
$ WorkerConfig n payload -> STM WorkerState
forall (n :: * -> *) payload.
WorkerConfig n payload -> STM WorkerState
readEffectiveState WorkerConfig n payload
config
getListenerReady :: (MonadIO m) => WorkerConfig n payload -> m Bool
getListenerReady :: forall (m :: * -> *) (n :: * -> *) payload.
MonadIO m =>
WorkerConfig n payload -> m Bool
getListenerReady WorkerConfig n payload
config = TVar Bool -> m Bool
forall (m :: * -> *) a. MonadIO m => TVar a -> m a
STM.readTVarIO (WorkerConfig n payload -> TVar Bool
forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Bool
listenerReadyVar WorkerConfig n payload
config)
writePause :: WorkerConfig n payload -> Bool -> STM.STM ()
writePause :: forall (n :: * -> *) payload.
WorkerConfig n payload -> Bool -> STM ()
writePause WorkerConfig n payload
config Bool
paused = do
TVar Bool -> Bool -> STM ()
forall a. TVar a -> a -> STM ()
STM.writeTVar (WorkerConfig n payload -> TVar Bool
forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Bool
pauseVar WorkerConfig n payload
config) Bool
paused
TVar Word64 -> (Word64 -> Word64) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
STM.modifyTVar' (WorkerConfig n payload -> TVar Word64
forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Word64
pauseEpoch WorkerConfig n payload
config) (Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64
1)
writePauseIfCurrent :: WorkerConfig n payload -> Word64 -> Bool -> STM.STM ()
writePauseIfCurrent :: forall (n :: * -> *) payload.
WorkerConfig n payload -> Word64 -> Bool -> STM ()
writePauseIfCurrent WorkerConfig n payload
config Word64
epoch Bool
paused = do
current <- TVar Word64 -> STM Word64
forall a. TVar a -> STM a
STM.readTVar (WorkerConfig n payload -> TVar Word64
forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Word64
pauseEpoch WorkerConfig n payload
config)
when (current == epoch) $ writePause config paused
readEffectiveState :: WorkerConfig n payload -> STM.STM WorkerState
readEffectiveState :: forall (n :: * -> *) payload.
WorkerConfig n payload -> STM WorkerState
readEffectiveState WorkerConfig n payload
config = do
state <- TVar WorkerState -> STM WorkerState
forall a. TVar a -> STM a
STM.readTVar (WorkerConfig n payload -> TVar WorkerState
forall (n :: * -> *) payload.
WorkerConfig n payload -> TVar WorkerState
workerStateVar WorkerConfig n payload
config)
case state of
WorkerState
ShuttingDown -> WorkerState -> STM WorkerState
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure WorkerState
ShuttingDown
WorkerState
_ -> do
paused <- TVar Bool -> STM Bool
forall a. TVar a -> STM a
STM.readTVar (WorkerConfig n payload -> TVar Bool
forall (n :: * -> *) payload. WorkerConfig n payload -> TVar Bool
pauseVar WorkerConfig n payload
config)
pure $ if paused then Paused else state