Управление приостановкой и возобновлением

Виртуальные машины (ВМ) могут быть приостановлены, возобновлены, перезагружены и выключены. При возникновении любого из этих событий затрагиваются издатели, подписчики, 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 могут закрывать или приостанавливать соединение, чтобы иметь возможность надежно восстановить его при возобновлении работы. Важно не полагаться на вызов onStop SUSPEND_TO_RAM_POST_FINISH или POWER_OFF_POST_FINISH в реализации пакета служб, а вместо этого полагаться на 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 . Этот поток событий регистрации получает уведомления, когда становится доступен сервисный модуль.