2. RunGovernor state diagram#
The different RunGovernor states can be generalized into three different groups which are also color coded in the diagram.
Initializing and starting the experiment run (green)
Shutting down the experiment run and clean up (blue)
Error handling (orange)
2.1. Initialization and Startup#
When a new instance of the RunGovernor gets launched by the Executor it always
gets launched as RGSPristine
which as the name suggests resembles a fresh
and unused RunGovernor this state however is almost instantly changed to
RGSInitializing
and then to RGSTransceiving
. During a normal
experiment run the RunGovernor would now stay in this state till it receives
an ExperimentRunStartRequest
from the Executor upon receiving it the
RunGovernor will attempt to start the experiment run and changes its state to
RGSStartingSetup
during this state the RunGovernor checks if it can run
the experiment at all and if it’s running already when it can run the
experiment its state changes to RGSStartingSimControllers
,
RGSStartingEnvConductors
and RGSStartingAgentConductors
in that order
to create all processes for SimulationControllers, EnvConductors and
AgentConductors that are needed for the experiment run. Once all those
processes are created the RunGovernor changes states to RGSStartingRun
which simply starts all previously created processes. At this point the
initialization and start up of the experiment run are done and the RunGovernor
changes back into the RGSTransceiving
state.
2.2. Shutdown and clean up#
If a RunGovernor in the state RGSTransceiving
receives an
ExperimentRunShutdownRequest
it will change its state to
RGSStoppingSimulation
and then send a SimulationStopRequest
to the
SimulationController of the experiment run the SimulationController now
handles the shutdown of all Conductors, Enviornments and Agents and responds
with a SimulationStopResponse
. The RunGovernor then shuts down the
SimulationController and sends an ExperimentRunShutdownResponse
to the
Executor afterwards it changes its state to RGSStoppingTransceiving
which
stops it from receiving new requests, then it enters the state
RGSStoppingRun
which stops all remaining processes of Conductors and
SimulationControllers, if the experiment has a next phase the RunGovernor will
now enter RGSStartingSetup
again. Afterwards the states RGSFinalizing
and RGSDone
are entered. Finalizing terminates all subprocesses that
might still run and with RGSDone the RunGovernor terminates itself.
2.3. Error handling#
The plethora of errors that can occur while the RunGovernor runs are handled
by four different Error handling states. However only three of them do
actually have functionality at the moment since
RGSErrorHandlingInitializing
can not be entered. Another state
RGSHandlingDeadChildren
is only entered from the error state
RGSErrorHandlingTransceiving
and basically only checks if a premature task
death has occured, in this case the RunGovernor will jump straight into the
RGSStoppingTransceiving
state, or not in which case the RunGovernor will
initialize shutdown by entering the state RGSStoppingSimulation
.
Most errors that are handled in the state RGSErrorHandlingTransceiving
will result in the RunGovernor reentering the state RGSTransceiving
with
the exception of SignalInterruptError
, which will cause the RunGovernor to
stop the current experiment phase by entering RGSStoppingSimulation
, and
DeadChildrenRisingAsZombiesError
, which lets the RunGovernor switch to the
RGSHandlingDeadChildren
state.
The state RGSErrorHandlingStarting
causes the RunGovernor to either change
its state back to RGSTransceiving
if the error that was caught was an
ExperimentAlreadyRunningError
or to RGSStoppingTransceiving
if the
error was an ExperimentSetupFailedError
all other errors that are handled
by RGSErrorHandlingStarting
will let the RunGovernor change to the
RGSStoppingSimulation
state.