Как обрабатывать приостановку и возобновление работы

Виртуальные машины можно приостанавливать, перезапускать, перезагружать и выключать. Когда происходит любое из этих событий, это влияет на издателей, подписчиков, RPC-клиентов и RPC-серверы. На рисунке 1 показан жизненный цикл пакета услуг.

Жизненный цикл пакета услуг

Рисунок 1. Жизненный цикл пакета услуг.

Жизненный цикл пакета услуг состоит из следующих этапов:

  1. Для создания пакета услуг вызывается метод new.
  2. Менеджер жизненного цикла запускает пакет сервисов и, в зависимости от настроек в конфигурации оркестрации, вызывает on_start.
  3. Когда ВМ останавливается или приостанавливается, в зависимости от настроек в конфигурации оркестрации менеджер жизненного цикла вызывает on_stop. Функция on_stop должна останавливать потоки для издателей, подписчиков, клиентов RPC и серверов RPC.
  4. Когда работа виртуальной машины возобновляется, on_start может заново создать потоки, если пакет сервисов настроен на повторный запуск в конфигурации оркестрации.

Создайте конфигурацию для обработки приостановки и возобновления

В примере ниже показана конфигурация для обработки приостановки и возобновления:

# 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" }
}

Место:

  • WAIT_FOR_FINISH – последнее состояние питания, в котором пакет сервисов ожидает ответа от агентов SDV.
  • SUSPEND_TO_RAM_POST_FINISH указывает, что агенты SDV могут закрывать или приостанавливать подключение, чтобы надежно восстанавливать его при возобновлении. Важно не полагаться на SUSPEND_TO_RAM_POST_FINISH или POWER_OFF_POST_FINISH для вызова onStop в реализации пакета сервисов, а вместо этого использовать SUSPEND_TO_RAM_ENTER, POWER_OFF_ENTER и WAIT_FOR_FINISH.

Определите доступность сервиса

В примере ниже показано, как использовать API промежуточного ПО в пакете сервисов, чтобы определить, доступен ли блок сервиса.

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.");
            }
        }

create_server_registration_event_stream – это API промежуточного ПО, который используется для создания события unit_name. Этот поток событий регистрации получает уведомление, когда блок сервиса становится доступным.