From cb3437927052da65d2007897d2eeea80e0b9f477 Mon Sep 17 00:00:00 2001 From: Sergey Stronchinskiy Date: Mon, 15 Oct 2018 22:56:38 +0300 Subject: [PATCH 1/2] switch NamedPipeClientStream to PipeOptions.Asynchronous --- src/Docker.DotNet/DockerClient.cs | 6 +++++- .../Microsoft.Net.Http.Client/BufferedReadStream.cs | 1 + test/Docker.DotNet.Tests/ISystemOperations.Tests.cs | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Docker.DotNet/DockerClient.cs b/src/Docker.DotNet/DockerClient.cs index c685a6909..e00e6e27d 100644 --- a/src/Docker.DotNet/DockerClient.cs +++ b/src/Docker.DotNet/DockerClient.cs @@ -75,7 +75,11 @@ internal DockerClient(DockerClientConfiguration configuration, Version requested // NamedPipeClientStream handles file not found by polling until the server arrives. Use a short // timeout so that the user doesn't get stuck waiting for a dockerd instance that is not running. var timeout = 100; // 100ms - var stream = new NamedPipeClientStream(serverName, pipeName); + var stream = new NamedPipeClientStream( + serverName, + pipeName, + PipeDirection.InOut, + PipeOptions.Asynchronous); var dockerStream = new DockerPipeStream(stream); #if NET45 diff --git a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs index 0ebc0c053..44ef611c8 100644 --- a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs +++ b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs @@ -162,6 +162,7 @@ private async Task EnsureBufferedAsync(CancellationToken cancel) _bufferCount = await _inner.ReadAsync(_buffer, _bufferOffset, _buffer.Length, cancel).ConfigureAwait(false); if (_bufferCount == 0) { + ThrowIfDisposed(); throw new IOException("Unexpected end of stream"); } } diff --git a/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs b/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs index ac5a73372..6562c3801 100644 --- a/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs +++ b/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs @@ -90,6 +90,17 @@ public async Task MonitorEventsAsync_Succeeds() await _client.Images.DeleteImageAsync($"{repository}:{tag}", new ImageDeleteParameters()); } + [Fact] + public async Task MonitorEventsAsync_EmptyContainersList_CanBeCancelled() + { + var cts = new CancellationTokenSource(); + cts.CancelAfter(1000); + + var task = _client.System.MonitorEventsAsync(new ContainerEventsParameters(), new Progress(), cts.Token); + + await task; + } + class Progress : IProgress { internal Action _onCalled; From 09fd0598241827abe715f9e4c37e55d9841f011d Mon Sep 17 00:00:00 2001 From: Sergey Stronchinskiy Date: Mon, 15 Oct 2018 23:00:54 +0300 Subject: [PATCH 2/2] small refactoring --- .../Microsoft.Net.Http.Client/BufferedReadStream.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs index 44ef611c8..729712a3c 100644 --- a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs +++ b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs @@ -160,9 +160,11 @@ private async Task EnsureBufferedAsync(CancellationToken cancel) { _bufferOffset = 0; _bufferCount = await _inner.ReadAsync(_buffer, _bufferOffset, _buffer.Length, cancel).ConfigureAwait(false); + + ThrowIfDisposed(); + if (_bufferCount == 0) { - ThrowIfDisposed(); throw new IOException("Unexpected end of stream"); } }