@@ -2,65 +2,71 @@ defmodule Phoenix.Tracker.Replica do
22 @ moduledoc false
33 alias Phoenix.Tracker.Replica
44
5- @ type name :: String . t
5+ @ type name :: String . t ( )
66 @ type vsn :: integer
77 @ type replica_ref :: { name , vsn }
88
99 @ type t :: % Replica {
10- name: name ,
11- vsn: vsn ,
12- last_heartbeat_at: pos_integer | nil ,
13- status: :up | :down | :permdown
14- }
10+ name: name ,
11+ vsn: vsn ,
12+ last_heartbeat_at: pos_integer | nil ,
13+ status: :up | :down | :permdown
14+ }
1515
1616 defstruct name: nil ,
1717 vsn: nil ,
1818 last_heartbeat_at: nil ,
1919 status: :up
2020
21-
22- @ type op_result :: { % { name => Replica . t } , previous_node :: Replica . t | nil , updated_node :: Replica . t }
21+ @ type op_result ::
22+ { % { name => Replica . t ( ) } , previous_node :: Replica . t ( ) | nil ,
23+ updated_node :: Replica . t ( ) }
2324
2425 @ doc """
2526 Returns a new Replica with a unique vsn.
2627 """
27- @ spec new ( name ) :: Replica . t
28+ @ spec new ( name ) :: Replica . t ( )
2829 def new ( name ) do
2930 % Replica { name: name , vsn: unique_vsn ( ) }
3031 end
3132
32- @ spec ref ( Replica . t ) :: replica_ref
33+ @ spec ref ( Replica . t ( ) ) :: replica_ref
3334 def ref ( % Replica { name: name , vsn: vsn } ) , do: { name , vsn }
3435
35- @ spec put_heartbeat ( % { name => Replica . t } , replica_ref ) :: op_result
36+ @ spec put_heartbeat ( % { name => Replica . t ( ) } , replica_ref ) :: op_result
3637 def put_heartbeat ( replicas , { name , vsn } ) do
3738 case Map . fetch ( replicas , name ) do
3839 :error ->
3940 new_replica = touch_last_heartbeat ( % Replica { name: name , vsn: vsn , status: :up } )
4041 { Map . put ( replicas , name , new_replica ) , nil , new_replica }
4142
4243 { :ok , % Replica { } = prev_replica } ->
43- updated_replica = touch_last_heartbeat ( % Replica { prev_replica | vsn: vsn , status: :up } )
44+ updated_replica = touch_last_heartbeat ( % { prev_replica | vsn: vsn , status: :up } )
4445 { Map . put ( replicas , name , updated_replica ) , prev_replica , updated_replica }
4546 end
4647 end
4748
48- @ spec detect_down ( % { name => Replica . t } , Replica . t , pos_integer , pos_integer ) :: op_result
49+ @ spec detect_down ( % { name => Replica . t ( ) } , Replica . t ( ) , pos_integer , pos_integer ) :: op_result
4950 def detect_down ( replicas , replica , temp_interval , perm_interval , now \\ now_ms ( ) ) do
5051 downtime = now - replica . last_heartbeat_at
52+
5153 cond do
52- downtime > perm_interval -> { Map . delete ( replicas , replica . name ) , replica , permdown ( replica ) }
54+ downtime > perm_interval ->
55+ { Map . delete ( replicas , replica . name ) , replica , permdown ( replica ) }
56+
5357 downtime > temp_interval ->
5458 updated_replica = down ( replica )
5559 { Map . put ( replicas , replica . name , updated_replica ) , replica , updated_replica }
56- true -> { replicas , replica , replica }
60+
61+ true ->
62+ { replicas , replica , replica }
5763 end
5864 end
5965
6066 @ doc """
6167 Fetches a replica from the map with matching name and version from the ref.
6268 """
63- @ spec fetch_by_ref ( % { name => Replica . t } , replica_ref ) :: { :ok , Replica . t } | :error
69+ @ spec fetch_by_ref ( % { name => Replica . t ( ) } , replica_ref ) :: { :ok , Replica . t ( ) } | :error
6470 def fetch_by_ref ( replicas , { name , vsn } ) do
6571 case Map . fetch ( replicas , name ) do
6672 { :ok , % Replica { vsn: ^ vsn } = replica } -> { :ok , replica }
@@ -69,12 +75,12 @@ defmodule Phoenix.Tracker.Replica do
6975 end
7076 end
7177
72- defp permdown ( replica ) , do: % Replica { replica | status: :permdown }
78+ defp permdown ( % Replica { } = replica ) , do: % { replica | status: :permdown }
7379
74- defp down ( replica ) , do: % Replica { replica | status: :down }
80+ defp down ( % Replica { } = replica ) , do: % { replica | status: :down }
7581
76- defp touch_last_heartbeat ( replica ) do
77- % Replica { replica | last_heartbeat_at: now_ms ( ) }
82+ defp touch_last_heartbeat ( % Replica { } = replica ) do
83+ % { replica | last_heartbeat_at: now_ms ( ) }
7884 end
7985
8086 defp now_ms , do: System . system_time ( :millisecond )
0 commit comments