Browse Source

Allow to re-register a process to change its metadata.

Roberto Ostinelli 5 years ago
parent
commit
30c2feb98a
2 changed files with 12 additions and 1 deletions
  1. 9 1
      src/syn_registry.erl
  2. 3 0
      test/syn_registry_SUITE.erl

+ 9 - 1
src/syn_registry.erl

@@ -142,7 +142,7 @@ init([]) ->
             %% init
             {ok, #state{}};
         Reason ->
-            {stop, {error_waiting_for_process_registry_table, Reason}}
+            {stop, {error_waiting_for_registry_table, Reason}}
     end.
 
 %% ----------------------------------------------------------------------------------------------------------
@@ -168,6 +168,14 @@ handle_call({register_on_node, Name, Pid, Meta}, _From, State) ->
                     rpc:eval_everywhere(nodes(), ?MODULE, sync_register, [Name, Pid, Meta]),
                     %% return
                     {reply, ok, State};
+
+                Entry when Entry#syn_registry_table.pid == Pid ->
+                    register_on_node(Name, Pid, Meta),
+                    %% multicast
+                    rpc:eval_everywhere(nodes(), ?MODULE, sync_register, [Name, Pid, Meta]),
+                    %% return
+                    {reply, ok, State};
+
                 _ ->
                     {reply, {error, taken}, State}
             end;

+ 3 - 0
test/syn_registry_SUITE.erl

@@ -207,6 +207,9 @@ single_node_register_and_monitor(_Config) ->
     Pid = syn:whereis(<<"my proc">>),
     Pid = syn:whereis(<<"my proc 2">>),
     {PidWithMeta, {meta, <<"meta">>}} = syn:whereis(<<"my proc with meta">>, with_meta),
+    %% re-register
+    ok = syn:register(<<"my proc with meta">>, PidWithMeta, {meta2, <<"meta2">>}),
+    {PidWithMeta, {meta2, <<"meta2">>}} = syn:whereis(<<"my proc with meta">>, with_meta),
     %% kill process
     syn_test_suite_helper:kill_process(Pid),
     syn_test_suite_helper:kill_process(PidWithMeta),