this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add Hobbes.get_cluster

garrison ba62ffd6 6d9a9a6e

+17 -7
+16 -7
lib/hobbes.ex
··· 2 2 alias Hobbes.Servers.{Coordinator, Manager} 3 3 alias Hobbes.Structs.Cluster 4 4 5 - @spec refresh_cluster(Cluster.t) :: Cluster.t 6 - def refresh_cluster(%Cluster{} = cluster) do 7 - cluster.coordinators 5 + @spec get_cluster([atom] | [{atom, atom}]) :: {:ok, Cluster.t} | {:error, :coordinator_timeout | :manager_timeout | :manager_recovering} 6 + def get_cluster(coordinators) when is_list(coordinators) do 7 + coordinators 8 8 |> Enum.map(&Coordinator.get_manager_send/1) 9 9 |> Enum.map(&Coordinator.get_manager_receive/1) 10 10 |> Enum.reduce([], fn ··· 15 15 [_ | _] = results -> 16 16 {manager_pid, _generation} = Enum.max_by(results, fn {_pid, generation} -> generation end) 17 17 case Manager.get_cluster(manager_pid) do 18 - {:ok, %Cluster{} = new_cluster} -> new_cluster 19 - {:error, _err} -> cluster 18 + {:ok, %Cluster{} = cluster} -> {:ok, cluster} 19 + {:error, :recovering} -> {:error, :manager_recovering} 20 + {:error, :timeout} -> {:error, :manager_timeout} 20 21 end 21 22 22 - # Received no responses 23 - [] -> cluster 23 + [] -> 24 + {:error, :coordinator_timeout} 25 + end 26 + end 27 + 28 + @spec refresh_cluster(Cluster.t) :: Cluster.t 29 + def refresh_cluster(%Cluster{} = cluster) do 30 + case get_cluster(cluster.coordinators) do 31 + {:ok, %Cluster{} = new_cluster} -> new_cluster 32 + {:error, _err} -> cluster 24 33 end 25 34 end 26 35 end
+1
lib/servers/manager.ex
··· 59 59 SimServer.cast(server, {:tlog_ping, status}) 60 60 end 61 61 62 + @spec get_cluster(term) :: {:ok, Cluster.t} | {:error, :recovering | :timeout} 62 63 def get_cluster(server, timeout \\ 5000) do 63 64 try do 64 65 SimServer.call(server, :get_cluster, timeout)