mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Fix nasty tools race between barking xu_autoreap() and xpopen3.wait() -
save/restore now seems more robust from a tools pov at least. Signed-off-by: Steven Hand <steven@xensource.com>
This commit is contained in:
1 parent
dc5fbb4fa2
commit
1f1e576a4a
3 files changed
+21
-22
No files matched your search
@@ -51,7 +51,7 @@ def save(xd, fd, dominfo):
|
||||
p = select.poll()
|
||||
p.register(child.fromchild.fileno())
|
||||
p.register(child.childerr.fileno())
|
||||
while True:
|
||||
while True:
|
||||
r = p.poll()
|
||||
for (fd, event) in r:
|
||||
if not event & select.POLLIN:
|
||||
@@ -69,8 +69,9 @@ def save(xd, fd, dominfo):
|
||||
try:
|
||||
dominfo.db.releaseDomain(dominfo.id)
|
||||
except Exception, ex:
|
||||
log.warning("error in domain release on xenstore: %s",
|
||||
ex)
|
||||
log.warning(
|
||||
"error in domain release on xenstore: %s",
|
||||
ex)
|
||||
pass
|
||||
dominfo.state_wait("suspended")
|
||||
log.info("suspend %d done" % dominfo.id)
|
||||
|
||||
@@ -42,7 +42,8 @@ class Daemon:
|
||||
self.traceon = 0
|
||||
self.tracefile = None
|
||||
self.traceindent = 0
|
||||
|
||||
self.child = 0
|
||||
|
||||
def daemon_pids(self):
|
||||
pids = []
|
||||
pidex = '(?P<pid>\d+)'
|
||||
@@ -140,15 +141,12 @@ class Daemon:
|
||||
else:
|
||||
return 0
|
||||
|
||||
def install_child_reaper(self):
|
||||
#signal.signal(signal.SIGCHLD, self.onSIGCHLD)
|
||||
# Ensure that zombie children are automatically reaped.
|
||||
xu.autoreap()
|
||||
|
||||
def onSIGCHLD(self, signum, frame):
|
||||
code = 1
|
||||
while code > 0:
|
||||
code = os.waitpid(-1, os.WNOHANG)
|
||||
if self.child > 0:
|
||||
try:
|
||||
pid, sts = os.waitpid(self.child, os.WNOHANG)
|
||||
except os.error, ex:
|
||||
pass
|
||||
|
||||
def fork_pid(self, pidfile):
|
||||
"""Fork and write the pid of the child to 'pidfile'.
|
||||
@@ -156,13 +154,16 @@ class Daemon:
|
||||
@param pidfile: pid file
|
||||
@return: pid of child in parent, 0 in child
|
||||
"""
|
||||
pid = os.fork()
|
||||
if pid:
|
||||
|
||||
self.child = os.fork()
|
||||
|
||||
if self.child:
|
||||
# Parent
|
||||
pidfile = open(pidfile, 'w')
|
||||
pidfile.write(str(pid))
|
||||
pidfile.write(str(self.child))
|
||||
pidfile.close()
|
||||
return pid
|
||||
|
||||
return self.child
|
||||
|
||||
def daemonize(self):
|
||||
if not XEND_DAEMONIZE: return
|
||||
@@ -203,8 +204,7 @@ class Daemon:
|
||||
# Trying to run an already-running service is a success.
|
||||
return 0
|
||||
|
||||
self.install_child_reaper()
|
||||
|
||||
signal.signal(signal.SIGCHLD, self.onSIGCHLD)
|
||||
if self.fork_pid(XEND_PID_FILE):
|
||||
#Parent. Sleep to give child time to start.
|
||||
time.sleep(1)
|
||||
@@ -309,7 +309,7 @@ class Daemon:
|
||||
print >>sys.stderr, 'Exception starting xend:', ex
|
||||
if XEND_DEBUG:
|
||||
traceback.print_exc()
|
||||
log.exception("Exception starting xend")
|
||||
log.exception("Exception starting xend (%s)" % ex)
|
||||
self.exit(1)
|
||||
|
||||
def createFactories(self):
|
||||
|
||||