Browse Source

Refactor overwriting monitor ref in conflicts.

Roberto Ostinelli 5 years ago
parent
commit
218256589d
2 changed files with 12 additions and 33 deletions
  1. 10 15
      src/syn_registry.erl
  2. 2 18
      test/syn_registry_SUITE.erl

+ 10 - 15
src/syn_registry.erl

@@ -248,16 +248,16 @@ handle_cast({sync_register, Name, RemotePid, RemoteMeta}, State) ->
     %% get remote node
     RemoteNode = node(RemotePid),
     %% check for conflicts
-    case find_registry_tuple_by_name(Name) of
+    case find_registry_entry_by_name(Name) of
         undefined ->
             %% no conflict
             add_to_local_table(Name, RemotePid, RemoteMeta, undefined);
 
-        {Name, RemotePid, _Meta} ->
+        {Name, RemotePid, _Meta, MonitorRef, _Node} ->
             %% same process, no conflict, overwrite
-            add_to_local_table(Name, RemotePid, RemoteMeta, undefined);
+            add_to_local_table(Name, RemotePid, RemoteMeta, MonitorRef);
 
-        {Name, TablePid, TableMeta} ->
+        {Name, TablePid, TableMeta, MonitorRef, _Node} ->
             %% different pid, we have a conflict
             global:trans({{?MODULE, {inconsistent_name, Name}}, self()},
                 fun() ->
@@ -268,7 +268,7 @@ handle_cast({sync_register, Name, RemotePid, RemoteMeta}, State) ->
 
                     CallbackIfLocal = fun() ->
                         %% keeping local: overwrite local data to remote node
-                        ok = rpc:call(RemoteNode, syn_registry, add_to_local_table, [Name, TablePid, TableMeta, undefined])
+                        ok = rpc:call(RemoteNode, syn_registry, add_to_local_table, [Name, TablePid, TableMeta, MonitorRef])
                     end,
                     resolve_conflict(Name, {TablePid, TableMeta}, {RemotePid, RemoteMeta}, CallbackIfLocal, State),
 
@@ -453,21 +453,16 @@ unregister_on_node(Name) ->
 -spec add_to_local_table(Name :: any(), Pid :: pid(), Meta :: any(), MonitorRef :: undefined | reference()) -> ok.
 add_to_local_table(Name, Pid, Meta, MonitorRef) ->
     %% remove entry if previous exists & get pre-existing monitor ref
-    OldMonitorRef = case find_registry_entry_by_name(Name) of
+    case find_registry_tuple_by_name(Name) of
         undefined ->
             undefined;
 
-        {Name, OldPid, _OldMeta, OldMRef, _Node} ->
-            ets:delete(syn_registry_by_pid, {OldPid, Name}),
-            OldMRef
-    end,
-    MonitorRef1 = case MonitorRef of
-        undefined -> OldMonitorRef;
-        _ -> MonitorRef
+        {Name, OldPid, _OldMeta} ->
+            ets:delete(syn_registry_by_pid, {OldPid, Name})
     end,
     %% overwrite & add
-    ets:insert(syn_registry_by_name, {Name, Pid, Meta, MonitorRef1, node(Pid)}),
-    ets:insert(syn_registry_by_pid, {{Pid, Name}, Meta, MonitorRef1, node(Pid)}),
+    ets:insert(syn_registry_by_name, {Name, Pid, Meta, MonitorRef, node(Pid)}),
+    ets:insert(syn_registry_by_pid, {{Pid, Name}, Meta, MonitorRef, node(Pid)}),
     ok.
 
 -spec remove_from_local_table(Name :: any(), Pid :: pid()) -> ok.

+ 2 - 18
test/syn_registry_SUITE.erl

@@ -40,8 +40,7 @@
     single_node_register_gen_server/1,
     single_node_callback_on_process_exit/1,
     single_node_ensure_callback_process_exit_is_called_if_process_killed/1,
-    single_node_monitor_after_registry_crash/1,
-    single_node_keep_monitor_reference_for_pid_if_there/1
+    single_node_monitor_after_registry_crash/1
 ]).
 -export([
     two_nodes_register_monitor_and_unregister/1,
@@ -115,8 +114,7 @@ groups() ->
             single_node_register_gen_server,
             single_node_callback_on_process_exit,
             single_node_ensure_callback_process_exit_is_called_if_process_killed,
-            single_node_monitor_after_registry_crash,
-            single_node_keep_monitor_reference_for_pid_if_there
+            single_node_monitor_after_registry_crash
         ]},
         {two_nodes_process_registration, [shuffle], [
             two_nodes_register_monitor_and_unregister,
@@ -423,20 +421,6 @@ single_node_monitor_after_registry_crash(_Config) ->
     %% retrieve
     undefined = syn:whereis(<<"my proc 2">>).
 
-single_node_keep_monitor_reference_for_pid_if_there(_Config) ->
-    %% start
-    ok = syn:start(),
-    %% start processes
-    Pid = syn_test_suite_helper:start_process(),
-    %% register
-    ok = syn:register(<<"my proc">>, Pid),
-    %% get monitor
-    [{<<"my proc">>, Pid, undefined, MonitorRef, _}] = ets:lookup(syn_registry_by_name, <<"my proc">>),
-    %% insert into table and keep reference
-    syn_registry:add_to_local_table(<<"my proc">>, Pid, undefined, undefined),
-    %% check internals
-    [{<<"my proc">>, Pid, undefined, MonitorRef, _}] = ets:lookup(syn_registry_by_name, <<"my proc">>).
-
 two_nodes_register_monitor_and_unregister(Config) ->
     %% get slave
     SlaveNode = proplists:get_value(slave_node, Config),