Packages
electric
1.7.1
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/replication/publication_manager/supervisor.ex
defmodule Electric.Replication.PublicationManager.Supervisor do
@moduledoc """
Supervisor for the PublicationManager components.
The strategy is `:one_for_one`, supervising the `RelationTracker` and
`Configurator` processes.
The `Configurator` process always starts after the `RelationTracker` process, and
as part of its initialization it fetches the current set of shape filters. This makes
the system resilient to `Configurator` restarts as it will always be eager to
commit any outstanding filters to the publication.
The `RelationTracker` process does not depend on the `Configurator` process being
alive to function correctly, as it only tracks the shapes and their filters, and
notifies the `Configurator` of any changes. The system is resilient to `RelationTracker`
restarts as it repopulates its filters from the in-memory shape status cache, and
can handle notifications for filters it is not tracking.
"""
use Supervisor
alias Electric.Replication.PublicationManager
# The default debounce timeout is 0, which means that the publication update
# will be scheduled immediately to run at the end of the current process
# mailbox, but we are leaving this configurable in case we want larger
# windows to aggregate shape filter updates
@default_debounce_timeout 0
@name_schema_tuple {:tuple, [:atom, :atom, :any]}
@genserver_name_schema {:or, [:atom, @name_schema_tuple]}
@schema NimbleOptions.new!(
name: [type: @genserver_name_schema, required: false],
stack_id: [type: :string, required: true],
publication_name: [type: :string, required: true],
db_pool: [type: {:or, [:atom, :pid, @name_schema_tuple]}],
manual_table_publishing?: [type: :boolean, required: false, default: false],
update_debounce_timeout: [type: :timeout, default: @default_debounce_timeout],
server: [type: :any, required: false],
refresh_period: [type: :pos_integer, required: false, default: 60_000]
)
def name(stack_id) do
Electric.ProcessRegistry.name(stack_id, __MODULE__)
end
def start_link(opts) do
with {:ok, opts} <- NimbleOptions.validate(opts, @schema) do
stack_id = Keyword.fetch!(opts, :stack_id)
Supervisor.start_link(__MODULE__, opts, name: Keyword.get(opts, :name, name(stack_id)))
end
end
@impl Supervisor
def init(opts) do
stack_id = Keyword.fetch!(opts, :stack_id)
Process.set_label({:publication_manager_supervisor, stack_id})
Logger.metadata(stack_id: stack_id)
Electric.Telemetry.Sentry.set_tags_context(stack_id: stack_id)
children = [
{PublicationManager.RelationTracker, opts},
{PublicationManager.Configurator, opts}
]
Supervisor.init(children, strategy: :one_for_one)
end
end