mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-20 13:23:20 -07:00
Retry database connections
This commit is contained in:
parent
af8b519b46
commit
7dd0f05e6f
1 changed files with 31 additions and 1 deletions
|
@ -3,11 +3,14 @@ using System.IO;
|
|||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using MySqlConnector;
|
||||
using Newtonsoft.Json;
|
||||
using Ombi.Helpers;
|
||||
using Ombi.Store.Context;
|
||||
using Ombi.Store.Context.MySql;
|
||||
using Ombi.Store.Context.Sqlite;
|
||||
using Polly;
|
||||
using Pomelo.EntityFrameworkCore.MySql.Storage.Internal;
|
||||
using SQLitePCL;
|
||||
|
||||
namespace Ombi.Extensions
|
||||
|
@ -120,13 +123,40 @@ namespace Ombi.Extensions
|
|||
|
||||
public static void ConfigureMySql(DbContextOptionsBuilder options, PerDatabaseConfiguration config)
|
||||
{
|
||||
options.UseMySql(config.ConnectionString, ServerVersion.AutoDetect(config.ConnectionString), b =>
|
||||
if (string.IsNullOrEmpty(config.ConnectionString))
|
||||
{
|
||||
throw new ArgumentNullException("ConnectionString for the MySql/Mariadb database is empty");
|
||||
}
|
||||
|
||||
options.UseMySql(config.ConnectionString, GetServerVersion(config.ConnectionString), b =>
|
||||
{
|
||||
//b.CharSetBehavior(Pomelo.EntityFrameworkCore.MySql.Infrastructure.CharSetBehavior.NeverAppend); // ##ISSUE, link to migrations?
|
||||
b.EnableRetryOnFailure();
|
||||
});
|
||||
}
|
||||
|
||||
private static ServerVersion GetServerVersion(string connectionString)
|
||||
{
|
||||
// Workaround Windows bug, that can lead to the following exception:
|
||||
//
|
||||
// MySqlConnector.MySqlException (0x80004005): SSL Authentication Error
|
||||
// ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
|
||||
// ---> System.ComponentModel.Win32Exception (0x8009030F): The message or signature supplied for verification has been altered
|
||||
//
|
||||
// See https://github.com/dotnet/runtime/issues/17005#issuecomment-305848835
|
||||
//
|
||||
// Also workaround for the fact, that ServerVersion.AutoDetect() does not use any retrying strategy.
|
||||
ServerVersion serverVersion = null;
|
||||
#pragma warning disable EF1001
|
||||
var retryPolicy = Policy.Handle<Exception>(exception => MySqlTransientExceptionDetector.ShouldRetryOn(exception))
|
||||
#pragma warning restore EF1001
|
||||
.WaitAndRetry(3, (count, context) => TimeSpan.FromMilliseconds(count * 250));
|
||||
|
||||
serverVersion = retryPolicy.Execute(() => serverVersion = ServerVersion.AutoDetect(connectionString));
|
||||
|
||||
return serverVersion;
|
||||
}
|
||||
|
||||
public class DatabaseConfiguration
|
||||
{
|
||||
public DatabaseConfiguration()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue