Packages
krug
2.0.31
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_sync.ex
defmodule Krug.DistributedMnesiaSync do
@moduledoc false
require Logger
alias Krug.MapUtil
alias Krug.DistributedMnesiaCreator
alias Krug.DistributedMnesiaCloner
def sync_tables(cluster_node,tables,storage_mode,connection_timeout) do
sync_tables(
tables,
storage_mode,
cluster_node,
connection_timeout,
get_table_cookies(node(),connection_timeout),
cluster_node
|> get_table_cookies(connection_timeout)
)
end
defp sync_tables(tables,storage_mode,_cluster_node,connection_timeout,{:ok, local_cookies},{:ok, remote_cookies}) do
Enum.each(
tables,
fn(table)
-> table
|> sync_table(storage_mode,connection_timeout,local_cookies,remote_cookies)
end
)
end
defp sync_tables(_tables,_storage_mode,cluster_node,_connection_timeout,{:error, reason},{:ok, _remote_cookies}) do
Logger.info(
"""
[Krug.DistributedMnesiaSync] =>
Error getting mnesia tables cookies for local node #{inspect(cluster_node)}, reason: #{inspect(reason)}
"""
)
end
defp sync_tables(_tables,_storage_mode,cluster_node,_connection_timeout,{:ok, _local_cookies},{:error, reason}) do
Logger.info(
"""
[Krug.DistributedMnesiaSync] =>
Error getting mnesia tables cookies for remote node #{inspect(cluster_node)}, reason: #{inspect(reason)}
"""
)
end
defp sync_tables(_tables,_storage_mode,cluster_node,_connection_timeout,{:error, local_reason},{:error, remote_reason}) do
Logger.info(
"""
[Krug.DistributedMnesiaSync] => Multiple errors:
Error getting mnesia tables cookies for local node #{inspect(node())}, reason: #{inspect(local_reason)}
Error getting mnesia tables cookies for remote node #{inspect(cluster_node)}, reason: #{inspect(remote_reason)}
"""
)
end
defp sync_table(table,storage_mode,connection_timeout,local_cookies,remote_cookies) do
tablename = table
|> MapUtil.get(:table_name)
table
|> sync_table(
storage_mode,
{local_cookies[tablename],remote_cookies[tablename]}
)
[tablename]
|> :mnesia.wait_for_tables(connection_timeout)
end
defp sync_table(table,storage_mode,{nil,nil}) do
table
|> DistributedMnesiaCreator.create_table(storage_mode)
end
defp sync_table(table,storage_mode,{nil,_}) do
table
|> DistributedMnesiaCloner.add_table_copy(storage_mode)
end
defp sync_table(table,_storage_mode,{_,nil}) do
Logger.info(
"""
[Krug.DistributedMnesiaSync] =>
[#{inspect(node())}] #{inspect(table)}: no remote data to copy found.
"""
)
end
defp sync_table(_table,_storage_mode,{_local,_remote}) do
#Logger.info(
# """
# [Krug.DistributedMnesiaSync] =>
# [#{inspect(node())}] #{inspect(table)}: table found on both sides, copy aborted.
# """
#)
end
defp get_table_cookies(node,connection_timeout) do
case :rpc.call(node, :mnesia, :system_info, [:local_tables],connection_timeout) do
{:badrpc, reason}
-> {:error, reason}
tables
-> node
|> get_table_cookies(tables,connection_timeout)
end
end
defp get_table_cookies(node,tables,connection_timeout) do
Enum.reduce_while(
tables,
{:ok, %{}},
fn(table,{:ok, acc})
-> node_table_cookie(node,table,connection_timeout,{:ok, acc})
end
)
end
defp node_table_cookie(node,table,connection_timeout,{:ok, acc}) do
case :rpc.call(node,:mnesia,:table_info,[table, :cookie],connection_timeout) do
{:badrpc, reason}
-> {:halt, {:error, reason}}
cookie
-> {:cont, {:ok, Map.put(acc, table, cookie)}}
end
end
end