]> xenbits.xensource.com Git - libvirt.git/commitdiff
Re-wrote xenDomainLookupByID to use more efficient XenD access
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 7 Jul 2006 18:58:35 +0000 (18:58 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 7 Jul 2006 18:58:35 +0000 (18:58 +0000)
ChangeLog
proxy/libvirt_proxy.c
src/xend_internal.c
src/xend_internal.h

index eee4e222d994187c2fc066805ed117a467b7a618..5020d7dd83853b7a74940ed4f5df94c1fc92b271 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,16 @@
+Fri Jul  7 09:47:14 EDT 2006 Daniel Berrange <berrange@redhat.com>
+       * 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 <markmc@redhat.com>
 
        * xml.c: allow a <domain> to not have any <disk> devices - e.g.
        when using an NFS root.
-       
+
 Thu Jul  6 10:32:14 CEST 2006 Daniel Veillard <veillard@redhat.com>
 
        * src/xend_internal.c: fixed xenDaemonOpen() to try both unix and
index 7d04eb0171d52b225e6e2be59c2fd3dfff4d2f2c..8908bc025401b63981c24b1ec64d08ba155b7043 100644 (file)
@@ -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: {
index 965c0a3a573a5f299c2d0841a118d087a7ae0088..e7aa3bf2a7fe9b8f21b51f2084c17b7d1c5f4198 100644 (file)
@@ -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);
 }
 
index eeb79b6adbe0a0799fa3f7cd239ea17bf99ccab3..3806919a6c1084ba51513c1d29833d164865e12c 100644 (file)
@@ -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