|
@@ -48,7 +48,7 @@ class ProcessServer(multiprocessing.Process):
|
|
|
|
|
|
self.event_handle = None
|
|
|
self.haveui = False
|
|
|
- self.lastui = False
|
|
|
+ self.maxuiwait = 30
|
|
|
self.xmlrpc = False
|
|
|
|
|
|
self._idlefuns = {}
|
|
@@ -155,6 +155,7 @@ class ProcessServer(multiprocessing.Process):
|
|
|
print("No timeout, exiting.")
|
|
|
self.quit = True
|
|
|
|
|
|
+ self.lastui = time.time()
|
|
|
while not self.quit:
|
|
|
if self.sock in ready:
|
|
|
while select.select([self.sock],[],[],0)[0]:
|
|
@@ -191,11 +192,18 @@ class ProcessServer(multiprocessing.Process):
|
|
|
except (EOFError, OSError):
|
|
|
disconnect_client(self, fds)
|
|
|
|
|
|
- if not self.timeout == -1.0 and not self.haveui and self.lastui and self.timeout and \
|
|
|
+ if not self.timeout == -1.0 and not self.haveui and self.timeout and \
|
|
|
(self.lastui + self.timeout) < time.time():
|
|
|
print("Server timeout, exiting.")
|
|
|
self.quit = True
|
|
|
|
|
|
+ # If we don't see a UI connection within maxuiwait, its unlikely we're going to see
|
|
|
+ # one. We have had issue with processes hanging indefinitely so timing out UI-less
|
|
|
+ # servers is useful.
|
|
|
+ if not self.haveui and not self.timeout and (self.lastui + self.maxuiwait) < time.time():
|
|
|
+ print("No UI connection within max timeout, exiting to avoid infinite loop.")
|
|
|
+ self.quit = True
|
|
|
+
|
|
|
if self.command_channel in ready:
|
|
|
try:
|
|
|
command = self.command_channel.get()
|
|
@@ -220,10 +228,13 @@ class ProcessServer(multiprocessing.Process):
|
|
|
|
|
|
print("Exiting")
|
|
|
# Remove the socket file so we don't get any more connections to avoid races
|
|
|
- os.unlink(self.sockname)
|
|
|
+ try:
|
|
|
+ os.unlink(self.sockname)
|
|
|
+ except:
|
|
|
+ pass
|
|
|
self.sock.close()
|
|
|
|
|
|
- try:
|
|
|
+ try:
|
|
|
self.cooker.shutdown(True)
|
|
|
self.cooker.notifier.stop()
|
|
|
self.cooker.confignotifier.stop()
|