Просмотр исходного кода

Ensure unregistration happens also for keys on unconnected nodes.

Also, improve atomicity of the operation.
Roberto Ostinelli 9 лет назад
Родитель
Сommit
181c324e8f
1 измененных файлов с 18 добавлено и 8 удалено
  1. 18 8
      src/syn_backbone.erl

+ 18 - 8
src/syn_backbone.erl

@@ -102,12 +102,12 @@ register(Key, Pid, Meta) ->
 
 -spec unregister(Key :: any()) -> ok | {error, undefined}.
 unregister(Key) ->
-    case find_by_key(Key) of
+    case i_find_by_key(Key) of
         undefined ->
             {error, undefined};
-        Pid ->
-            Node = node(Pid),
-            gen_server:call({?MODULE, Node}, {unregister_on_node, Key, Pid})
+        Process ->
+            Node = Process#syn_processes_table.node,
+            gen_server:call({?MODULE, Node}, {unregister_on_node, Key})
     end.
 
 -spec count() -> non_neg_integer().
@@ -188,10 +188,20 @@ handle_call({register_on_node, Key, Pid, Meta}, _From, State) ->
             {reply, {error, taken}, State}
     end;
 
-handle_call({unregister_on_node, Key, Pid}, _From, State) ->
-    remove_process_by_key(Key),
-    erlang:unlink(Pid),
-    {reply, ok, State};
+handle_call({unregister_on_node, Key}, _From, State) ->
+    %% we check again for key to return the correct response regardless of race conditions
+    case i_find_by_key(Key) of
+        undefined ->
+            {reply, {error, undefined}, State};
+        Process ->
+            %% remove from table
+            remove_process_by_key(Key),
+            %% unlink
+            Pid = Process#syn_processes_table.pid,
+            erlang:unlink(Pid),
+            %% reply
+            {reply, ok, State}
+    end;
 
 handle_call({unlink_process, Pid}, _From, State) ->
     erlang:unlink(Pid),