Skip to content

Bug | Fix Connection Resiliency for Linux/MacOS clients #359

@aaomidi

Description

@aaomidi

.NET Core 2.2

    <PackageReference Include="Microsoft.Data.SqlClient" Version="1.1.0" />
    <PackageReference Include="Microsoft.SqlServer.SqlManagementObjects" Version="160.1911221.0-preview" />

Repro: https://github.com/aaomidi/smo-test/blob/master/Program.cs

Repro of the issue:

  1. Create a connection to a SQL Server on MacOS
  2. Run a query using that connection.
  3. Disconnect from internet.
  4. Run a query again, wait for timeout.
  5. Connect to internet after the timeout.
  6. Using the same connection from the first step, run another query.
    • Expected: Recreates the connection and returns the result.
    • Actual: Fails with the following error:
Microsoft.SqlServer.Management.Smo.FailedOperationException: Execute with results failed for Database 'master'.  ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)
   at System.Net.Sockets.Socket.set_ReceiveTimeout(Int32 value)
   at Microsoft.Data.SqlClient.SNI.SNITCPHandle.Receive(SNIPacket& packet, Int32 timeoutInMilliseconds) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SNI\SNITcpHandle.cs:line 453
   at Microsoft.Data.SqlClient.SNI.TdsParserStateObjectManaged.ReadSyncOverAsync(Int32 timeoutRemaining, UInt32& error) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParserStateObjectManaged.cs:line 136
   at Microsoft.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParserStateObject.cs:line 2178
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParserStateObject.cs:line 2137
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParserStateObject.cs:line 1093
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParserStateObject.cs:line 1370
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParser.cs:line 1773
   at Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParser.cs:line 1679
   at Microsoft.Data.SqlClient.TdsParser.DrainData(TdsParserStateObject stateObj) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\TdsParser.cs:line 4187
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 706
   at Microsoft.Data.SqlClient.SqlCommand.ValidateCommand(Boolean isAsync, String method) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlCommand.cs:line 4622
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlCommand.cs:line 3934
   at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlCommand.cs:line 1759
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
   at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException) in d:\a\1\s\src\Microsoft\SqlServer\Management\ConnectionInfo\ConnectionManager.cs:line 742
   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults(String sqlCommand, Boolean retry) in d:\a\1\s\src\Microsoft\SqlServer\Management\ConnectionInfo\ServerConnection.cs:line 1325
   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults(StringCollection sqlCommands) in d:\a\1\s\src\Microsoft\SqlServer\Management\ConnectionInfo\ServerConnection.cs:line 1261
   at Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteWithResults(StringCollection query) in d:\a\1\s\src\Microsoft\SqlServer\Management\Smo\ExecutionManager.cs:line 664
   at Microsoft.SqlServer.Management.Smo.Database.ExecuteWithResults(StringCollection sqlCommands) in d:\a\1\s\src\Microsoft\SqlServer\Management\Smo\DatabaseBase.cs:line 2202
   --- End of inner exception stack trace ---
   at Microsoft.SqlServer.Management.Smo.Database.ExecuteWithResults(StringCollection sqlCommands) in d:\a\1\s\src\Microsoft\SqlServer\Management\Smo\DatabaseBase.cs:line 2217
   at SmoTestPackage.Program.DoQuery(Database db) in /Users/amir/Projects/smo-test/Program.cs:line 45
   at SmoTestPackage.Program.Main(String[] args) in /Users/amir/Projects/smo-test/Program.cs:line 33

I have confirmed that this issue does not exist in Windows.

I have not confirmed if this issue repros in Linux.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Closed

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions