From ce67726c6d3db6e7db537e76da6217c5d5f4b10e Mon Sep 17 00:00:00 2001 From: Wido den Hollander Date: Sat, 10 Feb 2018 18:27:00 +0100 Subject: [PATCH] CLOUDSTACK-10243: Do not use wait() on Python subprocess (#2421) This might (and does block) in certain situations on the VR as also explained in the Python documentation: https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that. Using the check_output function handles most of this for us and also provides better error handling. Signed-off-by: Wido den Hollander --- systemvm/debian/opt/cloud/bin/cs/CsHelper.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/systemvm/debian/opt/cloud/bin/cs/CsHelper.py b/systemvm/debian/opt/cloud/bin/cs/CsHelper.py index 5397038fd1e..241643d9956 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsHelper.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsHelper.py @@ -183,13 +183,19 @@ def get_hostname(): def execute(command): """ Execute command """ - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - p.wait() - rc = p.returncode + returncode = -1 + try: + logging.info("Executing: %s" % command) + result = subprocess.check_output(command, shell=True) + returncode = 0 + return result.splitlines() + except subprocess.CalledProcessError as e: + logging.error(e) + returncode = e.returncode + finally: + logging.debug("Executed: %s - exitstatus=%s " % (command, returncode)) - logging.debug("Executed: %s - exitstatus=%s " % (command, rc)) - result = p.communicate()[0] - return result.splitlines() + return list() def save_iptables(command, iptables_file):