From 947c0e74cbe7bb2b471261d3d52a4e6dbdb8e079 Mon Sep 17 00:00:00 2001 From: Jamie Rees Date: Thu, 14 Mar 2019 11:12:28 +0000 Subject: [PATCH] Made use of the global mutex, this should now hopefully work #2750 --- src/Ombi.Helpers/GlobalMutex.cs | 9 +++++---- src/Ombi.Store/Repository/BaseRepository.cs | 14 +++++--------- src/Ombi/Controllers/TokenController.cs | 2 +- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Ombi.Helpers/GlobalMutex.cs b/src/Ombi.Helpers/GlobalMutex.cs index ecf9cdf15..0164e888c 100644 --- a/src/Ombi.Helpers/GlobalMutex.cs +++ b/src/Ombi.Helpers/GlobalMutex.cs @@ -1,15 +1,16 @@ using System; using System.Threading; +using System.Threading.Tasks; +using Nito.AsyncEx; namespace Ombi.Helpers { public static class GlobalMutex { - public static T Lock(Func func) + public static async Task Lock(Func> func) { const string mutexId = "Global\\OMBI"; - - using (var mutex = new Mutex(false, mutexId, out __)) + using (var mutex = new Mutex(false, mutexId, out _)) { var hasHandle = false; try @@ -25,7 +26,7 @@ namespace Ombi.Helpers hasHandle = true; } - return func(); + return await func(); } finally { diff --git a/src/Ombi.Store/Repository/BaseRepository.cs b/src/Ombi.Store/Repository/BaseRepository.cs index 21dd2dac5..ca2937291 100644 --- a/src/Ombi.Store/Repository/BaseRepository.cs +++ b/src/Ombi.Store/Repository/BaseRepository.cs @@ -5,7 +5,7 @@ using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; -using Nito.AsyncEx; +using Ombi.Helpers; using Ombi.Store.Context; using Ombi.Store.Entities; @@ -20,7 +20,6 @@ namespace Ombi.Store.Repository } public DbSet _db { get; } private readonly U _ctx; - private readonly AsyncLock _mutex = new AsyncLock(); public async Task Find(object key) { @@ -32,7 +31,7 @@ namespace Ombi.Store.Repository return _db.AsQueryable(); } - public async Task FirstOrDefaultAsync(Expression> predicate) + public async Task FirstOrDefaultAsync(Expression> predicate) { return await _db.FirstOrDefaultAsync(predicate); } @@ -84,12 +83,9 @@ namespace Ombi.Store.Repository private async Task InternalSaveChanges() { - using (await _mutex.LockAsync()) - { - return await _ctx.SaveChangesAsync(); - } + return await GlobalMutex.Lock(async () => await _ctx.SaveChangesAsync()); } - + private bool _disposed; // Protected implementation of Dispose pattern. @@ -102,7 +98,7 @@ namespace Ombi.Store.Repository { _ctx?.Dispose(); } - + _disposed = true; } diff --git a/src/Ombi/Controllers/TokenController.cs b/src/Ombi/Controllers/TokenController.cs index b27c04caa..9499dd493 100644 --- a/src/Ombi/Controllers/TokenController.cs +++ b/src/Ombi/Controllers/TokenController.cs @@ -150,7 +150,7 @@ namespace Ombi.Controllers } user.LastLoggedIn = DateTime.UtcNow; - await _userManager.UpdateAsync(user); + await GlobalMutex.Lock(async () => await _userManager.UpdateAsync(user)).ConfigureAwait(false); return new JsonResult(new {