Packages
krug
2.0.9
2.0.36
2.0.35
2.0.34
2.0.33
2.0.32
2.0.31
2.0.30
2.0.29
2.0.27
2.0.26
2.0.25
2.0.24
2.0.23
2.0.22
2.0.20
2.0.19
2.0.18
2.0.17
2.0.16
2.0.15
2.0.14
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.1
2.0.0
1.1.53
1.1.52
1.1.50
1.1.49
1.1.48
1.1.47
1.1.46
1.1.45
1.1.44
1.1.43
1.1.42
1.1.41
1.1.40
1.1.39
1.1.38
1.1.37
1.1.36
1.1.35
1.1.34
1.1.33
1.1.32
1.1.31
1.1.30
1.1.29
1.1.28
1.1.27
1.1.26
1.1.25
1.1.24
1.1.23
1.1.22
1.1.21
1.1.20
1.1.19
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.12
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
A Utilitary package functionalities modules for improve a secure performatic development.
Current section
Files
Jump to
Current section
Files
lib/krug/mnesia/distributed_mnesia_master_control_task.ex
defmodule Krug.DistributedMnesiaMasterControlTask do
@moduledoc false
@verify_interval 300
@connection_timeout 100
use Task
alias Krug.DistributedMnesiaMasterControl
alias Krug.ClusterUtil
alias Krug.NetworkUtil
def start_link(_opts) do
Task.start_link(__MODULE__, :correct_master_node, [])
end
def correct_master_node() do
# ["correct_master_node .... "] |> IO.inspect()
cond do
(node_is_running(node()))
-> verify_and_correct_master_node()
true
-> :ok # mnesia stopped
end
end
defp verify_and_correct_master_node() do
master_nodes = read_master_nodes()
# ["master_nodes => ", master_nodes] |> IO.inspect()
cond do
(nil == master_nodes
or Enum.empty?(master_nodes))
-> find_and_set_new_mnesia_master_node()
(!(master_nodes |> hd() |> node_is_running()))
-> find_and_set_new_mnesia_master_node()
true
-> master_nodes
|> hd()
|> find_and_set_new_mnesia_master_node()
end
@verify_interval
|> :timer.sleep()
correct_master_node()
end
defp node_is_running(mnesia_node) do
nil != mnesia_node |> read_master_nodes()
end
defp read_master_nodes(mnesia_node \\ node()) do
params = [
DistributedMnesiaMasterControl.read_metadata_table(),
:master_nodes
]
case :rpc.call(mnesia_node,:mnesia,:table_info,params,@connection_timeout) do
{:badrpc, _reason}
-> nil
master_nodes
-> master_nodes
end
end
defp find_and_set_new_mnesia_master_node(actual_master_node \\ nil) do
# ["find_and_set_new_mnesia_master_node"] |> IO.inspect()
connected_nodes = reconnect_connected_nodes()
:extra_db_nodes
|> :mnesia.change_config(connected_nodes)
connected_nodes
|> NetworkUtil.get_minor_node()
|> set_master_node(actual_master_node)
end
defp set_master_node(node_to_be_new_master,actual_master_node) do
# ["set_master_node",node_to_be_new_master] |> IO.inspect()
cond do
(node_to_be_new_master == actual_master_node)
-> :ok
(nil != node_to_be_new_master)
-> [node_to_be_new_master]
|> :mnesia.set_master_nodes()
true
-> :ok
end
end
defp reconnect_connected_nodes() do
[
_cluster_cookie,
cluster_name,
cluster_ips
] = DistributedMnesiaMasterControl.read_cluster_data()
ClusterUtil.connect_nodes([],cluster_name,cluster_ips,@connection_timeout)
end
end