From: Stefan Bader Date: Thu, 12 Apr 2012 13:42:37 +0000 (+0200) Subject: xend_internal: Use domain/status for shutdown check X-Git-Tag: v0.9.6.1~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8213166b92f735582bd5311bc32f1a4a59122aa1;p=thirdparty%2Flibvirt.git xend_internal: Use domain/status for shutdown check On newer xend (v3.x and after) there is no state and domid reported for inactive domains. When initially creating connections this is handled in various places by assigning domain->id = -1. But once an instance has been running, the id is set to the current domain id. And it does not change when the instance is shut down. So when querying the domain info, the hypervisor driver, which gets asked first will indicate it cannot find information, then the xend driver is asked and will set the status to NOSTATE because it checks for the -1 domain id. Checking domain/status for 0 seems to be more reliable for that. One note: I am not sure whether the domain->id also should get set back to -1 whenever any sub-driver thinks the instance is no longer running. BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=746007 BugLink: http://bugs.launchpad.net/bugs/929626 Signed-off-by: Stefan Bader (cherry picked from commit 26e9ef476239e8cb79f819092c5aac4afdd47d0d) (crobinso: Add Stefan to AUTHORS. maint only) --- diff --git a/AUTHORS b/AUTHORS index d924583ac1..cea6ebd45e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -196,6 +196,7 @@ Patches have also been contributed by: Lei Li Matthias Witte Radu Caragea + Stefan Bader [....send patches to get your name here....] diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index fa39e8b26d..e5c9b27011 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -989,9 +989,14 @@ sexpr_to_xend_domain_state(virDomainPtr domain, const struct sexpr *root) state = VIR_DOMAIN_BLOCKED; else if (strchr(flags, 'r')) state = VIR_DOMAIN_RUNNING; - } else if (domain->id < 0) { - /* Inactive domains don't have a state reported, so - mark them SHUTOFF, rather than NOSTATE */ + } else if (domain->id < 0 || sexpr_int(root, "domain/status") == 0) { + /* As far as I can see the domain->id is a bad sign for checking + * inactive domains as this is inaccurate after the domain has + * been running once. However domain/status from xend seems to + * be always present and 0 for inactive domains. + * (keeping the check for id < 0 to be extra safe about backward + * compatibility) + */ state = VIR_DOMAIN_SHUTOFF; }