| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
Arbiter.Worker
Description
Public worker API: pools, job results, configuration, logging, maintenance, and cron.
Synopsis
- runWorkerPool :: forall payload m. (RegistryAdmissionPolicies (RegistryOf m), EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryTables (RegistryOf m)) => WorkerConfig m payload -> m ()
- namedWorkerPool :: forall payload (m :: Type -> Type). (EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryAdmissionPolicies (RegistryOf m), RegistryTables (RegistryOf m)) => WorkerConfig m payload -> NamedWorkerPool m
- poolConfigForWorkers :: forall (m :: Type -> Type). RegistryTables (RegistryOf m) => [NamedWorkerPool m] -> IO PoolConfig
- runSelectedWorkerPools :: MonadUnliftIO m => [Text] -> [NamedWorkerPool m] -> m ()
- runWorkerPools :: (MonadUnliftIO m, RegistryTables (RegistryOf m)) => [NamedWorkerPool m] -> m ()
- shutdownWorkerPools :: forall m (m' :: Type -> Type). MonadIO m => [NamedWorkerPool m'] -> m ()
- data NamedWorkerPool (m :: Type -> Type) = (EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryAdmissionPolicies (RegistryOf m), RegistryTables (RegistryOf m)) => NamedWorkerPool {
- workerPoolName :: Text
- workerPoolConfig :: WorkerConfig m payload
- newtype WorkerPoolSelectionException = WorkerPoolSelectionException Text
- getEnabledQueues :: forall (registry :: JobPayloadRegistry). RegistryTables registry => Proxy registry -> IO [Text]
- module Arbiter.Core.JobResult
- childResults :: (FromJSON (ResultOf m payload), MonadArbiter m) => JobRead payload -> m (Map Int64 (Either Text (ResultOf m payload)), Map Int64 Text)
- mergedChildResults :: (FromJSON (ResultOf m payload), MonadArbiter m, Monoid (ResultOf m payload)) => JobRead payload -> m (ResultOf m payload, Map Int64 Text)
- mergeChildResults :: Monoid a => Map Int64 (Either Text a) -> a
- storeJobResult :: (EncodeJobResult result, MonadArbiter m) => JobRead payload -> result -> m ()
- storeEncodedResult :: MonadArbiter m => JobRead payload -> Maybe Value -> m ()
- data WorkerConfig (m :: Type -> Type) payload = WorkerConfig {
- workerCount :: Int
- handlerMode :: HandlerMode m payload
- pollInterval :: NominalDiffTime
- visibilityTimeout :: NominalDiffTime
- jobHeartbeatInterval :: NominalDiffTime
- maxJobDuration :: Maybe NominalDiffTime
- workerHeartbeatInterval :: NominalDiffTime
- backoffStrategy :: BackoffStrategy
- jitter :: Jitter
- observabilityHooks :: ObservabilityHooks m payload
- onMaintenance :: MaintenanceOp -> Int64 -> m ()
- workerRuntime :: WorkerRuntime
- livenessFile :: Maybe FilePath
- gracefulShutdownTimeout :: Maybe NominalDiffTime
- logConfig :: LogConfig
- cronJobs :: [CronJob payload]
- reaperInterval :: NominalDiffTime
- reaperSparseInterval :: NominalDiffTime
- reaperBucketIdle :: NominalDiffTime
- reaperTimeout :: NominalDiffTime
- workerId :: UUID
- workerHost :: Maybe Text
- workerMetadata :: Maybe Value
- workerStaleThreshold :: NominalDiffTime
- transactionalWorkerConfig :: forall (n :: Type -> Type) m payload. (MonadArbiter n, MonadIO m) => Int -> JobHandler n payload (ResultOf n payload) -> m (WorkerConfig n payload)
- manualWorkerConfig :: (MonadArbiter n, MonadIO m) => Int -> (JobRead payload -> BatchCallbacks n payload (ResultOf n payload) -> n ()) -> m (WorkerConfig n payload)
- batchedWorkerConfig :: (MonadArbiter n, MonadIO m) => Int -> Int -> (NonEmpty (JobRead payload) -> BatchCallbacks n payload (ResultOf n payload) -> n ()) -> m (WorkerConfig n payload)
- withHooks :: forall (m :: Type -> Type) payload. (ObservabilityHooks m payload -> ObservabilityHooks m payload) -> WorkerConfig m payload -> WorkerConfig m payload
- withMaintenance :: MonadUnliftIO m => (MaintenanceOp -> Int64 -> m ()) -> WorkerConfig m payload -> WorkerConfig m payload
- data HandlerMode (m :: Type -> Type) payload
- = SingleJobMode (JobHandler m payload (ResultOf m payload))
- | BatchedJobsMode Int (NonEmpty (JobRead payload) -> BatchCallbacks m payload (ResultOf m payload) -> m ())
- handlerBatchSize :: forall (m :: Type -> Type) payload. WorkerConfig m payload -> Int
- type ResultOf (m :: Type -> Type) payload = ResultFor payload (RegistryOf m)
- newtype WorkerConfigException = WorkerConfigException Text
- validateWorkerConfig :: forall (m :: Type -> Type) payload. WorkerConfig m payload -> Either Text ()
- defaultMaintenanceSparseInterval :: NominalDiffTime
- defaultMaintenanceBucketIdle :: NominalDiffTime
- defaultMaintenanceTimeout :: NominalDiffTime
- module Arbiter.Worker.BackoffStrategy
- data BatchCallbacks (m :: Type -> Type) payload result = BatchCallbacks {
- ack :: JobRead payload -> m ()
- ackWith :: JobRead payload -> result -> m ()
- ackAll :: [JobRead payload] -> m ()
- ackAllWith :: [(JobRead payload, result)] -> m ()
- failRetry :: JobRead payload -> Text -> m ()
- failRetryAfter :: JobRead payload -> NominalDiffTime -> Text -> m ()
- failPermanent :: JobRead payload -> Text -> m ()
- cancelBranch :: JobRead payload -> Text -> m ()
- cancelTree :: JobRead payload -> Text -> m ()
- nack :: JobRead payload -> m ()
- nackAfter :: JobRead payload -> NominalDiffTime -> m ()
- spawn :: JobRead payload -> NonEmpty (JobWrite payload) -> m ()
- hoistBatchCallbacks :: (forall a. m a -> n a) -> BatchCallbacks m payload result -> BatchCallbacks n payload result
- data WorkerState
- data WorkerRuntime
- shutdownWorkerPool :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m ()
- getWorkerState :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m WorkerState
- getListenerReady :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m Bool
- readEffectiveState :: forall (n :: Type -> Type) payload. WorkerConfig n payload -> STM WorkerState
- data LogConfig = LogConfig {}
- data LogDestination
- = LogStdout
- | LogStderr
- | LogFastLogger LoggerSet
- | LogCallback (LogLevel -> Text -> [Pair] -> IO ())
- | LogTee LogDestination LogDestination
- | LogDiscard
- defaultLogConfig :: LogConfig
- silentLogConfig :: LogConfig
- data LogLevel
- type Pair = (Key, Value)
- (.=) :: (KeyValue e kv, ToJSON v) => Key -> v -> kv
- runMaintenancePass :: (RegistryAdmissionPolicies (RegistryOf m), MonadArbiter m, RegistryTables (RegistryOf m)) => LogConfig -> (MaintenanceOp -> Int64 -> m ()) -> MaintenancePace -> NominalDiffTime -> m [MaintenanceOp]
- data MaintenancePace = MaintenancePace {}
- data MaintenanceOp
- maintenanceOpName :: MaintenanceOp -> Text
- data CronJob payload = CronJob {
- name :: Text
- cronExpression :: Text
- overlap :: OverlapPolicy
- backfill :: BackfillPolicy
- timezone :: Maybe Text
- initiallyEnabled :: Bool
- builder :: TickKind -> UTCTime -> JobWrite payload
- data OverlapPolicy
- data BackfillPolicy
- data TickKind
- cronJob :: Text -> Text -> OverlapPolicy -> (TickKind -> UTCTime -> JobWrite payload) -> Either String (CronJob payload)
- cronJobInTimezone :: Text -> Text -> Text -> OverlapPolicy -> (TickKind -> UTCTime -> JobWrite payload) -> Either String (CronJob payload)
- overlapPolicyToText :: OverlapPolicy -> Text
- overlapPolicyFromText :: Text -> Maybe OverlapPolicy
- validateCronScheduleUpdate :: CronScheduleUpdate -> Either Text ()
- updateCronScheduleChecked :: MonadArbiter m => Text -> CronScheduleUpdate -> m (Either Text Int64)
Running worker pools
runWorkerPool :: forall payload m. (RegistryAdmissionPolicies (RegistryOf m), EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryTables (RegistryOf m)) => WorkerConfig m payload -> m ()Source #
Run a worker pool until shutdownWorkerPool, then drain within
gracefulShutdownTimeout. Throws WorkerConfigException for an invalid config.
namedWorkerPool :: forall payload (m :: Type -> Type). (EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryAdmissionPolicies (RegistryOf m), RegistryTables (RegistryOf m)) => WorkerConfig m payload -> NamedWorkerPool mSource #
Name a pool from its payload's registry entry.
poolConfigForWorkers :: forall (m :: Type -> Type). RegistryTables (RegistryOf m) => [NamedWorkerPool m] -> IO PoolConfigSource #
A single-stripe connection pool sized for the enabled pools' threads and the listener.
Unset or blank ARBITER_ENABLED_QUEUES enables all queues. Throws
WorkerConfigException for an invalid enabled pool config, and
InternalException when ARBITER_ENABLED_QUEUES has an unknown
name or names no queues.
runSelectedWorkerPools :: MonadUnliftIO m => [Text] -> [NamedWorkerPool m] -> m ()Source #
Run only named pools. A pool that exits winds down its peers. After every peer has
been joined, the failure of the first failed pool in list order is rethrown. Throws
WorkerPoolSelectionException for a name with no pool, or when no pool is selected.
runWorkerPools :: (MonadUnliftIO m, RegistryTables (RegistryOf m)) => [NamedWorkerPool m] -> m ()Source #
Run the pools selected by ARBITER_ENABLED_QUEUES, or every configured
pool when it is unset or blank. Throws InternalException
when ARBITER_ENABLED_QUEUES has an unknown name or names no queues, and
WorkerPoolSelectionException for a selected queue with no pool, or when no pool
is selected.
shutdownWorkerPools :: forall m (m' :: Type -> Type). MonadIO m => [NamedWorkerPool m'] -> m ()Source #
Signal graceful shutdown to every pool atomically.
data NamedWorkerPool (m :: Type -> Type)Source #
A worker pool paired with its registry-derived queue name.
Constructors
| (EncodeJobResult (ResultOf m payload), QueueOperation m payload, RegistryAdmissionPolicies (RegistryOf m), RegistryTables (RegistryOf m)) => NamedWorkerPool | |
Fields
| |
newtype WorkerPoolSelectionExceptionSource #
A requested queue has no configured pool, or selection is empty.
Constructors
| WorkerPoolSelectionException Text |
Instances
| Eq WorkerPoolSelectionException Source # | |
Defined in Arbiter.Worker.MultiQueue | |
| Exception WorkerPoolSelectionException Source # | |
| Show WorkerPoolSelectionException Source # | |
Defined in Arbiter.Worker.MultiQueue Methods showsPrec :: Int -> WorkerPoolSelectionException -> ShowS# | |
getEnabledQueues :: forall (registry :: JobPayloadRegistry). RegistryTables registry => Proxy registry -> IO [Text]Source #
Validated, comma-separated queue names from ARBITER_ENABLED_QUEUES.
Unset or blank selects all registered queues. Unknown names, or a value that names
no queues, throw InternalException.
Job results
module Arbiter.Core.JobResult
childResults :: (FromJSON (ResultOf m payload), MonadArbiter m) => JobRead payload -> m (Map Int64 (Either Text (ResultOf m payload)), Map Int64 Text)Source #
A rollup parent's immediate child results, keyed by child id, and its DLQ
errors, keyed by DLQ row id for retryFromDLQ. A Left
is a DLQ child's error or a decode failure.
mergedChildResults :: (FromJSON (ResultOf m payload), MonadArbiter m, Monoid (ResultOf m payload)) => JobRead payload -> m (ResultOf m payload, Map Int64 Text)Source #
childResults with successfully decoded values combined through Monoid.
storeJobResult :: (EncodeJobResult result, MonadArbiter m) => JobRead payload -> result -> m ()Source #
Store a job's result for its parent rollup. A root job's result goes on its
archive entry only when its archiveFor is positive.
The archive entry exists only after the job's ack.
storeEncodedResult :: MonadArbiter m => JobRead payload -> Maybe Value -> m ()Source #
storeJobResult on an already-encoded result. Nothing stores nothing.
Configuration
data WorkerConfig (m :: Type -> Type) payloadSource #
Configuration for a worker pool.
Constructors
| WorkerConfig | |
Fields
| |
transactionalWorkerConfig :: forall (n :: Type -> Type) m payload. (MonadArbiter n, MonadIO m) => Int -> JobHandler n payload (ResultOf n payload) -> m (WorkerConfig n payload)Source #
Arguments
| :: forall (n :: Type -> Type) m payload. (MonadArbiter n, MonadIO m) | |
| => Int | Worker count |
| -> JobHandler n payload (ResultOf n payload) | Handler returning the result type |
| -> m (WorkerConfig n payload) |
Create a WorkerConfig running one job per group in a worker transaction
held for the duration of the handler.
manualWorkerConfig :: (MonadArbiter n, MonadIO m) => Int -> (JobRead payload -> BatchCallbacks n payload (ResultOf n payload) -> n ()) -> m (WorkerConfig n payload)Source #
Arguments
| :: (MonadArbiter n, MonadIO m) | |
| => Int | Worker count |
| -> (JobRead payload -> BatchCallbacks n payload (ResultOf n payload) -> n ()) | Job handler |
| -> m (WorkerConfig n payload) |
Create a WorkerConfig that passes one job per handler call, no worker transaction.
The handler finalizes the job through BatchCallbacks.
batchedWorkerConfig :: (MonadArbiter n, MonadIO m) => Int -> Int -> (NonEmpty (JobRead payload) -> BatchCallbacks n payload (ResultOf n payload) -> n ()) -> m (WorkerConfig n payload)Source #
Arguments
| :: (MonadArbiter n, MonadIO m) | |
| => Int | Worker count |
| -> Int | Batch size: max jobs per batch. A batch is one group, or ungrouped jobs. |
| -> (NonEmpty (JobRead payload) -> BatchCallbacks n payload (ResultOf n payload) -> n ()) | Batch handler |
| -> m (WorkerConfig n payload) |
Create a WorkerConfig for batched job processing, no worker transaction.
The handler receives the batch and a BatchCallbacks record to finalize each
job. To store a result per job, ack with ackWith or ackAllWith.
withHooks :: forall (m :: Type -> Type) payload. (ObservabilityHooks m payload -> ObservabilityHooks m payload) -> WorkerConfig m payload -> WorkerConfig m payloadSource #
Transform a pool's observability hooks.
withMaintenance :: MonadUnliftIO m => (MaintenanceOp -> Int64 -> m ()) -> WorkerConfig m payload -> WorkerConfig m payloadSource #
Run report before the pool's own maintenance callback. Each runs even when the other fails.
data HandlerMode (m :: Type -> Type) payloadSource #
Job claim and handler mode. Set by transactionalWorkerConfig,
manualWorkerConfig and batchedWorkerConfig.
Constructors
| SingleJobMode (JobHandler m payload (ResultOf m payload)) | Automatic single-job mode: claim one job per group and run the handler in a worker transaction, storing its result and acking atomically. |
| BatchedJobsMode | Batched callback mode: claim batches of up to N jobs and hand each batch to
the handler with a |
Fields
| |
handlerBatchSize :: forall (m :: Type -> Type) payload. WorkerConfig m payload -> IntSource #
The maximum jobs in a batch. A batch is one group, or ungrouped jobs.
type ResultOf (m :: Type -> Type) payload = ResultFor payload (RegistryOf m)#
The result type declared by payload's registry entry. It is not injective.
A signature naming it needs another argument to determine payload.
newtype WorkerConfigExceptionSource #
Invalid worker configuration detected before a pool starts.
Constructors
| WorkerConfigException Text |
Instances
| Eq WorkerConfigException Source # | |
Defined in Arbiter.Worker.Config Methods (==) :: WorkerConfigException -> WorkerConfigException -> Bool# (/=) :: WorkerConfigException -> WorkerConfigException -> Bool# | |
| Exception WorkerConfigException Source # | |
Defined in Arbiter.Worker.Config | |
| Show WorkerConfigException Source # | |
Defined in Arbiter.Worker.Config Methods showsPrec :: Int -> WorkerConfigException -> ShowS# show :: WorkerConfigException -> String# showList :: [WorkerConfigException] -> ShowS# | |
validateWorkerConfig :: forall (m :: Type -> Type) payload. WorkerConfig m payload -> Either Text ()Source #
Validate all invariants required for safe worker execution. Return all violations.
defaultMaintenanceSparseInterval :: NominalDiffTimeSource #
Gap the bucket prune and the concurrency reconcile-and-prune keep.
defaultMaintenanceBucketIdle :: NominalDiffTimeSource #
Age after which an idle rate-limit bucket is pruned.
defaultMaintenanceTimeout :: NominalDiffTimeSource #
Statement timeout for one maintenance operation.
Batch callbacks
data BatchCallbacks (m :: Type -> Type) payload resultSource #
Per-job finalizers passed to a batched handler. When the handler returns, untouched
jobs are reprocessed after the lease expires, and their attempt is used. When it throws,
untouched jobs fail. A JobNackException releases them with
their attempt restored. A JobScopedFailure that names jobs
in the batch fails only those jobs. A JobGoneException that
names jobs in the batch reports only those jobs as unavailable, or as cancelled
after a force-cancel. Both release the rest. The With variants store a result for
the job's parent rollup or its archive entry.
Each callback commits in its own transaction. Inside
withDbTransaction, it runs as a savepoint in the
outer transaction. The success hook fires at savepoint release. An outer
rollback reprocesses the job after its lease expires.
ack, ackWith and spawn abort the handler if another worker holds the
job. The abort nacks the siblings still unfinalized.
Constructors
| BatchCallbacks | |
Fields
| |
hoistBatchCallbacks :: (forall a. m a -> n a) -> BatchCallbacks m payload result -> BatchCallbacks n payload resultSource #
Callbacks for m, called from n through the given natural transformation.
It must be a monad morphism that keeps the worker's connection and schema. Each
callback then joins the handler's transaction.
Worker state
data WorkerStateSource #
A worker pool's effective state, read off the shutdown and pause flags on its
WorkerConfig. Shutdown wins, then pause, then running.
Constructors
| Running | Claims and runs jobs. |
| Paused | Claims no new jobs. |
| ShuttingDown | Claims no new jobs and stops. |
Instances
| Eq WorkerState Source # | |
Defined in Arbiter.Worker.WorkerState | |
| Show WorkerState Source # | |
Defined in Arbiter.Worker.WorkerState Methods showsPrec :: Int -> WorkerState -> ShowS# show :: WorkerState -> String# showList :: [WorkerState] -> ShowS# | |
data WorkerRuntimeSource #
Mutable state owned by one worker pool. The config constructors allocate it.
shutdownWorkerPool :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m ()Source #
Initiate graceful shutdown of the worker pool.
Stops claiming new jobs. In-flight jobs get up to gracefulShutdownTimeout to
finish. Then the pool exits.
getWorkerState :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m WorkerStateSource #
The pool's state, with a pause reported as paused.
getListenerReady :: forall m (n :: Type -> Type) payload. MonadIO m => WorkerConfig n payload -> m BoolSource #
Whether this pool's LISTEN channels are subscribed (or there is no listener).
readEffectiveState :: forall (n :: Type -> Type) payload. WorkerConfig n payload -> STM WorkerStateSource #
getWorkerState inside STM.
Logging
Worker log level, destination, and context.
Constructors
| LogConfig | |
Fields
| |
data LogDestinationSource #
Where Arbiter writes log output.
Constructors
| LogStdout | Log to stdout. The default. |
| LogStderr | Log to stderr. |
| LogFastLogger LoggerSet | Log to a custom fast-logger |
| LogCallback (LogLevel -> Text -> [Pair] -> IO ()) | Log to a user-provided callback. The callback receives the let cb level msg ctx = myLogger level msg ctx
in defaultLogConfig { logDestination = LogCallback cb }
|
| LogTee LogDestination LogDestination | Emit every message to both destinations, the first one before the second. |
| LogDiscard | Discard all logs. |
defaultLogConfig :: LogConfigSource #
Default log configuration: Info level to stdout, no additional context.
silentLogConfig :: LogConfigSource #
Silent log configuration: discards all logs.
Log severity levels.
Constructors
| Debug | Detail for diagnosis. |
| Info | Normal events. |
| Warning | Problems that do not stop work. |
| Error | Failed operations. |
Instances
| Eq LogLevel Source # | |
| Ord LogLevel Source # | |
Defined in Arbiter.Worker.Logger | |
| Bounded LogLevel Source # | |
| Enum LogLevel Source # | |
| Read LogLevel Source # | |
| Show LogLevel Source # | |
Maintenance
runMaintenancePass :: (RegistryAdmissionPolicies (RegistryOf m), MonadArbiter m, RegistryTables (RegistryOf m)) => LogConfig -> (MaintenanceOp -> Int64 -> m ()) -> MaintenancePace -> NominalDiffTime -> m [MaintenanceOp]Source #
Arguments
| :: (RegistryAdmissionPolicies (RegistryOf m), MonadArbiter m, RegistryTables (RegistryOf m)) | |
| => LogConfig | |
| -> (MaintenanceOp -> Int64 -> m ()) | |
| -> MaintenancePace | |
| -> NominalDiffTime | Statement timeout |
| -> m [MaintenanceOp] |
One pass of the maintenance the reaper runs, with each operation independently
gated across all callers. An operation whose window has not elapsed is skipped.
The pass covers every queue in the schema (schemaQueues), not only the
caller's registry. Which caller wins a gate does not change the result.
Returns the operations that threw. A failure for one queue is logged and not
returned. A failure does not stop the pass. When the schema's queues cannot be
read, no operation runs and every operation is returned.
data MaintenancePaceSource #
Gaps between runs of each kind of work, and the bucket idle age. A zero gap runs that work every pass.
Constructors
| MaintenancePace | |
Fields
| |
Instances
| Eq MaintenancePace Source # | |
Defined in Arbiter.Worker.Reaper Methods (==) :: MaintenancePace -> MaintenancePace -> Bool# (/=) :: MaintenancePace -> MaintenancePace -> Bool# | |
| Show MaintenancePace Source # | |
Defined in Arbiter.Worker.Reaper Methods showsPrec :: Int -> MaintenancePace -> ShowS# show :: MaintenancePace -> String# showList :: [MaintenancePace] -> ShowS# | |
data MaintenanceOpSource #
Which reaper op a maintenance report came from.
Constructors
| RefreshGroups | Refresh the group summary rows. |
| SweepStaleWorkers | Delete worker rows whose heartbeat is stale. |
| SweepExhaustedJobs | Move exhausted jobs to the DLQ. |
| SweepCancelledJobs | Delete force-cancelled jobs whose lease has lapsed. |
| PruneRateLimitBuckets | Delete idle rate-limit buckets that are full. |
| ReconcileConcurrencyStale | Rebuild the concurrency counts after a crash truncated them. |
| ReconcilePruneConcurrency | Recount the concurrency keys, then delete the unused ones. |
| PurgeArchives | Delete expired archived jobs. |
| PurgeDLQ | Delete DLQ jobs older than their queue's DLQ retention. |
Instances
maintenanceOpName :: MaintenanceOp -> TextSource #
The op's stable name, used to coordinate replicas and to label its metrics.
Cron
A cron schedule. Built with cronJob, or cronJobInTimezone for a non-UTC one.
Constructors
| CronJob | |
Fields
| |
Instances
data OverlapPolicySource #
Cron tick overlap policy.
Constructors
| SkipOverlap | At most one pending or running job per schedule. |
| AllowOverlap | One job per tick. Concurrent execution of prior ticks is allowed. |
Instances
| Eq OverlapPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Methods (==) :: OverlapPolicy -> OverlapPolicy -> Bool# (/=) :: OverlapPolicy -> OverlapPolicy -> Bool# | |||||
| Generic OverlapPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Associated Types
| |||||
| Show OverlapPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Methods showsPrec :: Int -> OverlapPolicy -> ShowS# show :: OverlapPolicy -> String# showList :: [OverlapPolicy] -> ShowS# | |||||
| type Rep OverlapPolicy Source # | |||||
data BackfillPolicySource #
Bound on replay of missed ticks. Applies at startup and mid-flight.
Constructors
| NoBackfill | Drop missed minutes silently. Default. |
| Backfill NominalDiffTime | Replay minutes missed in the last given number of seconds. A |
Instances
| Eq BackfillPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Methods (==) :: BackfillPolicy -> BackfillPolicy -> Bool# (/=) :: BackfillPolicy -> BackfillPolicy -> Bool# | |||||
| Generic BackfillPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Associated Types
| |||||
| Show BackfillPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types Methods showsPrec :: Int -> BackfillPolicy -> ShowS# show :: BackfillPolicy -> String# showList :: [BackfillPolicy] -> ShowS# | |||||
| type Rep BackfillPolicy Source # | |||||
Defined in Arbiter.Worker.Cron.Types type Rep BackfillPolicy = D1 ('MetaData "BackfillPolicy" "Arbiter.Worker.Cron.Types" "arbiter-worker-0.1.0.0-inplace" 'False) (C1 ('MetaCons "NoBackfill" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Backfill" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 NominalDiffTime))) | |||||
Whether a tick is for the current minute or a replay of a past minute.
Constructors
| Live | The current scheduler minute. |
| Replay | A past minute, replayed at startup or in mid-flight catch-up. |
cronJob :: Text -> Text -> OverlapPolicy -> (TickKind -> UTCTime -> JobWrite payload) -> Either String (CronJob payload)Source #
Arguments
| :: Text | Schedule name (used in dedup keys and logging) |
| -> Text | Cron expression (5-field: minute hour day-of-month month day-of-week) |
| -> OverlapPolicy | Overlap policy |
| -> (TickKind -> UTCTime -> JobWrite payload) | Job builder. Receives the tick kind and the tick time. |
| -> Either String (CronJob payload) |
Build a CronJob evaluated in UTC. A bad expression returns Left.
cronJobInTimezone is the local-time form. Set backfill and initiallyEnabled by
record update.
cronJob "nightly-report" "0 3 * * *" SkipOverlap (\_kind _tick -> defaultJob (GenerateReport "nightly"))
cronJobInTimezone :: Text -> Text -> Text -> OverlapPolicy -> (TickKind -> UTCTime -> JobWrite payload) -> Either String (CronJob payload)Source #
Arguments
| :: Text | Schedule name |
| -> Text | IANA tz name (e.g. |
| -> Text | Cron expression (5-field) |
| -> OverlapPolicy | Overlap policy |
| -> (TickKind -> UTCTime -> JobWrite payload) | Job builder |
| -> Either String (CronJob payload) |
Like cronJob but evaluated in a specific timezone. The tz name is
validated eagerly against the bundled tzdata database.
overlapPolicyToText :: OverlapPolicy -> TextSource #
Convert an OverlapPolicy to its text representation.
overlapPolicyFromText :: Text -> Maybe OverlapPolicySource #
Parse an OverlapPolicy from text.
validateCronScheduleUpdate :: CronScheduleUpdate -> Either Text ()Source #
Check a cron patch before it is written. At tick time a bad override stops firing or falls back to the default.
updateCronScheduleChecked :: MonadArbiter m => Text -> CronScheduleUpdate -> m (Either Text Int64)Source #
updateCronScheduleUnchecked behind
validateCronScheduleUpdate. Returns rows affected, 0 for an unknown name or an
empty patch.