mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
9af4c174a3
commit
c977257045
|
@ -25,6 +25,10 @@ from tarfile import TarFile, TarInfo
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from shutil import copy, rmtree
|
from shutil import copy, rmtree
|
||||||
|
|
||||||
|
|
||||||
|
DEVNULL = open(os.devnull, 'wb')
|
||||||
|
|
||||||
|
|
||||||
def _text_checksum(text):
|
def _text_checksum(text):
|
||||||
"""Calculate a digest string unique to the text content"""
|
"""Calculate a digest string unique to the text content"""
|
||||||
return hashlib.sha1(text).hexdigest()
|
return hashlib.sha1(text).hexdigest()
|
||||||
|
@ -34,8 +38,7 @@ def _guess_docker_command():
|
||||||
commands = [["docker"], ["sudo", "-n", "docker"]]
|
commands = [["docker"], ["sudo", "-n", "docker"]]
|
||||||
for cmd in commands:
|
for cmd in commands:
|
||||||
if subprocess.call(cmd + ["images"],
|
if subprocess.call(cmd + ["images"],
|
||||||
stdout=subprocess.PIPE,
|
stdout=DEVNULL, stderr=DEVNULL) == 0:
|
||||||
stderr=subprocess.PIPE) == 0:
|
|
||||||
return cmd
|
return cmd
|
||||||
commands_txt = "\n".join([" " + " ".join(x) for x in commands])
|
commands_txt = "\n".join([" " + " ".join(x) for x in commands])
|
||||||
raise Exception("Cannot find working docker command. Tried:\n%s" % \
|
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):
|
def _do(self, cmd, quiet=True, infile=None, **kwargs):
|
||||||
if quiet:
|
if quiet:
|
||||||
kwargs["stdout"] = subprocess.PIPE
|
kwargs["stdout"] = DEVNULL
|
||||||
if infile:
|
if infile:
|
||||||
kwargs["stdin"] = infile
|
kwargs["stdin"] = infile
|
||||||
return subprocess.call(self._command + cmd, **kwargs)
|
return subprocess.call(self._command + cmd, **kwargs)
|
||||||
|
|
Loading…
Reference in New Issue