On Wed, Jan 08, 2025 at 19:42:51 +0000, Daniel P. Berrangé wrote:
> When performing auto-shutdown of running domains, there is now the
> option to mark them as "autostart once", so that their state is
> restored on next boot. This applies on top of the traditional
> autostart flag.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> src/hypervisor/domain_driver.c | 27 ++++++++++++++++++++++-----
> src/hypervisor/domain_driver.h | 1 +
> 2 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
> index 867ee1ae2a..2f89b8c841 100644
> --- a/src/hypervisor/domain_driver.c
> +++ b/src/hypervisor/domain_driver.c
> @@ -677,10 +677,11 @@ virDomainDriverAutoStartOne(virDomainObj *vm,
> virObjectLock(vm);
> virObjectRef(vm);
>
> - VIR_DEBUG("Autostart %s: autostart=%d",
> - vm->def->name, vm->autostart);
> + VIR_DEBUG("Autostart %s: autostart=%d autostartOnce=%d",
> + vm->def->name, vm->autostart, vm->autostartOnce);
>
> - if (vm->autostart && !virDomainObjIsActive(vm)) {
> + if ((vm->autostart || vm->autostartOnce)
> + && !virDomainObjIsActive(vm)) {
> virResetLastError();
> if (state->cfg->delayMS) {
> if (!state->first) {
> @@ -691,6 +692,7 @@ virDomainDriverAutoStartOne(virDomainObj *vm,
> }
>
> state->cfg->callback(vm, state->cfg->opaque);
> + vm->autostartOnce = 0;
Per comment in previous patch the '.once' file needs to be unlinked here
instead.
> }
>
> virDomainObjEndAPI(&vm);
Also both of the hunks above really look like they belong to the
previous patch as they implement the auto-start-once feature while this
commit is now using that feature to do 'restore' of the state at
shutdown.
> @@ -725,9 +727,9 @@ virDomainDriverAutoShutdown(virDomainDriverAutoShutdownConfig *cfg)
> g_autofree bool *transient = NULL;
>
> VIR_DEBUG("Run autoshutdown uri=%s trySave=%d tryShutdown=%d poweroff=%d"
> - "waitShutdownSecs=%d saveBypassCache=%d",
> + "waitShutdownSecs=%d saveBypassCache=%d autoRestore=%d",
> cfg->uri, cfg->trySave, cfg->tryShutdown, cfg->poweroff,
> - cfg->waitShutdownSecs, cfg->saveBypassCache);
> + cfg->waitShutdownSecs, cfg->saveBypassCache, cfg->autoRestore);
>
> /*
> * Ideally guests will shutdown in a few seconds, but it would
> @@ -763,6 +765,21 @@ virDomainDriverAutoShutdown(virDomainDriverAutoShutdownConfig *cfg)
> for (i = 0; i < numDomains; i++) {
> if (virDomainIsPersistent(domains[i]) == 0)
> transient[i] = true;
> +
> + if (cfg->autoRestore) {
> + if (transient[i]) {
> + VIR_DEBUG("Cannot auto-restore transient VM %s",
> + virDomainGetName(domains[i]));
> + } else {
> + VIR_DEBUG("Mark %s for autostart on next boot",
> + virDomainGetName(domains[i]));
> + if (virDomainSetAutostartOnce(domains[i], 1) < 0) {
> + VIR_WARN("Unable to mark domain '%s' for auto restore: %s",
> + virDomainGetName(domains[i]),
> + virGetLastErrorMessage());
> + }
> + }
> + }
> }
>
> if (cfg->trySave != VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_SCOPE_NONE) {
> diff --git a/src/hypervisor/domain_driver.h b/src/hypervisor/domain_driver.h
> index 16832f2449..72152f8054 100644
> --- a/src/hypervisor/domain_driver.h
> +++ b/src/hypervisor/domain_driver.h
> @@ -109,6 +109,7 @@ typedef struct _virDomainDriverAutoShutdownConfig {
> virDomainDriverAutoShutdownScope poweroff;
> int waitShutdownSecs;
> bool saveBypassCache;
> + bool autoRestore;
> } virDomainDriverAutoShutdownConfig;
>
> void virDomainDriverAutoShutdown(virDomainDriverAutoShutdownConfig *cfg);
Wit the comments above addressed:
Reviewed-by: Peter Krempa <pkrempa@redhat.com>