Packages
electric
1.4.8
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/migrator.ex
defmodule Electric.ShapeCache.ShapeStatus.ShapeDb.Migrator do
use GenServer
alias Electric.ShapeCache.ShapeStatus.ShapeDb
require Logger
@optimization_period :timer.minutes(60)
def start_link(args) do
GenServer.start_link(__MODULE__, args)
end
@impl GenServer
def init(args) do
{:ok, stack_id} = Keyword.fetch(args, :stack_id)
exclusive_mode = Keyword.get(args, :exclusive_mode, false)
Process.set_label({:shape_db_migrator, stack_id})
Logger.metadata(stack_id: stack_id)
Electric.Telemetry.Sentry.set_tags_context(stack_id: stack_id)
with {:ok, conn} <- apply_migration(stack_id, args, exclusive_mode) do
{:ok, schedule_optimize(stack_id, conn), :hibernate}
end
end
defp apply_migration(_stack_id, _opts, true = _exclusive?) do
# In exclusive mode we *must* apply the migrations within the pool
# connection initialization because we might be using a memory db.
# We return nil to trigger checkout-mode.
{:ok, nil}
end
defp apply_migration(_stack_id, opts, false = _exclusive?) do
with {:ok, conn} <- ShapeDb.Connection.open(opts, integrity_check: true),
{:ok, _version} <- ShapeDb.Connection.migrate(conn, opts),
:ok = ShapeDb.Connection.optimize(conn) do
{:ok, conn}
end
end
@impl GenServer
def handle_info(:optimize, {stack_id, nil}) do
ShapeDb.Connection.checkout_write!(stack_id, :optimize, fn %{conn: conn} ->
:ok = ShapeDb.Connection.optimize(conn)
end)
{:noreply, schedule_optimize(stack_id, nil), :hibernate}
end
def handle_info(:optimize, {stack_id, conn}) do
Logger.info("Optimizing shape db tables")
:ok = ShapeDb.Connection.optimize(conn)
{:noreply, schedule_optimize(stack_id, conn), :hibernate}
end
defp schedule_optimize(stack_id, conn) do
Process.send_after(self(), :optimize, @optimization_period)
{stack_id, conn}
end
end