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/shape_cache/shape_status/shape_db/supervisor.ex
defmodule Electric.ShapeCache.ShapeStatus.ShapeDb.Supervisor do
use Supervisor
alias Electric.ShapeCache.ShapeStatus.ShapeDb
require Logger
def name(stack_ref) do
Electric.ProcessRegistry.name(stack_ref, __MODULE__)
end
def start_link(opts) do
Supervisor.start_link(__MODULE__, opts, name: name(opts))
end
@default_connection_idle_timeout 30_000
def init(opts) do
shape_db_opts = Keyword.fetch!(opts, :shape_db_opts)
stack_id = Keyword.fetch!(opts, :stack_id)
opts = Keyword.put(shape_db_opts, :stack_id, stack_id)
exclusive_mode = Keyword.get(opts, :exclusive_mode, false)
idle_timeout = Keyword.get(opts, :connection_idle_timeout, @default_connection_idle_timeout)
# don't close the write connection in exclusive mode
# NimblePool treats `worker_idle_timeout: nil` as no idle timeout
write_pool_idle_timeout = if(exclusive_mode, do: nil, else: idle_timeout)
connection_count = :atomics.new(1, signed: false)
opts = Keyword.put(opts, :connection_count, connection_count)
read_pool_spec =
if exclusive_mode do
Logger.notice("Starting ShapeDb in exclusive mode")
[]
else
[
Supervisor.child_spec(
{
NimblePool,
worker: {ShapeDb.Connection, Keyword.put(opts, :mode, :read)},
pool_size: Keyword.get(opts, :read_pool_size, 2 * System.schedulers_online()),
name: ShapeDb.PoolRegistry.pool_name(stack_id, :read, exclusive_mode),
worker_idle_timeout: idle_timeout,
lazy: true
},
id: {:pool, :read}
)
]
end
children =
Enum.concat([
[
{ShapeDb.PoolRegistry, stack_id: stack_id},
{ShapeDb.Statistics, opts},
{ShapeDb.Migrator, opts}
],
read_pool_spec,
[
# a separate single-worker pool for writes as they have to be serialised
# to avoid busy errors
Supervisor.child_spec(
{NimblePool,
worker: {ShapeDb.Connection, Keyword.put(opts, :mode, :write)},
pool_size: 1,
name: ShapeDb.PoolRegistry.pool_name(stack_id, :write, exclusive_mode),
worker_idle_timeout: write_pool_idle_timeout,
lazy: not exclusive_mode},
id: {:pool, :write}
),
# Write buffer for batching SQLite writes to avoid timeout cascades.
{ShapeDb.WriteBuffer, opts}
]
])
# Because the full state of the system is split between the actual db, the
# writeBuffer and the ShapeStatus ets caches, we are not safe to adopt a
# one_for_one strategy and need to propagate an exit in the children of
# this supervisor to the parent
Supervisor.init(children, strategy: :one_for_all, max_restarts: 0)
end
end