Updated code to correct build errors for Jelyfin.Data and Jellyfin.Database.Implementations
This commit is contained in:
+38
-31
@@ -7,6 +7,9 @@ namespace Jellyfin.Database.Implementations.Locking;
|
||||
#pragma warning disable MT1013 // Releasing lock without guarantee of execution
|
||||
#pragma warning disable MT1012 // Acquiring lock without guarantee of releasing
|
||||
#pragma warning disable CA1873
|
||||
#pragma warning disable IDISP004
|
||||
#pragma warning disable CA1848
|
||||
#pragma warning disable SA1309 // Variables should not begin with underscore
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
@@ -17,6 +20,7 @@ using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Diagnostics;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
/// <summary>
|
||||
/// A locking behavior that will always block any operation while a write is requested. Mimicks the old SqliteRepository behavior.
|
||||
@@ -33,8 +37,8 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
/// <param name="loggerFactory">The logger factory.</param>
|
||||
public PessimisticLockBehavior(ILogger<PessimisticLockBehavior> logger, ILoggerFactory loggerFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_loggerFactory = loggerFactory;
|
||||
this._logger = logger;
|
||||
this._loggerFactory = loggerFactory;
|
||||
}
|
||||
|
||||
private static ReaderWriterLockSlim DatabaseLock { get; } = new(LockRecursionPolicy.SupportsRecursion);
|
||||
@@ -42,8 +46,9 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
/// <inheritdoc/>
|
||||
public void OnSaveChanges(JellyfinDbContext context, Action saveChanges)
|
||||
{
|
||||
using (DbLock.EnterWrite(_logger))
|
||||
using (DbLock.EnterWrite(this._logger))
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(saveChanges);
|
||||
saveChanges();
|
||||
}
|
||||
}
|
||||
@@ -51,16 +56,18 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
/// <inheritdoc/>
|
||||
public void Initialise(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
_logger.LogInformation("The database locking mode has been set to: Pessimistic.");
|
||||
optionsBuilder.AddInterceptors(new CommandLockingInterceptor(_loggerFactory.CreateLogger<CommandLockingInterceptor>()));
|
||||
optionsBuilder.AddInterceptors(new TransactionLockingInterceptor(_loggerFactory.CreateLogger<TransactionLockingInterceptor>()));
|
||||
this._logger.LogInformation("The database locking mode has been set to: Pessimistic.");
|
||||
ArgumentNullException.ThrowIfNull(optionsBuilder);
|
||||
optionsBuilder.AddInterceptors(new CommandLockingInterceptor(this._loggerFactory.CreateLogger<CommandLockingInterceptor>()));
|
||||
optionsBuilder.AddInterceptors(new TransactionLockingInterceptor(this._loggerFactory.CreateLogger<TransactionLockingInterceptor>()));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task OnSaveChangesAsync(JellyfinDbContext context, Func<Task> saveChanges)
|
||||
{
|
||||
using (DbLock.EnterWrite(_logger))
|
||||
using (DbLock.EnterWrite(this._logger))
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(saveChanges);
|
||||
await saveChanges().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
@@ -71,61 +78,61 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public TransactionLockingInterceptor(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
public override InterceptionResult<DbTransaction> TransactionStarting(DbConnection connection, TransactionStartingEventData eventData, InterceptionResult<DbTransaction> result)
|
||||
{
|
||||
DbLock.BeginWriteLock(_logger);
|
||||
DbLock.BeginWriteLock(this._logger);
|
||||
|
||||
return base.TransactionStarting(connection, eventData, result);
|
||||
}
|
||||
|
||||
public override ValueTask<InterceptionResult<DbTransaction>> TransactionStartingAsync(DbConnection connection, TransactionStartingEventData eventData, InterceptionResult<DbTransaction> result, CancellationToken cancellationToken = default)
|
||||
{
|
||||
DbLock.BeginWriteLock(_logger);
|
||||
DbLock.BeginWriteLock(this._logger);
|
||||
|
||||
return base.TransactionStartingAsync(connection, eventData, result, cancellationToken);
|
||||
}
|
||||
|
||||
public override void TransactionCommitted(DbTransaction transaction, TransactionEndEventData eventData)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
base.TransactionCommitted(transaction, eventData);
|
||||
}
|
||||
|
||||
public override Task TransactionCommittedAsync(DbTransaction transaction, TransactionEndEventData eventData, CancellationToken cancellationToken = default)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
return base.TransactionCommittedAsync(transaction, eventData, cancellationToken);
|
||||
}
|
||||
|
||||
public override void TransactionFailed(DbTransaction transaction, TransactionErrorEventData eventData)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
base.TransactionFailed(transaction, eventData);
|
||||
}
|
||||
|
||||
public override Task TransactionFailedAsync(DbTransaction transaction, TransactionErrorEventData eventData, CancellationToken cancellationToken = default)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
return base.TransactionFailedAsync(transaction, eventData, cancellationToken);
|
||||
}
|
||||
|
||||
public override void TransactionRolledBack(DbTransaction transaction, TransactionEndEventData eventData)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
base.TransactionRolledBack(transaction, eventData);
|
||||
}
|
||||
|
||||
public override Task TransactionRolledBackAsync(DbTransaction transaction, TransactionEndEventData eventData, CancellationToken cancellationToken = default)
|
||||
{
|
||||
DbLock.EndWriteLock(_logger);
|
||||
DbLock.EndWriteLock(this._logger);
|
||||
|
||||
return base.TransactionRolledBackAsync(transaction, eventData, cancellationToken);
|
||||
}
|
||||
@@ -140,12 +147,12 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public CommandLockingInterceptor(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
public override InterceptionResult<int> NonQueryExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<int> result)
|
||||
{
|
||||
using (DbLock.EnterWrite(_logger, command))
|
||||
using (DbLock.EnterWrite(this._logger, command))
|
||||
{
|
||||
return InterceptionResult<int>.SuppressWithResult(command.ExecuteNonQuery());
|
||||
}
|
||||
@@ -153,7 +160,7 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public override async ValueTask<InterceptionResult<int>> NonQueryExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = default)
|
||||
{
|
||||
using (DbLock.EnterWrite(_logger, command))
|
||||
using (DbLock.EnterWrite(this._logger, command))
|
||||
{
|
||||
return InterceptionResult<int>.SuppressWithResult(await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
@@ -161,7 +168,7 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public override InterceptionResult<object> ScalarExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<object> result)
|
||||
{
|
||||
using (DbLock.EnterRead(_logger))
|
||||
using (DbLock.EnterRead(this._logger))
|
||||
{
|
||||
return InterceptionResult<object>.SuppressWithResult(command.ExecuteScalar()!);
|
||||
}
|
||||
@@ -169,7 +176,7 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public override async ValueTask<InterceptionResult<object>> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<object> result, CancellationToken cancellationToken = default)
|
||||
{
|
||||
using (DbLock.EnterRead(_logger))
|
||||
using (DbLock.EnterRead(this._logger))
|
||||
{
|
||||
return InterceptionResult<object>.SuppressWithResult((await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false))!);
|
||||
}
|
||||
@@ -177,7 +184,7 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
|
||||
{
|
||||
using (DbLock.EnterRead(_logger))
|
||||
using (DbLock.EnterRead(this._logger))
|
||||
{
|
||||
return InterceptionResult<DbDataReader>.SuppressWithResult(command.ExecuteReader()!);
|
||||
}
|
||||
@@ -185,7 +192,7 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public override async ValueTask<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = default)
|
||||
{
|
||||
using (DbLock.EnterRead(_logger))
|
||||
using (DbLock.EnterRead(this._logger))
|
||||
{
|
||||
return InterceptionResult<DbDataReader>.SuppressWithResult(await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
@@ -194,15 +201,15 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
private sealed class DbLock : IDisposable
|
||||
{
|
||||
private readonly Action? _action;
|
||||
private bool _disposed;
|
||||
|
||||
private static readonly IDisposable _noLock = new DbLock(null) { _disposed = true };
|
||||
private static (string Command, Guid Id, DateTimeOffset QueryDate, bool Printed) _blockQuery;
|
||||
|
||||
private readonly Action? _action;
|
||||
private bool _disposed;
|
||||
|
||||
public DbLock(Action? action = null)
|
||||
{
|
||||
_action = action;
|
||||
this._action = action;
|
||||
}
|
||||
|
||||
#pragma warning disable IDISP015 // Member should not return created and cached instance
|
||||
@@ -286,15 +293,15 @@ public class PessimisticLockBehavior : IEntityFrameworkCoreLockingBehavior
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_disposed)
|
||||
if (this._disposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_disposed = true;
|
||||
if (_action is not null)
|
||||
this._disposed = true;
|
||||
if (this._action is not null)
|
||||
{
|
||||
_action();
|
||||
this._action();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user