roger v2.4.0 Roger.Partition.Global View Source

Coordinates the global Roger partition state

Each Roger partition has a single place where global state is kept. Global state (and global coordination) is needed for the following things:

  • Job cancellation; when cancelling a job, we store the job ID globally; when the cancelled job is started, we check the job id against this list of cancelled ids.

  • Queue keys; some jobs dictate that they cannot be queued when there is already a job queued with an identical queue key; if so, the job fails to enqueue.

  • Execution keys; jobs which have the same execution key cannot be executed concurrently and need to wait on one another.

  • Pause states; it is globally stored which queues are currently paused.

The per-partition Global process stores all this information. It provides hooks to persist the information between partition / node restarts. By default, the global state is loaded from and written to the filesystem, but it is possible to override the persister, like this:

config :roger,
  persister: Your.PersisterModule

The persister module must implement the Roger.Partition.Global.StatePersister behaviour, which provides simple load and save functions.

Link to this section Summary

Functions

Mark a job id as cancelled

Check whether a given job id has been marked cancelled

Returns a specification to start this module under a supervisor

Check whether a given execution key has been set

Invoked when the server is started. start_link/3 or start/3 will block until it returns

Get the set of paused queues for the given partition_id

Cluster-wide pausing of the given queue in the given partition_id

Cluster-wide pausing of the given queue in the given partition_id

Check whether a given queue key has been marked enqueued

Remove the given execution key

Remove a given queue key

Link to this section Functions

Link to this function cancel_job(partition_id, job_id) View Source
cancel_job(partition_id :: String.t(), job_id :: String.t()) :: :ok

Mark a job id as cancelled.

This does not check for the validity of the job id. The job will not be removed from the queue, but instead will be removed as soon as it’s dequeued.

When a job is currently executing, the process of a running job will be killed.

Link to this function cancelled?(partition_id, job_id, remove \\ nil) View Source
cancelled?(partition_id :: String.t(), job_id :: String.t(), remove :: :remove) ::
  boolean()

Check whether a given job id has been marked cancelled

Returns a specification to start this module under a supervisor.

See Supervisor.

Link to this function executing?(partition_id, execution_key, add \\ nil) View Source
executing?(partition_id :: String.t(), execution_key :: String.t(), add :: :add) ::
  boolean()

Check whether a given execution key has been set

Invoked when the server is started. start_link/3 or start/3 will block until it returns.

args is the argument term (second argument) passed to start_link/3.

Returning {:ok, state} will cause start_link/3 to return {:ok, pid} and the process to enter its loop.

Returning {:ok, state, timeout} is similar to {:ok, state} except handle_info(:timeout, state) will be called after timeout milliseconds if no messages are received within the timeout.

Returning {:ok, state, :hibernate} is similar to {:ok, state} except the process is hibernated before entering the loop. See c:handle_call/3 for more information on hibernation.

Returning {:ok, state, {:continue, continue}} is similar to {:ok, state} except that immediately after entering the loop the c:handle_continue/2 callback will be invoked with the value continue as first argument.

Returning :ignore will cause start_link/3 to return :ignore and the process will exit normally without entering the loop or calling c:terminate/2. If used when part of a supervision tree the parent supervisor will not fail to start nor immediately try to restart the GenServer. The remainder of the supervision tree will be started and so the GenServer should not be required by other processes. It can be started later with Supervisor.restart_child/2 as the child specification is saved in the parent supervisor. The main use cases for this are:

  • The GenServer is disabled by configuration but might be enabled later.
  • An error occurred and it will be handled by a different mechanism than the Supervisor. Likely this approach involves calling Supervisor.restart_child/2 after a delay to attempt a restart.

Returning {:stop, reason} will cause start_link/3 to return {:error, reason} and the process to exit with reason reason without entering the loop or calling c:terminate/2.

Callback implementation for GenServer.init/1.

Link to this function queue_get_paused(partition_id) View Source
queue_get_paused(partition_id :: String.t()) :: {:ok, MapSet.t()}

Get the set of paused queues for the given partition_id.

Link to this function queue_pause(partition_id, queue) View Source
queue_pause(partition_id :: String.t(), queue :: any()) :: :ok

Cluster-wide pausing of the given queue in the given partition_id.

Link to this function queue_resume(partition_id, queue) View Source
queue_resume(partition_id :: String.t(), queue :: any()) :: :ok

Cluster-wide pausing of the given queue in the given partition_id.

Link to this function queued?(partition_id, queue_key, add \\ nil) View Source
queued?(partition_id :: String.t(), queue_key :: String.t(), add :: :add) ::
  boolean()

Check whether a given queue key has been marked enqueued

Link to this function remove_executed(partition_id, execution_key) View Source
remove_executed(partition_id :: String.t(), execution_key :: String.t()) :: :ok

Remove the given execution key

Link to this function remove_queued(partition_id, queue_key) View Source
remove_queued(partition_id :: String.t(), queue_key :: String.t()) :: :ok

Remove a given queue key