SqlReader Retry Logic
- Dominant language
- C#
- Stars
- 583
- Forks
- 169
- PR merge metrics
- No merged PRs in 30d
Description
When using a PaaS database product like Azure SQL Database, occasional transient errors occur more frequently than with a traditional on-premises server. The usual solution is to add retry logic.
Good sources on what errors are retryable are in [here](https://github.com/aspnet/EntityFramework6/blob/master/src/EntityFramework.SqlServer/SqlAzureRetriableExceptionDetector.cs) and [here](https://github.com/aspnet/EntityFrameworkCore/blob/dev/src/EFCore.SqlServer/Storage/Internal/SqlServerTransientExceptionDetector.cs). If you would like a ready-made `SqlConnection` wrapper that implements retries, I can probably arrange to get you the one my client uses — I wrote it. DM me on twitter @sharpjs to discuss further.
Here is an example of one such error that came through my client's monitoring today:
```
System.Data.SqlClient.SqlException: Database '*****' on server '*****.database.windows.net' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '*****'.
at System.Data.SqlClient.SqlInternalConnectionTds..ctor (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionPool.CreateObject (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.SqlClient.SqlConnection.TryOpenInner (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.SqlClient.SqlConnection.TryOpen (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Data.SqlClient.SqlConnection.Open (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at ImageResizer.Plugins.SqlReader.SqlReaderPlugin.RowExists (ImageResizer.Plugins.SqlReader, Version=3.4.3.103, Culture=neutral, PublicKeyToken=null)
at ImageResizer.Configuration.PipelineConfig.GetFile (ImageResizer, Version=3.4.3.103, Culture=neutral, PublicKeyToken=null)
at ImageResizer.InterceptModule.CheckRequest_PostAuthorizeRequest (ImageResizer, Version=3.4.3.103, Culture=neutral, PublicKeyToken=null)
at System.Web.HttpApplication+SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStepImpl (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStep (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
```
Contributor guide
Research direction
Start at the SqlReaderPlugin.RowExists entry point shown in the stack trace and inspect how its SQL connection is opened. Compare the retryable-error guidance in the linked Entity Framework detector sources. Done means transient Azure SQL connection errors are retried without changing normal database behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- azure, csharp, sql
- Domain
- database
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100