On Thu, Jul 03, 2025 at 14:50:33 +0200, Peter Krempa via Devel wrote:
> From: Peter Krempa <[email protected]>
>
> Decide separately and record what shutdown modes are to be applied on
> given VM object rather than spreading out the logic through the code.
>
> This centralization simplifies the conditions in the worker functions
> and also:
> - provides easy way to check if the auto-shutdown code will be acting
> on domain object (will be used to fix attempt to auto-restore of
> VMs which were not selected to be acted on
> - will simplify further work where the desired shutdown action will be
> picked per-VM
>
> This refactor also fixes a bug where if restoring of the state is
> applied also on VMs that are not selected for action based on current
> logic.
>
> Signed-off-by: Peter Krempa <[email protected]>
> ---
> src/hypervisor/domain_driver.c | 176 +++++++++++++++++++--------------
> 1 file changed, 100 insertions(+), 76 deletions(-)
While actually testing this I've noticed that ...
> +static unsigned int
> +virDomainDriverAutoShutdownGetMode(virDomainPtr domain,
> + virDomainDriverAutoShutdownConfig *cfg)
> +{
> + unsigned int mode = 0;
> +
> + if (virDomainIsPersistent(domain) == 0) {
... this check is incorrect as it matches transient domains. Given
that ...
> + if (cfg->trySave == VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_SCOPE_ALL ||
> + cfg->trySave == VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_SCOPE_PERSISTENT)
> + mode |= VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_MODE_SAVE;
> +
> + if (cfg->tryShutdown == VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_SCOPE_ALL ||
> + cfg->tryShutdown ==
> VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_SCOPE_PERSISTENT)
> + mode |= VIR_DOMAIN_DRIVER_AUTO_SHUTDOWN_MODE_SHUTDOWN;
> - transient = g_new0(bool, numDomains);
> + modes = g_new0(unsigned int, numDomains);
> +
> for (i = 0; i < numDomains; i++) {
> - if (virDomainIsPersistent(domains[i]) == 0)
> - transient[i] = true;
... it was written this way, to pick the 'transient' code path only when
"a successful false" was returned ...
> + modes[i] = virDomainDriverAutoShutdownGetMode(domains[i], cfg);
>
> - if (cfg->autoRestore) {
... I'll change it to
+ if (virDomainIsPersistent(domain) != 0) {
// code when persistent
...
before pushing and also I'll wear the brown paper bag of shame for this
patch.