aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristophe Romain <christophe.romain@process-one.net>2017-12-21 14:07:29 +0100
committerChristophe Romain <christophe.romain@process-one.net>2017-12-21 14:07:29 +0100
commita3083b5d7168060bdc48e65d7e65fed29331d647 (patch)
tree46f3e1ebe5374a2cdf4cd995388405acb82c5693 /src
parentDisable test for now (diff)
Fix race between join_cluster and ejabberd_mnesia (#2079)
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_cluster_mnesia.erl36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/ejabberd_cluster_mnesia.erl b/src/ejabberd_cluster_mnesia.erl
index 67fc60fde..3945c2d1b 100644
--- a/src/ejabberd_cluster_mnesia.erl
+++ b/src/ejabberd_cluster_mnesia.erl
@@ -60,16 +60,15 @@ join(Node) ->
application:stop(mnesia),
mnesia:delete_schema([node()]),
application:start(mnesia),
- mnesia:change_config(extra_db_nodes, [Node]),
- mnesia:change_table_copy_type(schema, node(), disc_copies),
- spawn(fun() ->
- lists:foreach(fun(Table) ->
- Type = ejabberd_cluster:call(
- Node, mnesia, table_info, [Table, storage_type]),
- mnesia:add_table_copy(Table, node(), Type)
- end, mnesia:system_info(tables)--[schema])
- end),
- application:start(ejabberd);
+ case mnesia:change_config(extra_db_nodes, [Node]) of
+ {ok, _} ->
+ replicate_database(Node),
+ wait_for_sync(infinity),
+ application:stop(mnesia),
+ application:start(ejabberd);
+ {error, Reason} ->
+ {error, Reason}
+ end;
_ ->
{error, {no_ping, Node}}
end.
@@ -94,11 +93,11 @@ leave([], Node) ->
leave([Master|_], Node) ->
application:stop(ejabberd),
application:stop(mnesia),
- ejabberd_cluster:call(Master, mnesia, del_table_copy, [schema, Node]),
spawn(fun() ->
- mnesia:delete_schema([node()]),
- erlang:halt(0)
- end),
+ rpc:call(Master, mnesia, del_table_copy, [schema, Node]),
+ mnesia:delete_schema([node()]),
+ erlang:halt(0)
+ end),
ok.
-spec node_id() -> binary().
@@ -130,6 +129,15 @@ subscribe(_) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+
+replicate_database(Node) ->
+ mnesia:change_table_copy_type(schema, node(), disc_copies),
+ lists:foreach(
+ fun(Table) ->
+ Type = ejabberd_cluster:call(Node, mnesia, table_info, [Table, storage_type]),
+ mnesia:add_table_copy(Table, node(), Type)
+ end, mnesia:system_info(tables)--[schema]).
+
-spec match_node_id(integer()) -> node().
match_node_id(I) ->
match_node_id(I, get_nodes()).