Obsługa wstrzymywania i wznawiania

Maszyny wirtualne można wstrzymywać, wznawiać, ponownie uruchamiać i wyłączać. Gdy wystąpi któreś z tych zdarzeń, ma to wpływ na wydawców, subskrybentów, klientów RPC i serwery RPC. Rysunek 1 przedstawia cykl życia pakietu usług:

Cykl życia pakietu usług

Rysunek 1. Cykl życia pakietu usług.

Cykl życia pakietu usług przebiega w tej kolejności:

  1. Wywoływana jest metoda new w celu utworzenia pakietu usług.
  2. Menedżer cyklu życia uruchamia pakiet usług i w zależności od ustawień w konfiguracji orkiestracji wywołuje metodę on_start.
  3. Gdy maszyna wirtualna zatrzyma się lub zostanie wstrzymana, a w zależności od ustawień w konfiguracji orkiestracji menedżer cyklu życia wywołuje metodę on_stop. Funkcja on_stop powinna zatrzymać wątki wydawców, subskrybentów, klientów RPC i serwerów RPC.
  4. Gdy maszyna wirtualna zostanie wznowiona, metoda on_start może ponownie utworzyć wątki, jeśli pakiet usług jest skonfigurowany tak, aby można go było ponownie uruchomić za pomocą konfiguracji orkiestracji.

Tworzenie konfiguracji do obsługi wstrzymywania i wznawiania

Poniższy przykład pokazuje konfigurację do obsługi wstrzymywania i wznawiania:

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

Gdzie:

  • WAIT_FOR_FINISH to ostatni stan zasilania, w którym pakiet usług powinien oczekiwać, że agenty SDV będą odpowiadać.
  • SUSPEND_TO_RAM_POST_FINISH oznacza, że agenty SDV mogą zamykać lub wstrzymywać połączenie, aby można je było niezawodnie przywrócić po wznowieniu. Ważne jest, aby nie polegać na SUSPEND_TO_RAM_POST_FINISH ani POWER_OFF_POST_FINISH w celu wywołania onStop w implementacji pakietu usług, ale zamiast tego polegać na SUSPEND_TO_RAM_ENTER, POWER_OFF_ENTER i WAIT_FOR_FINISH.

Określanie dostępności usługi

Poniższy przykład pokazuje, jak używać interfejsu API oprogramowania pośredniczącego w pakiecie usług, aby określić, czy jednostka usługi jest dostępna:

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 to interfejs API oprogramowania pośredniczącego, który służy do tworzenia zdarzenia o nazwie unit_name. Ten strumień zdarzeń rejestracji jest powiadamiany, gdy jednostka usługi stanie się dostępna.