Re: [libvirt] [PATCH 4/5] qemu: Make autodestroy utilize connection close callbacks

2012-03-20 Thread Eric Blake
On 03/19/2012 10:18 AM, Jiri Denemark wrote:
 ---
  src/qemu/qemu_conf.h|5 --
  src/qemu/qemu_driver.c  |5 --
  src/qemu/qemu_process.c |  107 ++
  3 files changed, 24 insertions(+), 93 deletions(-)

Good!  I was thinking about this very cleanup myself as I reviewed 3/5,
and I agree with your decision to separate it into different patches.

ACK.

-- 
Eric Blake   ebl...@redhat.com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 4/5] qemu: Make autodestroy utilize connection close callbacks

2012-03-19 Thread Jiri Denemark
---
 src/qemu/qemu_conf.h|5 --
 src/qemu/qemu_driver.c  |5 --
 src/qemu/qemu_process.c |  107 ++
 3 files changed, 24 insertions(+), 93 deletions(-)

diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index a22ce0c..3306014 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -141,11 +141,6 @@ struct qemud_driver {
 
 virLockManagerPluginPtr lockManager;
 
-/* Mapping of 'char *uuidstr' - virConnectPtr
- * of guests which will be automatically killed
- * when the virConnectPtr is closed*/
-virHashTablePtr autodestroy;
-
 /* Mapping of 'char *uuidstr' - qemuDriverCloseDefPtr of domains
  * which want a specific cleanup to be done when a connection is
  * closed. Such cleanup may be to automatically destroy  the
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ce82535..3a5ef09 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -659,9 +659,6 @@ qemudStartup(int privileged) {
 qemu_driver-hugepage_path = mempath;
 }
 
-if (qemuProcessAutoDestroyInit(qemu_driver)  0)
-goto error;
-
 if (qemuDriverCloseCallbackInit(qemu_driver)  0)
 goto error;
 
@@ -803,7 +800,6 @@ qemudShutdown(void) {
 
 virSysinfoDefFree(qemu_driver-hostsysinfo);
 
-qemuProcessAutoDestroyShutdown(qemu_driver);
 qemuDriverCloseCallbackShutdown(qemu_driver);
 
 VIR_FREE(qemu_driver-configDir);
@@ -925,7 +921,6 @@ static int qemudClose(virConnectPtr conn) {
 qemuDriverLock(driver);
 virDomainEventStateDeregisterConn(conn,
   driver-domainEventState);
-qemuProcessAutoDestroyRun(driver, conn);
 qemuDriverCloseCallbackRunAll(driver, conn);
 qemuDriverUnlock(driver);
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1945864..8915a9a 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4120,124 +4120,65 @@ cleanup:
 }
 
 
-int qemuProcessAutoDestroyInit(struct qemud_driver *driver)
+static virDomainObjPtr
+qemuProcessAutoDestroy(struct qemud_driver *driver,
+   virDomainObjPtr dom,
+   virConnectPtr conn)
 {
-if (!(driver-autodestroy = virHashCreate(5, NULL)))
-return -1;
-
-return 0;
-}
-
-struct qemuProcessAutoDestroyData {
-struct qemud_driver *driver;
-virConnectPtr conn;
-};
-
-static void qemuProcessAutoDestroyDom(void *payload,
-  const void *name,
-  void *opaque)
-{
-struct qemuProcessAutoDestroyData *data = opaque;
-virConnectPtr conn = payload;
-const char *uuidstr = name;
-unsigned char uuid[VIR_UUID_BUFLEN];
-virDomainObjPtr dom;
-qemuDomainObjPrivatePtr priv;
+qemuDomainObjPrivatePtr priv = dom-privateData;
 virDomainEventPtr event = NULL;
 
-VIR_DEBUG(conn=%p uuidstr=%s thisconn=%p, conn, uuidstr, data-conn);
+VIR_DEBUG(vm=%s, conn=%p, dom-def-name, conn);
 
-if (data-conn != conn)
-return;
-
-if (virUUIDParse(uuidstr, uuid)  0) {
-VIR_WARN(Failed to parse %s, uuidstr);
-return;
-}
-
-if (!(dom = virDomainFindByUUID(data-driver-domains,
-uuid))) {
-VIR_DEBUG(No domain object to kill);
-return;
-}
-
-priv = dom-privateData;
 if (priv-job.asyncJob) {
 VIR_DEBUG(vm=%s has long-term job active, cancelling,
   dom-def-name);
-qemuDomainObjDiscardAsyncJob(data-driver, dom);
+qemuDomainObjDiscardAsyncJob(driver, dom);
 }
 
-if (qemuDomainObjBeginJobWithDriver(data-driver, dom,
+if (qemuDomainObjBeginJobWithDriver(driver, dom,
 QEMU_JOB_DESTROY)  0)
 goto cleanup;
 
 VIR_DEBUG(Killing domain);
-qemuProcessStop(data-driver, dom, 1, VIR_DOMAIN_SHUTOFF_DESTROYED);
+qemuProcessStop(driver, dom, 1, VIR_DOMAIN_SHUTOFF_DESTROYED);
 virDomainAuditStop(dom, destroyed);
 event = virDomainEventNewFromObj(dom,
  VIR_DOMAIN_EVENT_STOPPED,
  VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
-if (qemuDomainObjEndJob(data-driver, dom) == 0)
+
+if (qemuDomainObjEndJob(driver, dom) == 0)
 dom = NULL;
 if (dom  !dom-persistent)
-qemuDomainRemoveInactive(data-driver, dom);
-
-cleanup:
-if (dom)
-virDomainObjUnlock(dom);
+qemuDomainRemoveInactive(driver, dom);
 if (event)
-qemuDomainEventQueue(data-driver, event);
-virHashRemoveEntry(data-driver-autodestroy, uuidstr);
-}
-
-/*
- * Precondition: driver is locked
- */
-void qemuProcessAutoDestroyRun(struct qemud_driver *driver, virConnectPtr conn)
-{
-struct qemuProcessAutoDestroyData data = {
-driver, conn
-};
-VIR_DEBUG(conn=%p, conn);
-virHashForEach(driver-autodestroy,