From b23d9b7679abfed829a820804de12b557feb06bc Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 1 May 2018 12:01:24 -0700 Subject: [PATCH] Decouple connection objects from the server (#2535) - Making progress towards being able to use the connection objects on the client side. --- .../Internal/LibuvConnection.cs | 18 +++++++------- .../Internal/LibuvConnectionContext.cs | 24 ------------------- .../Internal/Listener.cs | 7 ++++-- .../Internal/ListenerSecondary.cs | 5 +++- .../Internal/SocketConnection.cs | 4 +--- .../SocketTransport.cs | 5 +++- .../LibuvConnectionTests.cs | 12 ++++++---- 7 files changed, 32 insertions(+), 43 deletions(-) delete mode 100644 src/Kestrel.Transport.Libuv/Internal/LibuvConnectionContext.cs diff --git a/src/Kestrel.Transport.Libuv/Internal/LibuvConnection.cs b/src/Kestrel.Transport.Libuv/Internal/LibuvConnection.cs index 21e3a6805e..52c0fc6d03 100644 --- a/src/Kestrel.Transport.Libuv/Internal/LibuvConnection.cs +++ b/src/Kestrel.Transport.Libuv/Internal/LibuvConnection.cs @@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal { - public partial class LibuvConnection : LibuvConnectionContext + public partial class LibuvConnection : TransportConnection { private static readonly int MinAllocBufferSize = KestrelMemoryPool.MinimumSegmentSize / 2; @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal private MemoryHandle _bufferHandle; - public LibuvConnection(ListenerContext context, UvStreamHandle socket) : base(context) + public LibuvConnection(UvStreamHandle socket, ILibuvTrace log, LibuvThread thread) { _socket = socket; @@ -43,20 +43,22 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal LocalAddress = localEndPoint.Address; LocalPort = localEndPoint.Port; } + + Log = log; + Thread = thread; } public LibuvOutputConsumer OutputConsumer { get; set; } - - private ILibuvTrace Log => ListenerContext.TransportContext.Log; - private IConnectionDispatcher ConnectionDispatcher => ListenerContext.TransportContext.ConnectionDispatcher; - private LibuvThread Thread => ListenerContext.Thread; + private ILibuvTrace Log { get; } + private LibuvThread Thread { get; } + public override MemoryPool MemoryPool => Thread.MemoryPool; + public override PipeScheduler InputWriterScheduler => Thread; + public override PipeScheduler OutputReaderScheduler => Thread; public async Task Start() { try { - ConnectionDispatcher.OnConnection(this); - OutputConsumer = new LibuvOutputConsumer(Output, Thread, _socket, ConnectionId, Log); StartReading(); diff --git a/src/Kestrel.Transport.Libuv/Internal/LibuvConnectionContext.cs b/src/Kestrel.Transport.Libuv/Internal/LibuvConnectionContext.cs deleted file mode 100644 index 1f2abb9f37..0000000000 --- a/src/Kestrel.Transport.Libuv/Internal/LibuvConnectionContext.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Buffers; -using System.IO.Pipelines; -using System.Threading; -using Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal; - -namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal -{ - public class LibuvConnectionContext : TransportConnection - { - public LibuvConnectionContext(ListenerContext context) - { - ListenerContext = context; - } - - public ListenerContext ListenerContext { get; set; } - - public override MemoryPool MemoryPool => ListenerContext.Thread.MemoryPool; - public override PipeScheduler InputWriterScheduler => ListenerContext.Thread; - public override PipeScheduler OutputReaderScheduler => ListenerContext.Thread; - } -} diff --git a/src/Kestrel.Transport.Libuv/Internal/Listener.cs b/src/Kestrel.Transport.Libuv/Internal/Listener.cs index 26c6fba06a..230be06dea 100644 --- a/src/Kestrel.Transport.Libuv/Internal/Listener.cs +++ b/src/Kestrel.Transport.Libuv/Internal/Listener.cs @@ -93,7 +93,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal try { pipe.Init(Thread.Loop, Thread.QueueCloseHandle, false); - + if (!useFileHandle) { pipe.Bind(EndPointInformation.SocketPath); @@ -181,7 +181,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal protected virtual void DispatchConnection(UvStreamHandle socket) { - var connection = new LibuvConnection(this, socket); + var connection = new LibuvConnection(socket, Log, Thread); + + TransportContext.ConnectionDispatcher.OnConnection(connection); + _ = connection.Start(); } diff --git a/src/Kestrel.Transport.Libuv/Internal/ListenerSecondary.cs b/src/Kestrel.Transport.Libuv/Internal/ListenerSecondary.cs index 59615c3121..63348046ac 100644 --- a/src/Kestrel.Transport.Libuv/Internal/ListenerSecondary.cs +++ b/src/Kestrel.Transport.Libuv/Internal/ListenerSecondary.cs @@ -161,7 +161,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal try { - var connection = new LibuvConnection(this, acceptSocket); + var connection = new LibuvConnection(acceptSocket, Log, Thread); + + TransportContext.ConnectionDispatcher.OnConnection(connection); + _ = connection.Start(); } catch (UvException ex) diff --git a/src/Kestrel.Transport.Sockets/Internal/SocketConnection.cs b/src/Kestrel.Transport.Sockets/Internal/SocketConnection.cs index a8b66a579c..5582da73fc 100644 --- a/src/Kestrel.Transport.Sockets/Internal/SocketConnection.cs +++ b/src/Kestrel.Transport.Sockets/Internal/SocketConnection.cs @@ -60,13 +60,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal public override PipeScheduler InputWriterScheduler => _scheduler; public override PipeScheduler OutputReaderScheduler => _scheduler; - public async Task StartAsync(IConnectionDispatcher connectionDispatcher) + public async Task StartAsync() { Exception sendError = null; try { - connectionDispatcher.OnConnection(this); - // Spawn send and receive logic Task receiveTask = DoReceive(); Task sendTask = DoSend(); diff --git a/src/Kestrel.Transport.Sockets/SocketTransport.cs b/src/Kestrel.Transport.Sockets/SocketTransport.cs index 1c17258ca4..824f05629f 100644 --- a/src/Kestrel.Transport.Sockets/SocketTransport.cs +++ b/src/Kestrel.Transport.Sockets/SocketTransport.cs @@ -157,7 +157,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets acceptSocket.NoDelay = _endPointInformation.NoDelay; var connection = new SocketConnection(acceptSocket, _memoryPool, _schedulers[schedulerIndex], _trace); - _ = connection.StartAsync(_dispatcher); + + _dispatcher.OnConnection(connection); + + _ = connection.StartAsync(); } catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionReset) { diff --git a/test/Kestrel.Transport.Libuv.Tests/LibuvConnectionTests.cs b/test/Kestrel.Transport.Libuv.Tests/LibuvConnectionTests.cs index 8f856bc508..dd29e06b11 100644 --- a/test/Kestrel.Transport.Libuv.Tests/LibuvConnectionTests.cs +++ b/test/Kestrel.Transport.Libuv.Tests/LibuvConnectionTests.cs @@ -35,7 +35,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests Thread = thread }; var socket = new MockSocket(mockLibuv, Thread.CurrentThread.ManagedThreadId, transportContext.Log); - var connection = new LibuvConnection(listenerContext, socket); + var connection = new LibuvConnection(socket, listenerContext.TransportContext.Log, thread); + listenerContext.TransportContext.ConnectionDispatcher.OnConnection(connection); connectionTask = connection.Start(); mockLibuv.AllocCallback(socket.InternalGetHandle(), 2048, out var ignored); @@ -89,7 +90,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests Thread = thread }; var socket = new MockSocket(mockLibuv, Thread.CurrentThread.ManagedThreadId, transportContext.Log); - var connection = new LibuvConnection(listenerContext, socket); + var connection = new LibuvConnection(socket, listenerContext.TransportContext.Log, thread); + listenerContext.TransportContext.ConnectionDispatcher.OnConnection(connection); connectionTask = connection.Start(); mockLibuv.AllocCallback(socket.InternalGetHandle(), 2048, out var ignored); @@ -157,7 +159,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests Thread = thread }; var socket = new MockSocket(mockLibuv, Thread.CurrentThread.ManagedThreadId, transportContext.Log); - var connection = new LibuvConnection(listenerContext, socket); + var connection = new LibuvConnection(socket, listenerContext.TransportContext.Log, thread); + listenerContext.TransportContext.ConnectionDispatcher.OnConnection(connection); connectionTask = connection.Start(); mockLibuv.AllocCallback(socket.InternalGetHandle(), 2048, out var ignored); @@ -223,7 +226,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests Thread = thread }; var socket = new MockSocket(mockLibuv, Thread.CurrentThread.ManagedThreadId, transportContext.Log); - var connection = new LibuvConnection(listenerContext, socket); + var connection = new LibuvConnection(socket, listenerContext.TransportContext.Log, thread); + listenerContext.TransportContext.ConnectionDispatcher.OnConnection(connection); connectionTask = connection.Start(); var ignored = new LibuvFunctions.uv_buf_t();