Current section

Files

Jump to
electric lib electric shape_cache shape_status shape_db migrator.ex
Raw

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)
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} <- ShapeDb.Connection.open(args),
{:ok, _version} <- ShapeDb.Connection.migrate(conn),
:ok = ShapeDb.Connection.optimize(conn) do
{:ok, schedule_optimize(conn), :hibernate}
end
end
@impl GenServer
def handle_info(:optimize, conn) do
Logger.info("Optimizing shape db tables")
:ok = ShapeDb.Connection.optimize(conn)
{:noreply, schedule_optimize(conn), :hibernate}
end
defp schedule_optimize(conn) do
Process.send_after(self(), :optimize, @optimization_period)
conn
end
end