From c5a938a65ec8be1a60c4eaa45cc9768ec986e841 Mon Sep 17 00:00:00 2001 From: Davoud Date: Thu, 16 May 2024 12:45:01 -0700 Subject: [PATCH 1/2] Revert "Merged PR 4035: [5.1.2] | Fix Transient fault handling issue with OpenAsync (#1983)" This reverts commit 80d1f47be7a4f0a86d87b1d5ca1e962aa780077d. --- .../Microsoft/Data/SqlClient/SqlConnection.cs | 4 +- .../Microsoft/Data/SqlClient/SqlConnection.cs | 4 +- .../SqlConnectionBasicTests.cs | 85 +------------------ .../TDS.Servers/TransientFaultTDSServer.cs | 1 - 4 files changed, 8 insertions(+), 86 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs index 1040061b59..660b5934e0 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs @@ -1820,7 +1820,7 @@ private bool TryOpen(TaskCompletionSource retry, SqlConnec } } - _applyTransientFaultHandling = (!overrides.HasFlag(SqlConnectionOverrides.OpenWithoutRetry) && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); + _applyTransientFaultHandling = (!overrides.HasFlag(SqlConnectionOverrides.OpenWithoutRetry) && retry == null && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); if (connectionOptions != null && (connectionOptions.Authentication == SqlAuthenticationMethod.SqlPassword || @@ -1849,7 +1849,7 @@ private bool TryOpen(TaskCompletionSource retry, SqlConnec // does not require GC.KeepAlive(this) because of ReRegisterForFinalize below. // Set future transient fault handling based on connection options - _applyTransientFaultHandling = connectionOptions != null && connectionOptions.ConnectRetryCount > 0; + _applyTransientFaultHandling = (retry == null && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); var tdsInnerConnection = (SqlInternalConnectionTds)InnerConnection; diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs index 1ab55969a0..04acfcb612 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs @@ -2059,7 +2059,7 @@ private bool TryOpen(TaskCompletionSource retry, SqlConnec bool result = false; - _applyTransientFaultHandling = (!overrides.HasFlag(SqlConnectionOverrides.OpenWithoutRetry) && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); + _applyTransientFaultHandling = (!overrides.HasFlag(SqlConnectionOverrides.OpenWithoutRetry) && retry == null && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); if (connectionOptions != null && (connectionOptions.Authentication == SqlAuthenticationMethod.SqlPassword || @@ -2102,7 +2102,7 @@ private bool TryOpen(TaskCompletionSource retry, SqlConnec } // Set future transient fault handling based on connection options - _applyTransientFaultHandling = connectionOptions != null && connectionOptions.ConnectRetryCount > 0; + _applyTransientFaultHandling = (retry == null && connectionOptions != null && connectionOptions.ConnectRetryCount > 0); return result; } diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs index 2ebf172786..3046633b92 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs @@ -7,7 +7,6 @@ using System.Data.Common; using System.Reflection; using System.Security; -using System.Threading.Tasks; using Microsoft.SqlServer.TDS.Servers; using Xunit; @@ -54,26 +53,6 @@ public async Task PreLoginEncryptionExcludedTest() Assert.Contains("The instance of SQL Server you attempted to connect to does not support encryption.", ex.Message, StringComparison.OrdinalIgnoreCase); } - [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotArmProcess))] - [InlineData(40613)] - [InlineData(42108)] - [InlineData(42109)] - [PlatformSpecific(TestPlatforms.Windows)] - public async Task TransientFaultTestAsync(uint errorCode) - { - using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode); - SqlConnectionStringBuilder builder = new() - { - DataSource = "localhost," + server.Port, - IntegratedSecurity = true, - Encrypt = SqlConnectionEncryptOption.Optional - }; - - using SqlConnection connection = new(builder.ConnectionString); - await connection.OpenAsync(); - Assert.Equal(ConnectionState.Open, connection.State); - } - [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotArmProcess))] [InlineData(40613)] [InlineData(42108)] @@ -97,70 +76,14 @@ public void TransientFaultTest(uint errorCode) } catch (Exception e) { + if (null != connection) + { + Assert.Equal(ConnectionState.Closed, connection.State); + } Assert.False(true, e.Message); } } - [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotArmProcess))] - [InlineData(40613)] - [InlineData(42108)] - [InlineData(42109)] - [PlatformSpecific(TestPlatforms.Windows)] - public async Task TransientFaultDisabledTestAsync(uint errorCode) - { - using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode); - SqlConnectionStringBuilder builder = new() - { - DataSource = "localhost," + server.Port, - IntegratedSecurity = true, - ConnectRetryCount = 0, - Encrypt = SqlConnectionEncryptOption.Optional - }; - - using SqlConnection connection = new(builder.ConnectionString); - try - { - await connection.OpenAsync(); - Assert.False(true, "Connection should not have opened."); - } - catch (SqlException e) - { - // FATAL Error, should result in closed connection. - Assert.Equal(20, e.Class); - Assert.Equal(ConnectionState.Closed, connection.State); - } - } - - [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotArmProcess))] - [InlineData(40613)] - [InlineData(42108)] - [InlineData(42109)] - [PlatformSpecific(TestPlatforms.Windows)] - public void TransientFaultDisabledTest(uint errorCode) - { - using TransientFaultTDSServer server = TransientFaultTDSServer.StartTestServer(true, true, errorCode); - SqlConnectionStringBuilder builder = new() - { - DataSource = "localhost," + server.Port, - IntegratedSecurity = true, - ConnectRetryCount = 0, - Encrypt = SqlConnectionEncryptOption.Optional - }; - - using SqlConnection connection = new(builder.ConnectionString); - try - { - connection.Open(); - Assert.False(true, "Connection should not have opened."); - } - catch (SqlException e) - { - // FATAL Error, should result in closed connection. - Assert.Equal(20, e.Class); - Assert.Equal(ConnectionState.Closed, connection.State); - } - } - [Fact] public void SqlConnectionDbProviderFactoryTest() { diff --git a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TransientFaultTDSServer.cs b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TransientFaultTDSServer.cs index eda4de8e2a..419f7e5d24 100644 --- a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TransientFaultTDSServer.cs +++ b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TransientFaultTDSServer.cs @@ -146,7 +146,6 @@ private void Dispose(bool isDisposing) if (isDisposing) { _endpoint?.Stop(); - RequestCounter = 0; } } } From 2d7344da64ed87e305d60978773e334f55caebdf Mon Sep 17 00:00:00 2001 From: Davoud Date: Thu, 16 May 2024 14:58:25 -0700 Subject: [PATCH 2/2] add missing namespace --- .../tests/FunctionalTests/SqlConnectionBasicTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs index 3046633b92..e3183ee6a0 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs @@ -7,6 +7,7 @@ using System.Data.Common; using System.Reflection; using System.Security; +using System.Threading.Tasks; using Microsoft.SqlServer.TDS.Servers; using Xunit;