Processar suspensão e retomada

As máquinas virtuais (VMs) podem ser suspensas, retomadas, reinicializadas e desligadas. Quando qualquer um desses eventos ocorre, publishers, assinantes, clientes e servidores RPC são afetados. A Figura 1 mostra o ciclo de vida de um pacote de serviços:

Ciclo de vida de um pacote de serviços

Figura 1. Ciclo de vida de um pacote de serviços.

O ciclo de vida do pacote de serviços segue esta sequência:

  1. O método new é chamado para criar o pacote de serviços.
  2. O gerenciador de ciclo de vida inicia o pacote de serviços e, dependendo das configurações na configuração de orquestração, chama on_start.
  3. Quando a VM é interrompida ou suspensa e, dependendo das configurações na configuração de orquestração, o gerenciador de ciclo de vida chama on_stop. A função on_stop precisa interromper as linhas de execução de editores, assinantes, clientes e servidores RPC.
  4. Quando a VM é retomada, o on_start pode recriar as linhas de execução se o pacote de serviços estiver configurado para ser iniciado novamente pela configuração de orquestração.

Criar uma configuração para processar suspensão e retomada

O exemplo a seguir mostra uma configuração para processar suspensão e retomada:

# Start `auto_start` service bundles when system is started.
state {
    condition {
        or {
            power_state: "ON"
            power_state: "POWER_OFF_EXIT"
            power_state: "SUSPEND_TO_RAM_EXIT"
        }
    }
    groups_states { started: "auto_start" }
}

# Stop `auto_start` service bundles when system is suspending to RAM.
state {
    condition {
        or {
            power_state: "SUSPEND_TO_RAM_ENTER"
            power_state: "WAIT_FOR_FINISH"
            power_state: "SUSPEND_TO_RAM_POST_FINISH"
        }
    }
    groups_states { created: "auto_start" }
}

Em que:

  • WAIT_FOR_FINISH é o último estado de energia em que o pacote de serviços deve esperar que os agentes de veículo definido por software (SDV) respondam.
  • SUSPEND_TO_RAM_POST_FINISH indica que os agentes de SDV podem estar fechando ou suspendendo a conexão para poder restaurá-los de forma confiável ao retomar. É importante não depender de SUSPEND_TO_RAM_POST_FINISH ou POWER_OFF_POST_FINISH para chamar onStop na implementação do pacote de serviços e, em vez disso, depender de SUSPEND_TO_RAM_ENTER, POWER_OFF_ENTER e WAIT_FOR_FINISH.

Determinar a disponibilidade do serviço

O exemplo a seguir mostra como usar a API de middleware no pacote de serviços para determinar se uma unidade de serviço está disponível:

let mut registration_event_stream =  sdv::mw::clientlib::create_server_registration_event_stream(
        sdv_comms,
        // Descriptor of type sdv::mw::clientlib::rpc_descriptor::client::Descriptor
        // that binds a specific RPC client type to a communication channel.
        client_descriptor,
    )
    .await
    .expect("unable to generate a registration event");

match registration_event_stream.next().await {
            Some(sdv::mw::Availability::Available) => {
                info!("{unit_name} became Available.");
                // Create client/subscriber
            }
            Some(sdv::mw::Availability::Unavailable) => {
                info!("{unit_name} became Unavailable.");
                // Destroy client/subscriber
            }
            None => {
                warn!("Registration event stream for {unit_name} terminated.
                Stopping monitoring for this variant.");
            }
        }

O create_server_registration_event_stream é uma API de middleware usada para criar um evento chamado unit_name. Esse fluxo de eventos de registro é notificado quando uma unidade de serviço fica disponível.