+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
}
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);
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: {
*/
int
xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *domname,
- unsigned char *uuid)
+ unsigned char *uuid)
{
struct sexpr *root;
const char *value;
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
*/
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) {
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);
}
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