[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] device-dm: Use SIGHUP before SIGKILL



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1202813869 0
# Node ID bd09d9692bda873687662c321c426169db164eed
# Parent  c3fd43049492d039302a7285579e1acf08c60f73
device-dm: Use SIGHUP before SIGKILL

Make qemu unblock SIGHUP and make sure the default handler is in
place. Have the domain killer send SIGHUP to the device-model script,
allow the script 10s to clean up, and if still not dead, send
SIGKILL.

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
 tools/ioemu/vl.c               |    6 ++++--
 tools/python/xen/xend/image.py |   17 ++++++++++++++---
 2 files changed, 18 insertions(+), 5 deletions(-)

diff -r c3fd43049492 -r bd09d9692bda tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Tue Feb 12 10:19:12 2008 +0000
+++ b/tools/ioemu/vl.c  Tue Feb 12 10:57:49 2008 +0000
@@ -7928,11 +7928,13 @@ int main(int argc, char **argv)
     }
 #endif
 
-    /* Unblock SIGTERM, which may have been blocked by the caller */
+    /* Unblock SIGTERM and SIGHUP, which may have been blocked by the caller */
+    signal(SIGHUP, SIG_DFL);
     sigemptyset(&set);
     sigaddset(&set, SIGTERM);
+    sigaddset(&set, SIGHUP);
     if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
-        fprintf(stderr, "Failed to unblock SIGTERM\n");
+        fprintf(stderr, "Failed to unblock SIGTERM and SIGHUP\n");
 
     main_loop();
     quit_timers();
diff -r c3fd43049492 -r bd09d9692bda tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Tue Feb 12 10:19:12 2008 +0000
+++ b/tools/python/xen/xend/image.py    Tue Feb 12 10:57:49 2008 +0000
@@ -335,16 +335,27 @@ class ImageHandler:
             return
         if self.pid:
             try:
-                os.kill(self.pid, signal.SIGKILL)
+                os.kill(self.pid, signal.SIGHUP)
             except OSError, exn:
                 log.exception(exn)
             try:
-                os.waitpid(self.pid, 0)
+                # Try to reap the child every 100ms for 10s. Then SIGKILL it.
+                for i in xrange(100):
+                    (p, rv) = os.waitpid(self.pid, os.WNOHANG)
+                    if p == self.pid:
+                        break
+                    time.sleep(0.1)
+                else:
+                    log.warning("DeviceModel %d took more than 10s "
+                                "to terminate: sending SIGKILL" % self.pid)
+                    os.kill(self.pid, signal.SIGKILL)
+                    os.waitpid(self.pid, 0)
             except OSError, exn:
                 # This is expected if Xend has been restarted within the
                 # life of this domain.  In this case, we can kill the process,
                 # but we can't wait for it because it's not our child.
-                pass
+                # We just make really sure it's going away (SIGKILL) first.
+                os.kill(self.pid, signal.SIGKILL)
             self.pid = None
             state = xstransact.Remove("/local/domain/0/device-model/%i"
                                       % self.vm.getDomid())

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.