src/modules/depotcontroller.py
changeset 1505 cc598d70bbbe
parent 1475 a667a9efcae9
child 1513 3ece69a26155
--- a/src/modules/depotcontroller.py	Tue Nov 17 17:06:35 2009 -0600
+++ b/src/modules/depotcontroller.py	Wed Nov 18 15:53:48 2009 -0800
@@ -30,6 +30,7 @@
 import urllib2
 import httplib
 import pkg.pkgsubprocess as subprocess
+
 from pkg.misc import versioned_urlopen
 
 class DepotStateException(Exception):
@@ -63,6 +64,7 @@
                 self.__state = self.HALTED
                 self.__writable_root = None
                 self.__sort_file_max_size = None
+                self.__starttime = 0
                 return
 
         def set_depotd_path(self, path):
@@ -267,6 +269,7 @@
                     close_fds=True)
                 if self.__depot_handle == None:
                         raise DepotStateException("Could not start Depot")
+                self.__starttime = time.time()
                 
         def start(self):
                 self.__initial_start()
@@ -329,6 +332,12 @@
                 return self.__depot_handle.poll()
 
         def kill(self):
+                """kill the depot; letting it live for
+                a little while helps get reliable death"""
+
+                lifetime = time.time() - self.__starttime 
+                if lifetime < 1.0:
+                        time.sleep(1.0 - lifetime)
 
                 if self.__depot_handle == None:
                         # XXX might want to remember and return saved
@@ -336,14 +345,12 @@
                         return 0
 
                 status = -1
-                #
-                # With sleeptime doubling every loop iter, and capped at
-                # 10.0 secs, the cumulative time waited will be 10 secs.
-                #
+
+                wait_to_exit = 5.0
                 sleeptime = 0.05
                 firsttime = True
 
-                while sleeptime <= 10.0:
+                while wait_to_exit > 0:
                         status = self.__depot_handle.poll()
                         if status is not None:
                                 break
@@ -358,6 +365,7 @@
                                 firsttime = False
 
                         time.sleep(sleeptime)
+                        wait_to_exit -= sleeptime
                         sleeptime *= 2
                 else:
                         assert status is None
@@ -365,7 +373,8 @@
                             "Depot did not shut down, trying kill -9 %d" % \
                             self.__depot_handle.pid
                         os.kill(self.__depot_handle.pid, signal.SIGKILL)
-                        status = self.__depot_handle.wait()
+                        #self.__depot_handle.wait()
+                        status = self.__depot_handle.poll()
 
                 # XXX do something useful with status
                 self.__state = self.HALTED