diff options
author | Sascha Silbe <silbe@linux.vnet.ibm.com> | 2016-09-06 22:05:44 +0200 |
---|---|---|
committer | Fam Zheng <famz@redhat.com> | 2016-09-08 19:56:34 +0800 |
commit | c977257045fdb90f98b92b9e08daa8ace378650b (patch) | |
tree | ebb40f6a6f3caf62d2cd27e511ac6f743c909652 | |
parent | 9af4c174a38c345e36f8320f8bb7de64661bb18a (diff) | |
download | qemu-c977257045fdb90f98b92b9e08daa8ace378650b.zip qemu-c977257045fdb90f98b92b9e08daa8ace378650b.tar.gz qemu-c977257045fdb90f98b92b9e08daa8ace378650b.tar.bz2 |
docker.py: don't hang on large docker output
Unlike Popen.communicate(), subprocess.call() doesn't read from the
stdout file descriptor. If the child process produces more output than
fits into the pipe buffer, it will block indefinitely.
If we don't intend to consume the output, just send it straight to
/dev/null to avoid this issue.
Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Message-Id: <1473192351-601-2-git-send-email-silbe@linux.vnet.ibm.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
-rwxr-xr-x | tests/docker/docker.py | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/tests/docker/docker.py b/tests/docker/docker.py index 222a105..efb2bf4 100755 --- a/tests/docker/docker.py +++ b/tests/docker/docker.py @@ -25,6 +25,10 @@ from tarfile import TarFile, TarInfo from StringIO import StringIO from shutil import copy, rmtree + +DEVNULL = open(os.devnull, 'wb') + + def _text_checksum(text): """Calculate a digest string unique to the text content""" return hashlib.sha1(text).hexdigest() @@ -34,8 +38,7 @@ def _guess_docker_command(): commands = [["docker"], ["sudo", "-n", "docker"]] for cmd in commands: if subprocess.call(cmd + ["images"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) == 0: + stdout=DEVNULL, stderr=DEVNULL) == 0: return cmd commands_txt = "\n".join([" " + " ".join(x) for x in commands]) raise Exception("Cannot find working docker command. Tried:\n%s" % \ @@ -98,7 +101,7 @@ class Docker(object): def _do(self, cmd, quiet=True, infile=None, **kwargs): if quiet: - kwargs["stdout"] = subprocess.PIPE + kwargs["stdout"] = DEVNULL if infile: kwargs["stdin"] = infile return subprocess.call(self._command + cmd, **kwargs) |