diff --git a/ChangeLog b/ChangeLog index eee4e222d9..5020d7dd83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,16 @@ +Fri Jul 7 09:47:14 EDT 2006 Daniel Berrange + * src/xend_internal.c: changed xenDaemonLookupByID to simply do + an sexpr GET on /xend/domain/[ID] instead of listing all names + and iterating over /xend/domain/[NAME]. Reduces the running time + and number of GETs from O(n^2) to O(n). + + * src/xend_internal.c: fixed xenDaemonOpen() to try both unix and + Wed Jul 5 17:11:32 IST 2006 Mark McLoughlin * xml.c: allow a to not have any devices - e.g. when using an NFS root. - + Thu Jul 6 10:32:14 CEST 2006 Daniel Veillard * src/xend_internal.c: fixed xenDaemonOpen() to try both unix and diff --git a/proxy/libvirt_proxy.c b/proxy/libvirt_proxy.c index 7d04eb0171..8908bc0254 100644 --- a/proxy/libvirt_proxy.c +++ b/proxy/libvirt_proxy.c @@ -454,33 +454,14 @@ retry2: } break; case VIR_PROXY_LOOKUP_ID: { - char **names; - char **tmp; - int ident, len; char *name = NULL; unsigned char uuid[16]; + int len; if (req->len != sizeof(virProxyPacket)) goto comm_error; - /* - * Xend API forces to collect the full domain list by names, and - * then query each of them until the id is found - */ - names = xenDaemonListDomainsOld(conn); - tmp = names; - - if (names != NULL) { - while (*tmp != NULL) { - ident = xenDaemonDomainLookupByName_ids(conn, *tmp, &uuid[0]); - if (ident == req->data.arg) { - name = *tmp; - break; - } - tmp++; - } - } - if (name == NULL) { + if (xenDaemonDomainLookupByID(conn, req->data.arg, &name, uuid) < 0) { req->data.arg = -1; } else { len = strlen(name); @@ -492,7 +473,8 @@ retry2: memcpy(&request.extra.str[0], uuid, 16); strcpy(&request.extra.str[16], name); } - free(names); + if (name) + free(name); break; } case VIR_PROXY_LOOKUP_UUID: { diff --git a/src/xend_internal.c b/src/xend_internal.c index 965c0a3a57..e7aa3bf2a7 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1082,7 +1082,7 @@ xenDaemonDomainCreateLinux(virConnectPtr xend, const char *sexpr) */ int xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *domname, - unsigned char *uuid) + unsigned char *uuid) { struct sexpr *root; const char *value; @@ -1119,6 +1119,62 @@ xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *domname, return (ret); } + +/** + * 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; + char *dst_uuid; + struct sexpr *root; + + memset(uuid, 0, 16); + + root = sexpr_get(xend, "/xend/domain/%d?detail=1", id); + if (root == NULL) + goto error; + + name = sexpr_node(root, "domain/name"); + if (name == NULL) { + virXendError(xend, VIR_ERR_INTERNAL_ERROR, + "domain informations incomplete, missing name"); + goto error; + } + if (domname) + *domname = strdup(name); + + dst_uuid = (char *)&uuid[0]; + if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL) { + virXendError(xend, VIR_ERR_INTERNAL_ERROR, + "domain informations incomplete, missing uuid"); + goto error; + } + + sexpr_free(root); + return (0); + +error: + sexpr_free(root); + if (domname && *domname) { + free(*domname); + *domname = NULL; + } + return (-1); +} + /** * xend_get_node: * @xend: A xend instance @@ -2264,33 +2320,13 @@ error: */ static virDomainPtr xenDaemonLookupByID(virConnectPtr conn, int id) { - char **names; - char **tmp; - int ident; char *name = NULL; unsigned char uuid[16]; virDomainPtr ret; - /* - * Xend API forces to collect the full domain list by names, and then - * query each of them until the id is found - */ - names = xenDaemonListDomainsOld(conn); - tmp = names; - - if (names != NULL) { - while (*tmp != NULL) { - ident = xenDaemonDomainLookupByName_ids(conn, *tmp, &uuid[0]); - if (ident == id) { - name = strdup(*tmp); - break; - } - tmp++; - } - free(names); - } - if (name == NULL) + if (xenDaemonDomainLookupByID(conn, id, &name, uuid) < 0) { goto error; + } ret = virGetDomain(conn, name, uuid); if (ret == NULL) { @@ -2298,13 +2334,12 @@ xenDaemonLookupByID(virConnectPtr conn, int id) { goto error; } ret->handle = id; - if (name != NULL) - free(name); + free(name); return (ret); -error: + error: if (name != NULL) - free(name); + free(name); return (NULL); } diff --git a/src/xend_internal.h b/src/xend_internal.h index eeb79b6adb..3806919a6c 100644 --- a/src/xend_internal.h +++ b/src/xend_internal.h @@ -534,6 +534,20 @@ 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); + + /** * \brief Lookup information about the host machine * \param xend A xend instance