From ee4aa4f1d29c6fb4f415577efcc7e14fe029b0ad Mon Sep 17 00:00:00 2001 From: Saurabh Singh Date: Thu, 29 Mar 2018 18:52:27 -0700 Subject: [PATCH] Remove long running option from MARS (#28627) --- .../src/System/Data/SqlClient/SNI/SNIHandle.cs | 2 +- .../Data/SqlClient/SNI/SNIMarsConnection.cs | 2 +- .../System/Data/SqlClient/SNI/SNIMarsHandle.cs | 2 +- .../System/Data/SqlClient/SNI/SNINpHandle.cs | 4 ++-- .../src/System/Data/SqlClient/SNI/SNIPacket.cs | 17 ++++------------- .../src/System/Data/SqlClient/SNI/SNIProxy.cs | 2 +- .../System/Data/SqlClient/SNI/SNITcpHandle.cs | 4 ++-- .../SqlClient/TdsParserStateObjectManaged.cs | 2 +- 8 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIHandle.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIHandle.cs index f9d92c82216c..b38cb2411667 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIHandle.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIHandle.cs @@ -56,7 +56,7 @@ internal abstract class SNIHandle /// /// SNI packet /// SNI error code - public abstract uint ReceiveAsync(ref SNIPacket packet, bool isMars = false); + public abstract uint ReceiveAsync(ref SNIPacket packet); /// /// Enable SSL diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsConnection.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsConnection.cs index e39b84735a68..a98dedfbc8ee 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsConnection.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsConnection.cs @@ -108,7 +108,7 @@ public uint ReceiveAsync(ref SNIPacket packet) { lock (this) { - return _lowerHandle.ReceiveAsync(ref packet, isMars: true); + return _lowerHandle.ReceiveAsync(ref packet); } } diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsHandle.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsHandle.cs index 1aa5f270fb55..4d079f6ad0bb 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsHandle.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIMarsHandle.cs @@ -272,7 +272,7 @@ public override uint SendAsync(SNIPacket packet, bool disposePacketAfterSendAsyn /// /// SNI packet /// SNI error code - public override uint ReceiveAsync(ref SNIPacket packet, bool isMars = true) + public override uint ReceiveAsync(ref SNIPacket packet) { lock (_receivedPacketQueue) { diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNINpHandle.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNINpHandle.cs index 0e976020d0f3..67581e8d32c4 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNINpHandle.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNINpHandle.cs @@ -172,13 +172,13 @@ public override uint Receive(out SNIPacket packet, int timeout) } } - public override uint ReceiveAsync(ref SNIPacket packet, bool isMars = false) + public override uint ReceiveAsync(ref SNIPacket packet) { packet = new SNIPacket(_bufferSize); try { - packet.ReadFromStreamAsync(_stream, _receiveCallback, isMars); + packet.ReadFromStreamAsync(_stream, _receiveCallback); return TdsEnums.SNI_SUCCESS_IO_PENDING; } catch (ObjectDisposedException ode) diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIPacket.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIPacket.cs index f34bbf6bef5f..84a47740fabf 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIPacket.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIPacket.cs @@ -245,22 +245,13 @@ public void Reset() /// /// Stream to read from /// Completion callback - public void ReadFromStreamAsync(Stream stream, SNIAsyncCallback callback, bool isMars) + public void ReadFromStreamAsync(Stream stream, SNIAsyncCallback callback) { bool error = false; - TaskContinuationOptions options = TaskContinuationOptions.DenyChildAttach; - // MARS operations during Sync ADO.Net API calls are Sync over Async. Each API call can request - // threads to execute the async reads. MARS operations do not get the threads quickly enough leading to timeout - // To fix the MARS thread exhaustion issue LongRunning continuation option is a temporary solution with its own drawbacks, - // and should be removed after evaluating how to fix MARS threading issues efficiently - if (isMars) - { - options |= TaskContinuationOptions.LongRunning; - } - + stream.ReadAsync(_data, 0, _capacity, CancellationToken.None).ContinueWith(t => { - Exception e = t.Exception != null ? t.Exception.InnerException : null; + Exception e = t.Exception?.InnerException; if (e != null) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, SNICommon.InternalExceptionError, e); @@ -285,7 +276,7 @@ public void ReadFromStreamAsync(Stream stream, SNIAsyncCallback callback, bool i callback(this, error ? TdsEnums.SNI_ERROR : TdsEnums.SNI_SUCCESS); }, CancellationToken.None, - options, + TaskContinuationOptions.DenyChildAttach, TaskScheduler.Default); } diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIProxy.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIProxy.cs index 248e84a13d71..e0cd0a3dec4a 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIProxy.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNIProxy.cs @@ -443,7 +443,7 @@ private SNINpHandle CreateNpHandle(DataSource details, long timerExpire, object /// SNI handle /// Packet /// SNI error status - public uint ReadAsync(SNIHandle handle, out SNIPacket packet, bool isMars = false) + public uint ReadAsync(SNIHandle handle, out SNIPacket packet) { packet = null; return handle.ReceiveAsync(ref packet); diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNITcpHandle.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNITcpHandle.cs index 9b0f12fb3ec2..448a48a9343c 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNITcpHandle.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNITcpHandle.cs @@ -537,13 +537,13 @@ public override uint SendAsync(SNIPacket packet, bool disposePacketAfterSendAsyn /// /// SNI packet /// SNI error code - public override uint ReceiveAsync(ref SNIPacket packet, bool isMars = false) + public override uint ReceiveAsync(ref SNIPacket packet) { packet = new SNIPacket(_bufferSize); try { - packet.ReadFromStreamAsync(_stream, _receiveCallback, isMars); + packet.ReadFromStreamAsync(_stream, _receiveCallback); return TdsEnums.SNI_SUCCESS_IO_PENDING; } catch (Exception e) when (e is ObjectDisposedException || e is SocketException || e is IOException) diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserStateObjectManaged.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserStateObjectManaged.cs index e6f9f0668e97..02c660263312 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserStateObjectManaged.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserStateObjectManaged.cs @@ -156,7 +156,7 @@ internal override uint CheckConnection() internal override object ReadAsync(out uint error, ref object handle) { SNIPacket packet; - error = SNIProxy.Singleton.ReadAsync((SNIHandle)handle, out packet, isMars: _parser.MARSOn); + error = SNIProxy.Singleton.ReadAsync((SNIHandle)handle, out packet); return packet; }