···7788 alias Hobbes.ShardTagMap
99 alias Hobbes.KV.FlatKV
1010- alias Hobbes.Structs.{Cluster, TLogGeneration, Server, TLogStatus, LogBatch}
1010+ alias Hobbes.Structs.{Cluster, TLogGeneration, Server, SupervisorStatus, TLogStatus, LogBatch}
1111 alias Hobbes.Servers.{Coordinator, ServerSupervisor, TLog}
1212 alias Hobbes.Encoding.Keyset
1313···7171 SimServer.start_link(__MODULE__, opts)
7272 end
73737474- def supervisor_ping(server, failed?, slots) do
7575- SimServer.cast(server, {:supervisor_ping, self(), failed?, slots})
7474+ def supervisor_ping(server, %SupervisorStatus{} = status) do
7575+ SimServer.cast(server, {:supervisor_ping, status})
7676 end
77777878 def tlog_ping(server, %TLogStatus{} = status) do
···105105 end
106106 end
107107108108- def handle_cast({:supervisor_ping, supervisor_pid, failed?, slots}, %State{} = state) do
108108+ def handle_cast({:supervisor_ping, %SupervisorStatus{} = status}, %State{} = state) do
109109 assert state.generation != nil
110110111111+ %{
112112+ pid: supervisor_pid,
113113+ generation_failed?: generation_failed?,
114114+ } = status
115115+111116 # If a transaction process in this generation has failed, shutdown immediately
112117 # so that a new Manager can be recruited
113113- if failed? do
118118+ if generation_failed? do
114119 SimLogger.debug "Manager (generation=#{state.generation}): A supervisor reported failure, exiting"
115120 exit(:shutdown)
116121 end
117122118123 SimProcess.send(supervisor_pid, {:update_cluster, state.cluster})
119119- state = add_supervisor(state, supervisor_pid, slots)
124124+ state = add_supervisor(state, status)
120125121126 {:noreply, state}
122127 end
···244249 end
245250 end
246251247247- defp add_supervisor(%State{} = state, _supervisor_pid, nil = _slots) do
252252+ defp add_supervisor(%State{} = state, %SupervisorStatus{slots: nil} = _status) do
248253 # Don't add supervisor until it has loaded its slots (once it receives a cluster)
249254 state
250255 end
251256252252- defp add_supervisor(%State{} = state, supervisor_pid, slots) do
257257+ defp add_supervisor(%State{} = state, %SupervisorStatus{} = status) do
258258+ %{
259259+ pid: supervisor_pid,
260260+ slots: slots,
261261+ } = status
262262+253263 case List.keyfind(state.supervisors, supervisor_pid, 0) do
254264 nil ->
255265 # Add new supervisor to list
+24-11
lib/servers/server_supervisor.ex
···4455 import ExUnit.Assertions, only: [assert: 1]
6677- alias Hobbes.Structs.Cluster
77+ alias Hobbes.Structs.{Cluster, SupervisorStatus}
88 alias Hobbes.Servers.{Coordinator, Manager}
991010 import Hobbes.Utils
···395395 defp send_manager_ping(%State{} = state) do
396396 assert is_pid(state.manager_pid)
397397398398- if state.cluster && state.cluster.generation == state.manager_generation do
399399- slots = %{
400400- stateless: state.open_stateless,
401401- tlog: length(state.open_tlog),
402402- storage: length(state.open_storage),
403403- }
404404- Manager.supervisor_ping(state.manager_pid, state.generation_failed, slots)
405405- else
406406- Manager.supervisor_ping(state.manager_pid, state.generation_failed, nil)
407407- end
398398+ manager_generation = state.manager_generation
399399+ assert is_integer(manager_generation)
400400+401401+ slots =
402402+ case state.cluster do
403403+ %Cluster{generation: ^manager_generation} ->
404404+ %{
405405+ stateless: state.open_stateless,
406406+ tlog: length(state.open_tlog),
407407+ storage: length(state.open_storage),
408408+ }
409409+410410+ _ ->
411411+ nil
412412+ end
413413+414414+ status = %SupervisorStatus{
415415+ node: SimProcess.node(),
416416+ pid: self(),
417417+ generation_failed?: state.generation_failed,
418418+ slots: slots,
419419+ }
408420421421+ Manager.supervisor_ping(state.manager_pid, status)
409422 state
410423 end
411424
+16
lib/structs.ex
···5050 defstruct @enforce_keys
5151 end
52525353+ defmodule SupervisorStatus do
5454+ @type t :: %__MODULE__{
5555+ node: atom,
5656+ pid: pid,
5757+ generation_failed?: boolean,
5858+ slots: map | nil,
5959+ }
6060+ @enforce_keys [
6161+ :node,
6262+ :pid,
6363+ :generation_failed?,
6464+ :slots,
6565+ ]
6666+ defstruct @enforce_keys
6767+ end
6868+5369 defmodule TLogStatus do
5470 @type t :: %__MODULE__{
5571 id: non_neg_integer,