Jim Fehlig wrote:
Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange(a)redhat.com>
>
> Unconditionally invoke the xenHypervisorLookupDomainByID,
> xenHypervisorLookupDomainByUUID or xenDaemonLookupByName
> for looking up domains. Fallback to xenXMDomainLookupByUUID
> and xenXMDomainLookupByName for legacy XenD without inactive
> domain support
>
>
Do you think there are any Xen installations running such an old xend
toolstack, and if so wanting to use e.g. libvirt 1.0.6? Seems all of the
XEND_CONFIG_VERSION_3_0_3 logic could be removed from the code.
> Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
> ---
> src/xen/xen_driver.c | 99 +++++++++++--------------------------------------
> src/xen/xend_internal.c | 89 --------------------------------------------
> src/xen/xend_internal.h | 14 -------
> src/xen/xs_internal.c | 62 -------------------------------
> src/xen/xs_internal.h | 2 -
> 5 files changed, 22 insertions(+), 244 deletions(-)
>
>
I spent some time testing this one and didn't notice any problems.
Apparently "some" time was not enough time. With this patch, I noticed
'virsh undefine dom' failing because the tri-state virDomainIsActive()
is returning -1.
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 82058b7..080045c 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -601,38 +601,17 @@ xenUnifiedDomainCreateXML(virConnectPtr conn,
> return xenDaemonCreateXML(conn, xmlDesc);
> }
>
> -/* Assumption made in underlying drivers:
> - * If the domain is "not found" and there is no other error, then
> - * the Lookup* functions return a NULL but do not set virterror.
> - */
> static virDomainPtr
> xenUnifiedDomainLookupByID(virConnectPtr conn, int id)
> {
> - xenUnifiedPrivatePtr priv = conn->privateData;
> - virDomainPtr ret;
> + virDomainPtr ret = NULL;
>
> - /* Reset any connection-level errors in virterror first, in case
> - * there is one hanging around from a previous call.
> - */
> - virConnResetLastError(conn);
> + ret = xenHypervisorLookupDomainByID(conn, id);
>
> - /* Try hypervisor/xenstore combo. */
> - if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
> - ret = xenHypervisorLookupDomainByID(conn, id);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> -
> - /* Try xend. */
> - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
> - ret = xenDaemonLookupByID(conn, id);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> + if (!ret && virGetLastError() == NULL)
> + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
>
> - /* Not found. */
> - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
> - return NULL;
> + return ret;
> }
>
> static virDomainPtr
> @@ -642,35 +621,20 @@ xenUnifiedDomainLookupByUUID(virConnectPtr conn,
> xenUnifiedPrivatePtr priv = conn->privateData;
> virDomainPtr ret;
>
> - /* Reset any connection-level errors in virterror first, in case
> - * there is one hanging around from a previous call.
> - */
> - virConnResetLastError(conn);
> -
> - /* Try hypervisor/xenstore combo. */
> - if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
> - ret = xenHypervisorLookupDomainByUUID(conn, uuid);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> -
> - /* Try xend. */
> - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
> - ret = xenDaemonLookupByUUID(conn, uuid);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> + ret = xenHypervisorLookupDomainByUUID(conn, uuid);
>
> /* Try XM for inactive domains. */
> - if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
> - ret = xenXMDomainLookupByUUID(conn, uuid);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> + if (!ret) {
> + if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
> + ret = xenXMDomainLookupByUUID(conn, uuid);
> + else
> + return xenDaemonLookupByUUID(conn, uuid);
> }
>
> - /* Not found. */
> - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
> - return NULL;
> + if (!ret && virGetLastError() == NULL)
> + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
> +
> + return ret;
> }
>
> static virDomainPtr
> @@ -680,35 +644,16 @@ xenUnifiedDomainLookupByName(virConnectPtr conn,
> xenUnifiedPrivatePtr priv = conn->privateData;
> virDomainPtr ret;
>
> - /* Reset any connection-level errors in virterror first, in case
> - * there is one hanging around from a previous call.
> - */
> - virConnResetLastError(conn);
> -
> - /* Try xend. */
> - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
> - ret = xenDaemonLookupByName(conn, name);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> -
> - /* Try xenstore for inactive domains. */
> - if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
> - ret = xenStoreLookupByName(conn, name);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
> + ret = xenDaemonLookupByName(conn, name);
>
> /* Try XM for inactive domains. */
> - if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
> + if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
> ret = xenXMDomainLookupByName(conn, name);
> - if (ret || conn->err.code != VIR_ERR_OK)
> - return ret;
> - }
>
> - /* Not found. */
> - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
> - return NULL;
> + if (!ret && virGetLastError() == NULL)
> + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
> +
> + return ret;
> }
>
>
> @@ -719,7 +664,7 @@ xenUnifiedDomainIsActive(virDomainPtr dom)
> int ret = -1;
>
> /* ID field in dom may be outdated, so re-lookup */
> - currdom = xenUnifiedDomainLookupByUUID(dom->conn, dom->uuid);
>
xenUnifiedDomainLookupByUUID will try the xend or xm drivers if the
hypervisor driver fails. Invoking the hypervisor driver only will result
in a NULL 'currdom' for inactive domains, causing this function (and
hence virDomainIsActive) to return -1, which in turn causes cmdUndefine
in tools/virsh-domain.c to bail with an error.
Regards,
Jim
> + currdom = xenHypervisorLookupDomainByUUID(dom->conn,
dom->uuid);
>
> if (currdom) {
> ret = currdom->id == -1 ? 0 : 1;
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 2e6a47e..4ad30fa 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -855,63 +855,6 @@ xenDaemonDomainLookupByName_ids(virConnectPtr xend,
> }
>
>
> -/**
> - * xenDaemonDomainLookupByID:
> - * @xend: A xend instance
> - * @id: The id of the domain
> - * @name: return value for the name if not NULL
> - * @uuid: return value for the UUID if not NULL
> - *
> - * This method looks up the name of a domain based on its id
> - *
> - * Returns the 0 on success; -1 (with errno) on error
> - */
> -int
> -xenDaemonDomainLookupByID(virConnectPtr xend,
> - int id,
> - char **domname,
> - unsigned char *uuid)
> -{
> - const char *name = NULL;
> - struct sexpr *root;
> -
> - memset(uuid, 0, VIR_UUID_BUFLEN);
> -
> - root = sexpr_get(xend, "/xend/domain/%d?detail=1", id);
> - if (root == NULL)
> - goto error;
> -
> - name = sexpr_node(root, "domain/name");
> - if (name == NULL) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - "%s", _("domain information incomplete, missing
name"));
> - goto error;
> - }
> - if (domname) {
> - *domname = strdup(name);
> - if (*domname == NULL) {
> - virReportOOMError();
> - goto error;
> - }
> - }
> -
> - if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - "%s", _("domain information incomplete, missing
uuid"));
> - goto error;
> - }
> -
> - sexpr_free(root);
> - return 0;
> -
> -error:
> - sexpr_free(root);
> - if (domname)
> - VIR_FREE(*domname);
> - return -1;
> -}
> -
> -
> static int
> xend_detect_config_version(virConnectPtr conn)
> {
> @@ -1863,38 +1806,6 @@ xenDaemonNodeGetTopology(virConnectPtr conn, virCapsPtr caps)
>
>
> /**
> - * xenDaemonLookupByID:
> - * @conn: pointer to the hypervisor connection
> - * @id: the domain ID number
> - *
> - * Try to find a domain based on the hypervisor ID number
> - *
> - * Returns a new domain object or NULL in case of failure
> - */
> -virDomainPtr
> -xenDaemonLookupByID(virConnectPtr conn, int id)
> -{
> - char *name = NULL;
> - unsigned char uuid[VIR_UUID_BUFLEN];
> - virDomainPtr ret;
> -
> - if (xenDaemonDomainLookupByID(conn, id, &name, uuid) < 0) {
> - goto error;
> - }
> -
> - ret = virGetDomain(conn, name, uuid);
> - if (ret == NULL) goto error;
> -
> - ret->id = id;
> - VIR_FREE(name);
> - return ret;
> -
> - error:
> - VIR_FREE(name);
> - return NULL;
> -}
> -
> -/**
> * xenDaemonDomainSetVcpusFlags:
> * @domain: pointer to domain object
> * @nvcpus: the new number of virtual CPUs for this domain
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index 5f82f04..e8713a7 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -69,19 +69,6 @@ int xenDaemonDomainLookupByName_ids(virConnectPtr xend,
> const char *name, unsigned char *uuid);
>
>
> -/**
> - * \brief Lookup the name of a domain
> - * \param xend A xend instance
> - * \param id The id of the domain
> - * \param name pointer to store a copy of the name
> - * \param uuid pointer to store a copy of the uuid
> - *
> - * This method looks up the name/uuid of a domain
> - */
> -int xenDaemonDomainLookupByID(virConnectPtr xend,
> - int id,
> - char **name, unsigned char *uuid);
> -
>
> virDomainDefPtr
> xenDaemonDomainFetch(virConnectPtr xend,
> @@ -153,7 +140,6 @@ extern struct xenUnifiedDriver xenDaemonDriver;
> int xenDaemonInit (void);
>
> virDomainPtr xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc);
> -virDomainPtr xenDaemonLookupByID(virConnectPtr conn, int id);
> virDomainPtr xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
> virDomainPtr xenDaemonLookupByName(virConnectPtr conn, const char *domname);
> int xenDaemonDomainMigratePrepare (virConnectPtr dconn, char **cookie, int
*cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname,
unsigned long resource);
> diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
> index dbb4ae4..7926535 100644
> --- a/src/xen/xs_internal.c
> +++ b/src/xen/xs_internal.c
> @@ -580,68 +580,6 @@ xenStoreListDomains(virConnectPtr conn, int *ids, int maxids)
> return ret;
> }
>
> -/**
> - * xenStoreLookupByName:
> - * @conn: A xend instance
> - * @name: The name of the domain
> - *
> - * Try to lookup a domain on the Xen Store based on its name.
> - *
> - * Returns a new domain object or NULL in case of failure
> - */
> -virDomainPtr
> -xenStoreLookupByName(virConnectPtr conn, const char *name)
> -{
> - virDomainPtr ret = NULL;
> - unsigned int num, i, len;
> - long id = -1;
> - char **idlist = NULL, *endptr;
> - char prop[200], *tmp;
> - int found = 0;
> - struct xend_domain *xenddomain = NULL;
> - xenUnifiedPrivatePtr priv = conn->privateData;
> -
> - if (priv->xshandle == NULL)
> - return NULL;
> -
> - idlist = xs_directory(priv->xshandle, 0, "/local/domain",
&num);
> - if (idlist == NULL)
> - goto done;
> -
> - for (i = 0; i < num; i++) {
> - id = strtol(idlist[i], &endptr, 10);
> - if ((endptr == idlist[i]) || (*endptr != 0)) {
> - goto done;
> - }
> -#if 0
> - if (virConnectCheckStoreID(conn, (int) id) < 0)
> - continue;
> -#endif
> - snprintf(prop, 199, "/local/domain/%s/name", idlist[i]);
> - prop[199] = 0;
> - tmp = xs_read(priv->xshandle, 0, prop, &len);
> - if (tmp != NULL) {
> - found = STREQ(name, tmp);
> - VIR_FREE(tmp);
> - if (found)
> - break;
> - }
> - }
> - if (!found)
> - goto done;
> -
> - ret = virGetDomain(conn, name, NULL);
> - if (ret == NULL)
> - goto done;
> -
> - ret->id = id;
> -
> -done:
> - VIR_FREE(xenddomain);
> - VIR_FREE(idlist);
> -
> - return ret;
> -}
>
> /**
> * xenStoreDomainShutdown:
> diff --git a/src/xen/xs_internal.h b/src/xen/xs_internal.h
> index 29f0165..fc7798d 100644
> --- a/src/xen/xs_internal.h
> +++ b/src/xen/xs_internal.h
> @@ -43,8 +43,6 @@ int xenStoreNumOfDomains (virConnectPtr conn);
> int xenStoreListDomains (virConnectPtr conn,
> int *ids,
> int maxids);
> -virDomainPtr xenStoreLookupByName(virConnectPtr conn,
> - const char *name);
> unsigned long xenStoreGetMaxMemory (virDomainPtr domain);
> int xenStoreDomainSetMemory (virDomainPtr domain,
> unsigned long memory);
>
>
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list