[Libvir] Patch to fix duplicate pause/destroy/shutdown calls

Daniel P. Berrange berrange at redhat.com
Wed Aug 9 22:12:38 UTC 2006


I spent a while chasing an issue where running 'virsh destroy foo' on an
HVM domain would result in an error being returned by the HV ioctl. What
I eventually discovered is that the code was doing a destroy op via XenD
and then also doing it via the hypervisor backend. It didn't typically
show as a problem for PV domains because it seems they took longer to
destroy - so were still around by the time the HV destroy was was called.

I tracked this issue down to the main dispatch methods in src/libvirt.c
which would indeed call both the XenD and HV driver backends for pause
destroy & shutdown methods. The patch attached simply returns as soon as
one of the driver methods returns a success return code.

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 --------------
diff -c -b -r1.41 libvirt.c
*** src/libvirt.c	9 Aug 2006 15:21:16 -0000	1.41
--- src/libvirt.c	9 Aug 2006 22:58:47 -0000
***************
*** 720,726 ****
  int
  virDomainDestroy(virDomainPtr domain)
  {
!     int ret = -1, i;
      virConnectPtr conn;
  
      if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
--- 720,726 ----
  int
  virDomainDestroy(virDomainPtr domain)
  {
!     int i;
      virConnectPtr conn;
  
      if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
***************
*** 743,749 ****
  	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainDestroy != NULL)) {
  	    if (conn->drivers[i]->domainDestroy(domain) == 0)
! 	        ret = 0;
  	}
      }
      for (i = 0;i < conn->nb_drivers;i++) {
--- 743,749 ----
  	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainDestroy != NULL)) {
  	    if (conn->drivers[i]->domainDestroy(domain) == 0)
! 	        return (0);
  	}
      }
      for (i = 0;i < conn->nb_drivers;i++) {
***************
*** 751,766 ****
  	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainDestroy != NULL)) {
  	    if (conn->drivers[i]->domainDestroy(domain) == 0)
! 	        ret = 0;
  	}
      }
  
-     if (ret != 0) {
          virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
!         return (ret);
!     }
! 
!     return (ret);
  }
  
  /**
--- 751,762 ----
              (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
              (conn->drivers[i]->domainDestroy != NULL)) {
  	    if (conn->drivers[i]->domainDestroy(domain) == 0)
! 	        return (0);
          }
      }
  
      virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
!     return (-1);
  }
  
  /**
***************
*** 799,805 ****
  int
  virDomainSuspend(virDomainPtr domain)
  {
!     int ret = -1, i;
      virConnectPtr conn;
  
      if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
--- 795,801 ----
  int
  virDomainSuspend(virDomainPtr domain)
  {
!     int i;
      virConnectPtr conn;
  
      if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
***************
*** 822,828 ****
  	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainSuspend != NULL)) {
  	    if (conn->drivers[i]->domainSuspend(domain) == 0)
! 	        ret = 0;
  	}
      }
      for (i = 0;i < conn->nb_drivers;i++) {
--- 818,824 ----
  	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainSuspend != NULL)) {
  	    if (conn->drivers[i]->domainSuspend(domain) == 0)
! 	        return (0);
  	}
      }
      for (i = 0;i < conn->nb_drivers;i++) {
***************
*** 830,845 ****
  	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
  	    (conn->drivers[i]->domainSuspend != NULL)) {
  	    if (conn->drivers[i]->domainSuspend(domain) == 0)
! 	        ret = 0;
  	}
      }
  
-     if (ret != 0) {
          virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
!         return (ret);
!     }
! 
!     return (ret);
  }
  
  /**
--- 826,837 ----
  	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
              (conn->drivers[i]->domainSuspend != NULL)) {
  	    if (conn->drivers[i]->domainSuspend(domain) == 0)
! 	        return (0);
          }
      }
  
      virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
!     return (-1);
  }
  
  /**


More information about the libvir-list mailing list