Packages
step_flow
1.4.2-rc1
1.9.0-rc2
1.9.0-rc1
1.9.0-rc0
1.8.2
1.8.1
1.8.1-rc8
1.8.1-rc7
1.8.1-rc6
1.8.1-rc5
1.8.1-rc4
1.8.1-rc3
1.8.1-rc2
1.8.1-rc1
1.8.1-rc0
1.8.0
1.8.0-rc3
1.8.0-rc2
1.8.0-rc1
1.8.0-rc0
1.7.3
1.7.3-rc4
1.7.3-rc3
1.7.3-rc2
1.7.3-rc1
1.7.3-rc0
1.7.2
1.7.2-rc4
1.7.2-rc3
1.7.2-rc2
1.7.2-rc1
1.7.2-rc0
1.7.1
1.7.0
1.7.0-rc1
1.7.0-rc0
1.6.1
1.6.1-rc1
1.6.1-rc0
1.6.0
1.6.0-rc9
1.6.0-rc8
1.6.0-rc7
1.6.0-rc6
1.6.0-rc5
1.6.0-rc4
1.6.0-rc3
1.6.0-rc20
1.6.0-rc2
1.6.0-rc19
1.6.0-rc18
1.6.0-rc17
1.6.0-rc16
1.6.0-rc15
1.6.0-rc14
1.6.0-rc13
1.6.0-rc12
1.6.0-rc11
1.6.0-rc10
1.6.0-rc1
1.5.0
1.5.0-rc1
1.4.2-rc2
1.4.2-rc1
1.4.1
1.4.1-rc1
1.4.0
1.4.0-rc4
1.4.0-rc3
1.4.0-rc2
1.4.0-rc1
1.3.1
1.3.0
1.3.0-rc
1.2.0
1.1.0
1.0.0
1.0.0-rc9
1.0.0-rc8
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.4
0.0.3
0.0.2
0.0.1
Step flow manager for Elixir applications
Current section
Files
Jump to
Current section
Files
lib/step_flow/repo/checker.ex
defmodule StepFlow.Repo.Checker do
@moduledoc false
use GenServer
require Logger
@registry_table :repo_status
@entry_name :is_up
def child_spec(_) do
%{
id: StepFlow.Repo.Checker,
start: {StepFlow.Repo.Checker, :start_link, []},
type: :worker
}
end
def start_link do
GenServer.start_link(__MODULE__, false, name: __MODULE__)
end
def get_repo_status do
GenServer.call(__MODULE__, :pop)
end
def repo_running? do
case :ets.whereis(@registry_table) do
:undefined ->
:timer.sleep(1000)
repo_running?()
_tid ->
:ets.lookup(@registry_table, @entry_name)
|> Keyword.get(@entry_name)
end
end
@impl true
def init(is_repo_up) do
Logger.warn("[#{__MODULE__}] Start checking repo status...")
_status = :ets.new(@registry_table, [:named_table, :set, :protected, read_concurrency: true])
is_repo_up = check_repo_status(is_repo_up)
{:ok, is_repo_up}
end
@impl true
def handle_info(:check, is_repo_up) do
Logger.debug("[#{__MODULE__}] Check the repo status.")
# Schedule once more
is_repo_up = check_repo_status(is_repo_up)
{:noreply, is_repo_up}
end
@impl true
def handle_info(:kill_me, state) do
{:stop, :normal, state}
end
@impl true
def handle_call(:pop, _from, status) do
Logger.debug("[#{__MODULE__}] Get repo status...")
is_repo_up = repo_running?()
{:reply, is_repo_up, status}
end
defp check_repo_status(was_previously_up) do
hostname =
StepFlow.Configuration.get_var_value(StepFlow.Repo, :hostname)
|> String.to_charlist()
port = to_integer(StepFlow.Configuration.get_var_value(StepFlow.Repo, :port))
is_repo_up =
case :gen_tcp.connect(hostname, port, [:binary, active: false], 1000) do
{:ok, socket} ->
:gen_tcp.close(socket)
true
{:error, :econnrefused} ->
false
{:error, error} ->
Logger.warn("Unexpected error on database connection check: #{inspect(error)}")
false
end
:ets.insert(@registry_table, {@entry_name, is_repo_up})
if is_repo_up do
if !was_previously_up do
if Process.whereis(StepFlow.Amqp.Supervisor) != nil do
StepFlow.Amqp.Supervisor.start_children()
end
if Process.whereis(StepFlow.ProcessManager) != nil do
StepFlow.ProcessManager.start_children()
end
end
else
if was_previously_up do
StepFlow.Amqp.Supervisor.stop_children()
StepFlow.ProcessManager.stop_children()
end
end
Process.send_after(self(), :check, 500)
is_repo_up
end
defp to_integer(int) when is_integer(int) do
int
end
defp to_integer(str) do
String.to_integer(str)
end
end