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

Refactor resolve conflict function.

Roberto Ostinelli 5 лет назад
Родитель
Сommit
0383bc2c2d
1 измененных файлов с 33 добавлено и 33 удалено
  1. 33 33
      src/syn_registry.erl

+ 33 - 33
src/syn_registry.erl

@@ -220,19 +220,18 @@ handle_cast({sync_add, Name, RemotePid, RemoteMeta}, State) ->
                     TablePid = Entry#syn_registry_table.pid,
                     TableMeta = Entry#syn_registry_table.meta,
 
-                    resolve_conflict(Name, {TablePid, TableMeta}, {RemotePid, RemoteMeta},
-                        %% keep currently in table
-                        fun() ->
+                    case resolve_conflict(Name, {TablePid, TableMeta}, {RemotePid, RemoteMeta}, State) of
+                        PidToKeep when PidToKeep =:= TablePid ->
                             %% overwrite
-                            ok = rpc:call(RemoteNode, syn_registry, add_to_local_table, [Name, TablePid, TableMeta, undefined])
-                        end,
-                        %% keep remote
-                        fun() ->
+                            ok = rpc:call(RemoteNode, syn_registry, add_to_local_table, [Name, TablePid, TableMeta, undefined]);
+
+                        PidToKeep when PidToKeep =:= RemotePid ->
                             %% overwrite
-                            add_to_local_table(Name, RemotePid, RemoteMeta, undefined)
-                        end,
-                        State
-                    )
+                            add_to_local_table(Name, RemotePid, RemoteMeta, undefined);
+
+                        _ ->
+                            ok
+                    end
                 end
             )
     end,
@@ -315,17 +314,16 @@ handle_info({nodeup, RemoteNode}, State) ->
                             [node(), Name, {LocalPid, LocalMeta}, {RemotePid, RemoteMeta}]
                         ),
 
-                        resolve_conflict(Name, {LocalPid, LocalMeta}, {RemotePid, RemoteMeta},
-                            %% keep local
-                            fun() ->
-                                ok = rpc:call(RemoteNode, syn_registry, remove_from_local_table, [Name])
-                            end,
-                            %% keep remote
-                            fun() ->
-                                add_to_local_table(Name, RemotePid, RemoteMeta, undefined)
-                            end,
-                            State
-                        )
+                        case resolve_conflict(Name, {LocalPid, LocalMeta}, {RemotePid, RemoteMeta}, State) of
+                            PidToKeep when PidToKeep =:= LocalPid ->
+                                ok = rpc:call(RemoteNode, syn_registry, remove_from_local_table, [Name]);
+
+                            PidToKeep when PidToKeep =:= RemotePid ->
+                                add_to_local_table(Name, RemotePid, RemoteMeta, undefined);
+
+                            _ ->
+                                ok
+                        end
                 end
             end,
             %% add to table
@@ -463,16 +461,12 @@ handle_process_down(Name, Pid, Meta, Reason, #state{
     Name :: any(),
     {LocalPid :: pid(), LocalMeta :: any()},
     {RemotePid :: pid(), RemoteMeta :: any()},
-    KeepLocalFun :: fun(),
-    KeepRemoteFun :: fun(),
     #state{}
-) -> ok.
+) -> pid() | undefined.
 resolve_conflict(
     Name,
     {TablePid, TableMeta},
     {RemotePid, RemoteMeta},
-    KeepTableFun,
-    KeepRemoteFun,
     #state{custom_event_handler = CustomEventHandler}
 ) ->
     TablePidAlive = rpc:call(node(TablePid), erlang, is_process_alive, [TablePid]),
@@ -510,11 +504,12 @@ resolve_conflict(
                 "Syn(~p): Keeping local process ~p, killing remote ~p",
                 [node(), TablePid, RemotePid]
             ),
-            KeepTableFun(),
             case KillOther of
                 true -> exit(RemotePid, {syn_resolve_kill, Name, RemoteMeta});
                 _ -> ok
-            end;
+            end,
+            %% return
+            PidToKeep;
 
         RemotePid ->
             %% keep remote
@@ -522,22 +517,27 @@ resolve_conflict(
                 "Syn(~p): Keeping remote process ~p, killing local ~p",
                 [node(), RemotePid, TablePid]
             ),
-            KeepRemoteFun(),
             case KillOther of
                 true -> exit(TablePid, {syn_resolve_kill, Name, TableMeta});
                 _ -> ok
-            end;
+            end,
+            %% return
+            PidToKeep;
 
         none ->
             remove_from_local_table(Name),
             RemoteNode = node(RemotePid),
-            ok = rpc:call(RemoteNode, syn_registry, remove_from_local_table, [Name]);
+            ok = rpc:call(RemoteNode, syn_registry, remove_from_local_table, [Name]),
+            %% return
+            undefined;
 
         Other ->
             error_logger:error_msg(
                 "Syn(~p): Custom handler returned ~p, valid options were ~p and ~p",
                 [node(), Other, TablePid, RemotePid]
-            )
+            ),
+            %% return
+            undefined
     end.
 
 -spec raw_purge_registry_entries_for_remote_node(Node :: atom()) -> ok.