this repo has no description
2
fork

Configure Feed

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

Use struct for supervisor ping

garrison f667f5e6 eb593f87

+58 -19
+18 -8
lib/servers/manager.ex
··· 7 7 8 8 alias Hobbes.ShardTagMap 9 9 alias Hobbes.KV.FlatKV 10 - alias Hobbes.Structs.{Cluster, TLogGeneration, Server, TLogStatus, LogBatch} 10 + alias Hobbes.Structs.{Cluster, TLogGeneration, Server, SupervisorStatus, TLogStatus, LogBatch} 11 11 alias Hobbes.Servers.{Coordinator, ServerSupervisor, TLog} 12 12 alias Hobbes.Encoding.Keyset 13 13 ··· 71 71 SimServer.start_link(__MODULE__, opts) 72 72 end 73 73 74 - def supervisor_ping(server, failed?, slots) do 75 - SimServer.cast(server, {:supervisor_ping, self(), failed?, slots}) 74 + def supervisor_ping(server, %SupervisorStatus{} = status) do 75 + SimServer.cast(server, {:supervisor_ping, status}) 76 76 end 77 77 78 78 def tlog_ping(server, %TLogStatus{} = status) do ··· 105 105 end 106 106 end 107 107 108 - def handle_cast({:supervisor_ping, supervisor_pid, failed?, slots}, %State{} = state) do 108 + def handle_cast({:supervisor_ping, %SupervisorStatus{} = status}, %State{} = state) do 109 109 assert state.generation != nil 110 110 111 + %{ 112 + pid: supervisor_pid, 113 + generation_failed?: generation_failed?, 114 + } = status 115 + 111 116 # If a transaction process in this generation has failed, shutdown immediately 112 117 # so that a new Manager can be recruited 113 - if failed? do 118 + if generation_failed? do 114 119 SimLogger.debug "Manager (generation=#{state.generation}): A supervisor reported failure, exiting" 115 120 exit(:shutdown) 116 121 end 117 122 118 123 SimProcess.send(supervisor_pid, {:update_cluster, state.cluster}) 119 - state = add_supervisor(state, supervisor_pid, slots) 124 + state = add_supervisor(state, status) 120 125 121 126 {:noreply, state} 122 127 end ··· 244 249 end 245 250 end 246 251 247 - defp add_supervisor(%State{} = state, _supervisor_pid, nil = _slots) do 252 + defp add_supervisor(%State{} = state, %SupervisorStatus{slots: nil} = _status) do 248 253 # Don't add supervisor until it has loaded its slots (once it receives a cluster) 249 254 state 250 255 end 251 256 252 - defp add_supervisor(%State{} = state, supervisor_pid, slots) do 257 + defp add_supervisor(%State{} = state, %SupervisorStatus{} = status) do 258 + %{ 259 + pid: supervisor_pid, 260 + slots: slots, 261 + } = status 262 + 253 263 case List.keyfind(state.supervisors, supervisor_pid, 0) do 254 264 nil -> 255 265 # Add new supervisor to list
+24 -11
lib/servers/server_supervisor.ex
··· 4 4 5 5 import ExUnit.Assertions, only: [assert: 1] 6 6 7 - alias Hobbes.Structs.Cluster 7 + alias Hobbes.Structs.{Cluster, SupervisorStatus} 8 8 alias Hobbes.Servers.{Coordinator, Manager} 9 9 10 10 import Hobbes.Utils ··· 395 395 defp send_manager_ping(%State{} = state) do 396 396 assert is_pid(state.manager_pid) 397 397 398 - if state.cluster && state.cluster.generation == state.manager_generation do 399 - slots = %{ 400 - stateless: state.open_stateless, 401 - tlog: length(state.open_tlog), 402 - storage: length(state.open_storage), 403 - } 404 - Manager.supervisor_ping(state.manager_pid, state.generation_failed, slots) 405 - else 406 - Manager.supervisor_ping(state.manager_pid, state.generation_failed, nil) 407 - end 398 + manager_generation = state.manager_generation 399 + assert is_integer(manager_generation) 400 + 401 + slots = 402 + case state.cluster do 403 + %Cluster{generation: ^manager_generation} -> 404 + %{ 405 + stateless: state.open_stateless, 406 + tlog: length(state.open_tlog), 407 + storage: length(state.open_storage), 408 + } 409 + 410 + _ -> 411 + nil 412 + end 413 + 414 + status = %SupervisorStatus{ 415 + node: SimProcess.node(), 416 + pid: self(), 417 + generation_failed?: state.generation_failed, 418 + slots: slots, 419 + } 408 420 421 + Manager.supervisor_ping(state.manager_pid, status) 409 422 state 410 423 end 411 424
+16
lib/structs.ex
··· 50 50 defstruct @enforce_keys 51 51 end 52 52 53 + defmodule SupervisorStatus do 54 + @type t :: %__MODULE__{ 55 + node: atom, 56 + pid: pid, 57 + generation_failed?: boolean, 58 + slots: map | nil, 59 + } 60 + @enforce_keys [ 61 + :node, 62 + :pid, 63 + :generation_failed?, 64 + :slots, 65 + ] 66 + defstruct @enforce_keys 67 + end 68 + 53 69 defmodule TLogStatus do 54 70 @type t :: %__MODULE__{ 55 71 id: non_neg_integer,