diff --git a/docker/transport/npipesocket.py b/docker/transport/npipesocket.py index 527f0abbf0..48a9f92fd2 100644 --- a/docker/transport/npipesocket.py +++ b/docker/transport/npipesocket.py @@ -5,9 +5,11 @@ import win32file import win32pipe +cERROR_PIPE_BUSY = 0xe7 cSECURITY_SQOS_PRESENT = 0x100000 cSECURITY_ANONYMOUS = 0 -cPIPE_READMODE_MESSAGE = 2 + +RETRY_WAIT_TIMEOUT = 10000 def check_closed(f): @@ -45,15 +47,27 @@ def close(self): @check_closed def connect(self, address): win32pipe.WaitNamedPipe(address, self._timeout) - handle = win32file.CreateFile( - address, - win32file.GENERIC_READ | win32file.GENERIC_WRITE, - 0, - None, - win32file.OPEN_EXISTING, - cSECURITY_ANONYMOUS | cSECURITY_SQOS_PRESENT, - 0 - ) + try: + handle = win32file.CreateFile( + address, + win32file.GENERIC_READ | win32file.GENERIC_WRITE, + 0, + None, + win32file.OPEN_EXISTING, + cSECURITY_ANONYMOUS | cSECURITY_SQOS_PRESENT, + 0 + ) + except win32pipe.error as e: + # See Remarks: + # https://msdn.microsoft.com/en-us/library/aa365800.aspx + if e.winerror == cERROR_PIPE_BUSY: + # Another program or thread has grabbed our pipe instance + # before we got to it. Wait for availability and attempt to + # connect again. + win32pipe.WaitNamedPipe(address, RETRY_WAIT_TIMEOUT) + return self.connect(address) + raise e + self.flags = win32pipe.GetNamedPipeInfo(handle)[0] self._handle = handle diff --git a/docker/version.py b/docker/version.py index 12eb03b3aa..6551711f2d 100644 --- a/docker/version.py +++ b/docker/version.py @@ -1,2 +1,2 @@ -version = "1.10.4" +version = "1.10.5" version_info = tuple([int(d) for d in version.split("-")[0].split(".")]) diff --git a/docs/change_log.md b/docs/change_log.md index de6303746c..a6f4e501a0 100644 --- a/docs/change_log.md +++ b/docs/change_log.md @@ -1,6 +1,17 @@ Change Log ========== +1.10.5 +------ + +[List of PRs / issues for this release](https://github.com/docker/docker-py/milestone/24?closed=1) + +### Bugfixes + +* Fixed an issue where concurrent attempts to access to a named pipe by the + client would sometimes cause recoverable exceptions to be raised. + + 1.10.4 ------