Browse Source

Ensure to suspend processes able to modify the mnesia entries during a conflict resolution.

Roberto Ostinelli 9 years ago
parent
commit
eeeda5ba80
1 changed files with 13 additions and 4 deletions
  1. 13 4
      src/syn_consistency.erl

+ 13 - 4
src/syn_consistency.erl

@@ -188,12 +188,20 @@ delete_groups_pids_of_disconnected_node(RemoteNode) ->
 
 
 -spec automerge(RemoteNode :: atom()) -> ok.
 -spec automerge(RemoteNode :: atom()) -> ok.
 automerge(RemoteNode) ->
 automerge(RemoteNode) ->
+    %% suspend processes able to modify mnesia tables
+    sys:suspend(syn_registry),
+    sys:suspend(syn_groups),
+    %% resolve conflicts
     global:trans({{?MODULE, automerge}, self()},
     global:trans({{?MODULE, automerge}, self()},
         fun() ->
         fun() ->
             error_logger:warning_msg("AUTOMERGE starting on node ~p for remote node ~p (global lock is set)", [node(), RemoteNode]),
             error_logger:warning_msg("AUTOMERGE starting on node ~p for remote node ~p (global lock is set)", [node(), RemoteNode]),
             check_stitch(RemoteNode),
             check_stitch(RemoteNode),
             error_logger:warning_msg("AUTOMERGE done (global lock about to be unset)")
             error_logger:warning_msg("AUTOMERGE done (global lock about to be unset)")
-        end).
+        end
+    ),
+    %% resume processes able to modify mnesia tables
+    sys:resume(syn_registry),
+    sys:resume(syn_groups).
 
 
 -spec check_stitch(RemoteNode :: atom()) -> ok.
 -spec check_stitch(RemoteNode :: atom()) -> ok.
 check_stitch(RemoteNode) ->
 check_stitch(RemoteNode) ->
@@ -352,7 +360,7 @@ handle_purged_registry_double_processes(undefined, _, DoubleRegistryProcessesInf
     F = fun({Key, LocalProcessPid, _LocalProcessMeta}) ->
     F = fun({Key, LocalProcessPid, _LocalProcessMeta}) ->
         error_logger:warning_msg("Found a double process for ~s, killing it on local node ~p", [Key, node()]),
         error_logger:warning_msg("Found a double process for ~s, killing it on local node ~p", [Key, node()]),
         exit(LocalProcessPid, kill)
         exit(LocalProcessPid, kill)
-        end,
+    end,
     lists:foreach(F, DoubleRegistryProcessesInfo);
     lists:foreach(F, DoubleRegistryProcessesInfo);
 handle_purged_registry_double_processes(RegistryConflictingProcessCallbackModule, RegistryConflictingProcessCallbackFunction, DoubleRegistryProcessesInfo) ->
 handle_purged_registry_double_processes(RegistryConflictingProcessCallbackModule, RegistryConflictingProcessCallbackFunction, DoubleRegistryProcessesInfo) ->
     F = fun({Key, LocalProcessPid, LocalProcessMeta}) ->
     F = fun({Key, LocalProcessPid, LocalProcessMeta}) ->
@@ -360,6 +368,7 @@ handle_purged_registry_double_processes(RegistryConflictingProcessCallbackModule
             fun() ->
             fun() ->
                 error_logger:warning_msg("Found a double process for ~s, about to trigger callback on local node ~p", [Key, node()]),
                 error_logger:warning_msg("Found a double process for ~s, about to trigger callback on local node ~p", [Key, node()]),
                 RegistryConflictingProcessCallbackModule:RegistryConflictingProcessCallbackFunction(Key, LocalProcessPid, LocalProcessMeta)
                 RegistryConflictingProcessCallbackModule:RegistryConflictingProcessCallbackFunction(Key, LocalProcessPid, LocalProcessMeta)
-            end)
-        end,
+            end
+        )
+    end,
     lists:foreach(F, DoubleRegistryProcessesInfo).
     lists:foreach(F, DoubleRegistryProcessesInfo).