[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