Hello Dan Kenigsberg,
I'd like you to do a code review. Please visit
https://gerrit.ovirt.org/39780
to review the following change.
Change subject: supervdsm: Add zombiereaper to supervdsm
......................................................................
supervdsm: Add zombiereaper to supervdsm
Supervdsm uses multiprocessing.Process to impersonate other users and
check access. To avoid waiting on the subprocesses, we add all
subprocesses that were not waited upon to zombiereaper.
Change-Id: I938a1f2bc70fceab2c69bc8b3d8c0724a9da7720
Bug-url:
https://bugzilla.redhat.com/show_bug.cgi?id=841486
Signed-off-by: Dima Kuznetsov <dkuznets(a)redhat.com>
Reviewed-on:
http://gerrit.ovirt.org/28915
Reviewed-by: Dan Kenigsberg <danken(a)redhat.com>
Signed-off-by: Dima Kuznetsov <dkuznets(a)redhat.com>
---
M vdsm/supervdsmServer
1 file changed, 27 insertions(+), 14 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/80/39780/1
diff --git a/vdsm/supervdsmServer b/vdsm/supervdsmServer
index 3cdbf71..b8b6ff7 100755
--- a/vdsm/supervdsmServer
+++ b/vdsm/supervdsmServer
@@ -32,6 +32,7 @@
import logging
import logging.config
from vdsm.infra import sigutils
+from vdsm.infra import zombiereaper
import numaUtils
@@ -236,23 +237,34 @@
proc = Process(target=child, args=(hisPipe,))
proc.start()
- if not pipe.poll(RUN_AS_TIMEOUT):
- try:
- os.kill(proc.pid, signal.SIGKILL)
- except OSError as e:
- # If it didn't fail because process is already dead
- if e.errno != errno.ESRCH:
- raise
+ needReaping = True
+ try:
+ if not pipe.poll(RUN_AS_TIMEOUT):
+ try:
- raise Timeout()
+ os.kill(proc.pid, signal.SIGKILL)
+ except OSError as e:
+ # Don't add to zombiereaper of PID no longer exists
+ if e.errno == errno.ESRCH:
+ needReaping = False
+ else:
+ raise
- res, err = pipe.recv()
- pipe.send("Bye")
- proc.terminate()
- if err is not None:
- raise err
+ raise Timeout()
- return res
+ res, err = pipe.recv()
+ pipe.send("Bye")
+ proc.terminate()
+
+ if err is not None:
+ raise err
+
+ return res
+
+ finally:
+ # Add to zombiereaper if process has not been waited upon
+ if proc.exitcode is None and needReaping:
+ zombiereaper.autoReapPID(proc.pid)
@logDecorator
def validateAccess(self, user, groups, *args, **kwargs):
@@ -465,6 +477,7 @@
if not config.getboolean('vars', 'core_dump_enable'):
resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
sigutils.register()
+ zombiereaper.registerSignalHandler()
def bind(func):
def wrapper(_SuperVdsm, *args, **kwargs):
--
To view, visit
https://gerrit.ovirt.org/39780
To unsubscribe, visit
https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I938a1f2bc70fceab2c69bc8b3d8c0724a9da7720
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Dima Kuznetsov <dkuznets(a)redhat.com>
Gerrit-Reviewer: Dan Kenigsberg <danken(a)redhat.com>