Jim Fehlig wrote: > Daniel P. Berrange wrote: > >> From: "Daniel P. Berrange" <berra...@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 <berra...@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@redhat.com > https://www.redhat.com/mailman/listinfo/libvir-list > > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list