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:
shand@ubuntu.eng.hq.xensource.com committed 2005-08-28 21:40:36 -08:00
1 parent dc5fbb4fa2
commit 1f1e576a4a
3 files changed
+21 -22

No files matched your search

+4 -3
View File
@@ -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)
+16 -16
View File
@@ -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):
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.