summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/transport/npipesocket.py34
-rw-r--r--docker/version.py2
-rw-r--r--docs/change_log.md11
3 files changed, 36 insertions, 11 deletions
diff --git a/docker/transport/npipesocket.py b/docker/transport/npipesocket.py
index 527f0ab..48a9f92 100644
--- a/docker/transport/npipesocket.py
+++ b/docker/transport/npipesocket.py
@@ -5,9 +5,11 @@ import six
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 @@ class NpipeSocket(object):
@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 12eb03b..6551711 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 de63037..a6f4e50 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
------