imazen / imazen/resizer

SqlReader Retry Logic

Open
#233 4 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.