aboutsummaryrefslogtreecommitdiff
path: root/src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs
diff options
context:
space:
mode:
authorChristopher Young <c.t.ythegamer@gmail.com>2025-10-08 12:27:51 -0600
committerChristopher Young <c.t.ythegamer@gmail.com>2025-10-08 12:27:51 -0600
commit622b60064dd2c9bf6cea139ab2056011d9e9c203 (patch)
treeec9f84d01b7c3ff3ffd23e89bb27aa4bf4e131ff /src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs
parent91b2b7fc3dfe23fdc01834f2f1364e9f8bd98fe4 (diff)
parent0b4854c5eff7c862d05f43048e08dd3a1a25efaa (diff)
Merge branch 'master' of https://github.com/JadedRain/jellyfin
Diffstat (limited to 'src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs')
-rw-r--r--src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs
index 9395b2e2dd..b90a2e056f 100644
--- a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Locking/OptimisticLockBehavior.cs
@@ -1,6 +1,7 @@
using System;
using System.Data.Common;
using System.Linq;
+using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
@@ -28,15 +29,34 @@ public class OptimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
TimeSpan[] sleepDurations = [
TimeSpan.FromMilliseconds(50),
TimeSpan.FromMilliseconds(50),
+ TimeSpan.FromMilliseconds(50),
+ TimeSpan.FromMilliseconds(50),
+ TimeSpan.FromMilliseconds(250),
TimeSpan.FromMilliseconds(250),
+ TimeSpan.FromMilliseconds(250),
+ TimeSpan.FromMilliseconds(150),
+ TimeSpan.FromMilliseconds(150),
TimeSpan.FromMilliseconds(150),
TimeSpan.FromMilliseconds(500),
+ TimeSpan.FromMilliseconds(150),
TimeSpan.FromMilliseconds(500),
+ TimeSpan.FromMilliseconds(150),
TimeSpan.FromSeconds(3)
];
+
+ Func<int, Context, TimeSpan> backoffProvider = (index, context) =>
+ {
+ var backoff = sleepDurations[index];
+ return backoff + TimeSpan.FromMilliseconds(RandomNumberGenerator.GetInt32(0, (int)(backoff.TotalMilliseconds * .5)));
+ };
+
_logger = logger;
- _writePolicy = Policy.HandleInner<Exception>(e => e.Message.Contains("database is locked", StringComparison.InvariantCultureIgnoreCase)).WaitAndRetry(sleepDurations, RetryHandle);
- _writeAsyncPolicy = Policy.HandleInner<Exception>(e => e.Message.Contains("database is locked", StringComparison.InvariantCultureIgnoreCase)).WaitAndRetryAsync(sleepDurations, RetryHandle);
+ _writePolicy = Policy
+ .HandleInner<Exception>(e => e.Message.Contains("database is locked", StringComparison.InvariantCultureIgnoreCase))
+ .WaitAndRetry(sleepDurations.Length, backoffProvider, RetryHandle);
+ _writeAsyncPolicy = Policy
+ .HandleInner<Exception>(e => e.Message.Contains("database is locked", StringComparison.InvariantCultureIgnoreCase))
+ .WaitAndRetryAsync(sleepDurations.Length, backoffProvider, RetryHandle);
void RetryHandle(Exception exception, TimeSpan timespan, int retryNo, Context context)
{