Packages
oban
0.8.1
2.23.0
2.22.1
2.22.0
2.21.1
2.21.0
2.20.3
2.20.2
2.20.1
2.20.0
2.19.4
2.19.3
2.19.2
2.19.1
2.19.0
2.18.3
2.18.2
2.18.1
2.18.0
2.17.12
2.17.11
2.17.10
2.17.9
2.17.8
2.17.7
2.17.6
2.17.5
2.17.4
2.17.3
2.17.2
2.17.1
2.17.0
2.16.3
2.16.2
2.16.1
2.16.0
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.2
2.14.1
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.12.1
2.12.0
2.11.3
2.11.2
2.11.1
2.11.0
2.10.1
2.10.0
retired
2.9.2
2.9.1
2.9.0
2.8.0
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.0
2.0.0
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.2.0
1.1.0
1.0.0
1.0.0-rc.2
1.0.0-rc.1
0.12.1
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Robust job processing, backed by modern PostgreSQL, SQLite3, and MySQL.
Current section
Files
Jump to
Current section
Files
lib/oban/pruner.ex
defmodule Oban.Pruner do
@moduledoc false
use GenServer
alias Oban.{Config, Query}
@type option :: {:name, module()} | {:conf, Config.t()}
defmodule State do
@moduledoc false
defstruct [:conf]
end
@spec start_link([option]) :: GenServer.on_start()
def start_link(opts) do
{name, opts} = Keyword.pop(opts, :name)
GenServer.start_link(__MODULE__, opts[:conf], name: name)
end
@impl GenServer
def init(%Config{} = conf) do
send_after(conf.prune_interval)
{:ok, %State{conf: conf}}
end
@impl GenServer
def handle_info(:prune, %State{conf: conf} = state) do
conf
|> prune_beats()
|> prune_jobs()
send_after(conf.prune_interval)
{:noreply, state}
end
# Pruning beats needs to respect prune being `:disabled`, but it ignores the length and age
# configuration. Each queue generates one beat a second, 3,600 beat records per hour even when
# the queue is idle.
@beats_maxage_seconds 60 * 60
defp prune_beats(%Config{prune: prune} = conf) do
case prune do
:disabled ->
:ok
{_method, _setting} ->
Query.delete_outdated_beats(conf, @beats_maxage_seconds)
end
conf
end
defp prune_jobs(%Config{prune: prune, prune_limit: prune_limit} = conf) do
case prune do
:disabled ->
:ok
{:maxlen, length} ->
Query.delete_truncated_jobs(conf, length, prune_limit)
{:maxage, seconds} ->
Query.delete_outdated_jobs(conf, seconds, prune_limit)
end
conf
end
defp send_after(interval) do
Process.send_after(self(), :prune, interval)
end
end