[Libvir] [PATCH 4/6] Inactive domain support: Ignore inactive domains
Daniel P. Berrange
berrange at redhat.com
Wed Nov 15 02:23:23 UTC 2006
The attached path makes the xen_internal, xend_internall, xs_internal and
proxy driver backends ignore all virDomainPtr objects which have an ID
number of -1. All operations on such domains need to instead be handled
by the new xm_internal.c backend which uses the config files. Without this
patch, the existing drivers would all throw bogus errors due to ID of -1.
This patch is slightly simpler than last time, because the code to ignore
HTTP 404 errors from XenD was already merged last week.
Regards,
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
Index: src/proxy_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/proxy_internal.c,v
retrieving revision 1.13
diff -c -r1.13 proxy_internal.c
*** src/proxy_internal.c 8 Nov 2006 13:53:29 -0000 1.13
--- src/proxy_internal.c 15 Nov 2006 02:34:01 -0000
***************
*** 663,669 ****
if (!VIR_IS_CONNECT(conn)) {
virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
! return (-1);
}
memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_MAX_MEMORY;
--- 663,669 ----
if (!VIR_IS_CONNECT(conn)) {
virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
! return (0);
}
memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_MAX_MEMORY;
***************
*** 672,678 ****
ret = xenProxyCommand(conn, &req, NULL, 0);
if (ret < 0) {
xenProxyClose(conn);
! return(-1);
}
return(req.data.larg);
}
--- 672,678 ----
ret = xenProxyCommand(conn, &req, NULL, 0);
if (ret < 0) {
xenProxyClose(conn);
! return(0);
}
return(req.data.larg);
}
***************
*** 695,700 ****
--- 695,702 ----
virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (0);
}
+ if (domain->handle < 0)
+ return (0);
return(xenProxyDomainGetDomMaxMemory(domain->conn, domain->handle));
}
***************
*** 716,730 ****
int ret;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
! if (domain == NULL)
! virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
! else
! virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
! return (0);
}
if (info == NULL) {
virProxyError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
! return (-1);
}
memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_DOMAIN_INFO;
--- 718,734 ----
int ret;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
! if (domain == NULL)
! virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
! else
! virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
! return (-1);
}
+ if (domain->handle < 0)
+ return (-1);
if (info == NULL) {
virProxyError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
! return (-1);
}
memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_DOMAIN_INFO;
***************
*** 733,743 ****
ret = xenProxyCommand(domain->conn, &req, &ans, 0);
if (ret < 0) {
xenProxyClose(domain->conn);
! return(-1);
}
if (ans.len != sizeof(virProxyPacket) + sizeof(virDomainInfo)) {
virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
! return (-1);
}
memmove(info, &ans.extra.dinfo, sizeof(virDomainInfo));
--- 737,747 ----
ret = xenProxyCommand(domain->conn, &req, &ans, 0);
if (ret < 0) {
xenProxyClose(domain->conn);
! return(-1);
}
if (ans.len != sizeof(virProxyPacket) + sizeof(virDomainInfo)) {
virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
! return (-1);
}
memmove(info, &ans.extra.dinfo, sizeof(virDomainInfo));
***************
*** 960,965 ****
--- 964,971 ----
virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (NULL);
}
+ if (domain->handle < 0)
+ return (NULL);
memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_DOMAIN_XML;
req.data.arg = domain->handle;
Index: src/xen_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xen_internal.c,v
retrieving revision 1.49
diff -c -r1.49 xen_internal.c
*** src/xen_internal.c 16 Oct 2006 16:04:55 -0000 1.49
--- src/xen_internal.c 15 Nov 2006 02:34:03 -0000
***************
*** 1498,1504 ****
xenHypervisorGetMaxMemory(virDomainPtr domain)
{
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0))
return (0);
return(xenHypervisorGetDomMaxMemory(domain->conn, domain->handle));
--- 1498,1504 ----
xenHypervisorGetMaxMemory(virDomainPtr domain)
{
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0))
return (0);
return(xenHypervisorGetDomMaxMemory(domain->conn, domain->handle));
***************
*** 1597,1602 ****
--- 1597,1603 ----
(domain->conn->handle < 0) || (info == NULL) ||
(domain->handle < 0))
return (-1);
+
return(xenHypervisorGetDomInfo(domain->conn, domain->handle, info));
}
***************
*** 1616,1622 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0))
return (-1);
ret = virXen_pausedomain(domain->conn->handle, domain->handle);
--- 1617,1623 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0))
return (-1);
ret = virXen_pausedomain(domain->conn->handle, domain->handle);
***************
*** 1639,1645 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0))
return (-1);
ret = virXen_unpausedomain(domain->conn->handle, domain->handle);
--- 1640,1646 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0))
return (-1);
ret = virXen_unpausedomain(domain->conn->handle, domain->handle);
***************
*** 1662,1668 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0))
return (-1);
ret = virXen_destroydomain(domain->conn->handle, domain->handle);
--- 1663,1669 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0))
return (-1);
ret = virXen_destroydomain(domain->conn->handle, domain->handle);
***************
*** 1686,1692 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0))
return (-1);
ret = virXen_setmaxmem(domain->conn->handle, domain->handle, memory);
--- 1687,1693 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0))
return (-1);
ret = virXen_setmaxmem(domain->conn->handle, domain->handle, memory);
***************
*** 1713,1719 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (nvcpus < 1))
return (-1);
ret = virXen_setmaxvcpus(domain->conn->handle, domain->handle, nvcpus);
--- 1714,1721 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0) ||
! (nvcpus < 1))
return (-1);
ret = virXen_setmaxvcpus(domain->conn->handle, domain->handle, nvcpus);
***************
*** 1741,1747 ****
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (cpumap == NULL) || (maplen < 1))
return (-1);
ret = virXen_setvcpumap(domain->conn->handle, domain->handle, vcpu,
--- 1743,1750 ----
int ret;
if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0) ||
! (cpumap == NULL) || (maplen < 1))
return (-1);
ret = virXen_setvcpumap(domain->conn->handle, domain->handle, vcpu,
***************
*** 1782,1790 ****
virVcpuInfoPtr ipt;
int nbinfo, i;
! if ((domain == NULL) || (domain->conn == NULL) || (domain->conn->handle < 0)
! || (info == NULL) || (maxinfo < 1)
! || (sizeof(cpumap_t) & 7))
return (-1);
if ((cpumaps != NULL) && (maplen < 1))
return -1;
--- 1785,1794 ----
virVcpuInfoPtr ipt;
int nbinfo, i;
! if ((domain == NULL) || (domain->conn == NULL) ||
! (domain->conn->handle < 0) || (domain->handle < 0) ||
! (info == NULL) || (maxinfo < 1) ||
! (sizeof(cpumap_t) & 7))
return (-1);
if ((cpumaps != NULL) && (maplen < 1))
return -1;
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.74
diff -c -r1.74 xend_internal.c
*** src/xend_internal.c 15 Nov 2006 00:38:13 -0000 1.74
--- src/xend_internal.c 15 Nov 2006 02:34:04 -0000
***************
*** 1266,1272 ****
return node;
}
! static int
xend_get_config_version(virConnectPtr conn) {
struct sexpr *root;
const char *value;
--- 1266,1272 ----
return node;
}
! int
xend_get_config_version(virConnectPtr conn) {
struct sexpr *root;
const char *value;
***************
*** 2075,2080 ****
--- 2075,2082 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "pause", NULL);
}
***************
*** 2095,2100 ****
--- 2097,2104 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "unpause", NULL);
}
***************
*** 2116,2121 ****
--- 2120,2127 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "halt", NULL);
}
***************
*** 2138,2143 ****
--- 2144,2151 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "reboot", NULL);
}
***************
*** 2162,2167 ****
--- 2170,2177 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "destroy", NULL);
}
***************
*** 2187,2192 ****
--- 2197,2204 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
return xend_op(domain->conn, domain->name, "op", "save", "file", filename, NULL);
}
***************
*** 2232,2237 ****
--- 2244,2251 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
/* can we ask for a subset ? worth it ? */
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
***************
*** 2266,2271 ****
--- 2280,2288 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
+
snprintf(buf, sizeof(buf), "%lu", memory >> 10);
return xend_op(domain->conn, domain->name, "op", "maxmem_set", "memory",
buf, NULL);
***************
*** 2297,2302 ****
--- 2314,2322 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle < 0)
+ return(-1);
+
snprintf(buf, sizeof(buf), "%lu", memory >> 10);
return xend_op(domain->conn, domain->name, "op", "mem_target_set",
"target", buf, NULL);
***************
*** 2345,2350 ****
--- 2365,2372 ----
__FUNCTION__);
return(NULL);
}
+ if (domain->handle < 0)
+ return(NULL);
return xenDaemonDomainDumpXMLByID(domain->conn, domain->handle);
}
***************
*** 2372,2378 ****
__FUNCTION__);
return(-1);
}
!
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
if (root == NULL)
--- 2394,2401 ----
__FUNCTION__);
return(-1);
}
! if (domain->handle < 0)
! return(-1);
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
if (root == NULL)
***************
*** 2652,2657 ****
--- 2675,2683 ----
__FUNCTION__);
return (-1);
}
+ if (domain->handle < 0)
+ return(-1);
+
snprintf(buf, sizeof(buf), "%d", vcpus);
return(xend_op(domain->conn, domain->name, "op", "set_vcpus", "vcpus",
buf, NULL));
***************
*** 2681,2686 ****
--- 2707,2714 ----
__FUNCTION__);
return (-1);
}
+ if (domain->handle < 0)
+ return(-1);
/* from bit map, build character string of mapped CPU numbers */
for (i = 0; i < maplen; i++) for (j = 0; j < 8; j++)
***************
*** 2734,2739 ****
--- 2762,2770 ----
__FUNCTION__);
return (-1);
}
+ if (domain->handle < 0)
+ return(-1);
+
root = sexpr_get(domain->conn, "/xend/domain/%s?op=vcpuinfo", domain->name);
if (root == NULL)
return (-1);
Index: src/xend_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.h,v
retrieving revision 1.26
diff -c -r1.26 xend_internal.h
*** src/xend_internal.h 12 Sep 2006 01:16:22 -0000 1.26
--- src/xend_internal.h 15 Nov 2006 02:34:05 -0000
***************
*** 613,618 ****
--- 613,619 ----
*/
int xend_log(virConnectPtr xend, char *buffer, size_t n_buffer);
+ int xend_get_config_version(virConnectPtr conn);
char *xend_parse_domain_sexp(virConnectPtr conn, char *root, int xendConfigVersion);
/* refactored ones */
Index: src/xs_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.c,v
retrieving revision 1.21
diff -c -r1.21 xs_internal.c
*** src/xs_internal.c 8 Nov 2006 13:53:29 -0000 1.21
--- src/xs_internal.c 15 Nov 2006 02:34:06 -0000
***************
*** 372,377 ****
--- 372,379 ----
}
if (domain->conn->xshandle == NULL)
return(-1);
+ if (domain->handle == -1)
+ return(-1);
tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "running");
if (tmp != NULL) {
***************
*** 430,435 ****
--- 432,439 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle == -1)
+ return(-1);
snprintf(value, 19, "%lu", memory);
value[19] = 0;
ret = virDomainDoStoreWrite(domain, "memory/target", &value[0]);
***************
*** 454,459 ****
--- 458,465 ----
if (!VIR_IS_CONNECTED_DOMAIN(domain))
return (ret);
+ if (domain->handle == -1)
+ return(-1);
tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "memory/target");
if (tmp != NULL) {
***************
*** 626,631 ****
--- 632,639 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle == -1)
+ return(-1);
/*
* this is very hackish, the domU kernel probes for a special
* node in the xenstore and launch the shutdown command if found.
***************
*** 652,657 ****
--- 660,667 ----
__FUNCTION__);
return(-1);
}
+ if (domain->handle == -1)
+ return(-1);
/*
* this is very hackish, the domU kernel probes for a special
* node in the xenstore and launch the shutdown command if found.
More information about the libvir-list
mailing list