]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Optimize lookup-by-UUID for new XenD
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 2 Mar 2007 20:19:08 +0000 (20:19 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 2 Mar 2007 20:19:08 +0000 (20:19 +0000)
AUTHORS
ChangeLog
src/xend_internal.c

diff --git a/AUTHORS b/AUTHORS
index 96dfde240eb4dd98d283d79076c4ae419b81b009..39c55ca4b93fdeef0a9d6e0ddcdb7b1afc8e6de3 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -29,6 +29,7 @@ Patches have also been contributed by:
   Atsushi SAKAI        <sakaia@jp.fujitsu.com>
   Kazuki Mizushima     <mizushima.kazuk@jp.fujitsu.com>
   Saori Fukuta         <fukuta.saori@jp.fujitsu.com>
+  Tatsuro Enokura      <fj7716hz@aa.jp.fujitsu.com>
 
   [....send patches to get your name here....]
 
index a7685ac65aba90262d02dc84735b0006ae4fb5c9..35c8d8b28542acff22f8f76a780a8ae063110454 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Mar 02 15:16:23 EST 2007 Daniel P. Berrange <berrange@redhat.com>
+
+       * src/xend_internal.c: Change lookup by UUID to request a path
+       of /xen/domain/[uuid] directly for new XenD, rather than iterating
+       over domains sequentially. Derived from patch by
+       Tatsuro Enokura <fj7716hz@aa.jp.fujitsu.com>
+
 Fri Mar 02 09:21:23 EST 2007 Daniel P. Berrange <berrange@redhat.com>
 
        * src/virsh.c: Fix output of VNC display in the case where
index ec38c49eb1cf05af48161bdea8a25d115c57199b..f56d24fcad084e0b66a84313d539b7482fc03bb4 100644 (file)
@@ -1331,7 +1331,16 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
     buf.size = 4000;
     buf.use = 0;
 
-    domid = sexpr_int(root, "domain/domid");
+    tmp = sexpr_node(root, "domain/domid");
+    if (tmp == NULL && xendConfigVersion < 3) { /* Old XenD, domid was mandatory */
+        virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+                     _("domain information incomplete, missing id"));
+        goto error;
+    }
+    if (tmp)
+        domid = sexpr_int(root, "domain/domid");
+    else
+        domid = -1;
     virBufferVSprintf(&buf, "<domain type='xen' id='%d'>\n", domid);
 
     tmp = sexpr_node(root, "domain/name");
@@ -2767,47 +2776,66 @@ xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
 {
     virDomainPtr ret;
     char *name = NULL;
-    char **names;
-    char **tmp;
-    unsigned char ident[VIR_UUID_BUFLEN];
     int id = -1;
-
-    names = xenDaemonListDomainsOld(conn);
-    tmp = names;
-
-    if (names == NULL) {
-        TODO                    /* try to fallback to xenstore lookup */
+    /* Old approach for xen <= 3.0.3 */
+    if (conn->xendConfigVersion < 3) {
+        char **names, **tmp;
+        unsigned char ident[VIR_UUID_BUFLEN];
+        names = xenDaemonListDomainsOld(conn);
+        tmp = names;
+
+        if (names == NULL) {
             return (NULL);
-    }
-    while (*tmp != NULL) {
-        id = xenDaemonDomainLookupByName_ids(conn, *tmp, &ident[0]);
-        if (id >= 0) {
-            if (!memcmp(uuid, ident, VIR_UUID_BUFLEN)) {
-                name = strdup(*tmp);
-                break;
+        }
+        while (*tmp != NULL) {
+            id = xenDaemonDomainLookupByName_ids(conn, *tmp, &ident[0]);
+            if (id >= 0) {
+                if (!memcmp(uuid, ident, VIR_UUID_BUFLEN)) {
+                    name = strdup(*tmp);
+                    break;
+                }
             }
+            tmp++;
         }
-        tmp++;
+        free(names);
+    } else { /* New approach for xen >= 3.0.4 */
+        char *domname = NULL;
+        char uuidstr[VIR_UUID_STRING_BUFLEN];
+        struct sexpr *root = NULL;
+
+        memset(uuidstr, '\0', VIR_UUID_STRING_BUFLEN);
+
+        snprintf(uuidstr, VIR_UUID_STRING_BUFLEN,
+                 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                 uuid[0], uuid[1], uuid[2], uuid[3],
+                 uuid[4], uuid[5], uuid[6], uuid[7],
+                 uuid[8], uuid[9], uuid[10], uuid[11],
+                 uuid[12], uuid[13], uuid[14], uuid[15]);
+        printf("Dpooing %s\n", uuidstr);
+        root = sexpr_get(conn, "/xend/domain/%s?detail=1", uuidstr);
+        if (root == NULL)
+            return (NULL);
+        domname = (char*)sexpr_node(root, "domain/name");
+        if (sexpr_node(root, "domain/domid")) /* only active domains have domid */
+            id = sexpr_int(root, "domain/domid");
+        else
+            id = -1;
+        name = domname ? strdup(domname) : NULL;
+        sexpr_free(root);
     }
-    free(names);
 
     if (name == NULL)
-        goto error;
+        return (NULL);
 
     ret = virGetDomain(conn, name, uuid);
     if (ret == NULL) {
-      virXendError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
-        goto error;
+        virXendError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
+        free(name);
+        return (NULL);
     }
     ret->id = id;
-    if (name != NULL)
-        free(name);
+    free(name);
     return (ret);
-
-error:
-    if (name != NULL)
-        free(name);
-    return (NULL);
 }
 
 /**