in lambda/rapid/shutdown.go [82:114]
func (s *shutdownContext) handleProcessExit(termination supvmodel.ProcessTermination) {
name := *termination.Name
agent, found := s.agentsAwaitingExit[name]
// If it is an agent registered to receive a shutdown event.
if found {
log.Debugf("Handling termination for %s", name)
exitStatus := termination.Exited()
if exitStatus != nil && *exitStatus == 0 {
// If the agent exited by itself after receiving the shutdown event.
stateErr := agent.Exited()
if stateErr != nil {
log.Warnf("%s failed to transition to EXITED: %s (current state: %s)", agent.String(), stateErr, agent.GetState().Name())
}
} else {
// If the agent did not exit by itself, had to be SIGKILLed (only in standalone mode).
stateErr := agent.ShutdownFailed()
if stateErr != nil {
log.Warnf("%s failed to transition to ShutdownFailed: %s (current state: %s)", agent, stateErr, agent.GetState().Name())
}
}
}
exitedChannel, found := s.getExitedChannel(name)
if !found {
log.Panicf("Unable to find an exitedChannel for '%s', it should have been created just after it was execed.", name)
}
// we close the channel so that whoever is blocked on it
// or will try to block on it in the future unblocks immediately
close(exitedChannel)
}