Made use of the global mutex, this should now hopefully work #2750

pull/2900/head
Jamie Rees 5 years ago
parent 1322076aa6
commit 947c0e74cb

@ -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<T>(Func<T> func)
public static async Task<T> Lock<T>(Func<Task<T>> 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
{

@ -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<T> _db { get; }
private readonly U _ctx;
private readonly AsyncLock _mutex = new AsyncLock();
public async Task<T> Find(object key)
{
@ -32,7 +31,7 @@ namespace Ombi.Store.Repository
return _db.AsQueryable();
}
public async Task<T> FirstOrDefaultAsync(Expression<Func<T,bool>> predicate)
public async Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> predicate)
{
return await _db.FirstOrDefaultAsync(predicate);
}
@ -84,12 +83,9 @@ namespace Ombi.Store.Repository
private async Task<int> 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;
}

@ -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
{

Loading…
Cancel
Save