From 2e4dd02f76ec9a8487de7e1ceb0b0871c5be766d Mon Sep 17 00:00:00 2001 From: Jayson Reis Date: Sat, 22 Jan 2022 21:52:30 +0000 Subject: [PATCH 1/3] chore: Add a read only connection for routes like Shows/NextUp --- Emby.Server.Implementations/Data/BaseSqliteRepository.cs | 7 +++++++ Emby.Server.Implementations/Data/ManagedConnection.cs | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index 450688491a..3ca9977c85 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -97,9 +97,16 @@ namespace Emby.Server.Implementations.Data /// /// The write connection. protected SQLiteDatabaseConnection WriteConnection { get; set; } + protected SQLiteDatabaseConnection ReadConnection { get; set; } protected ManagedConnection GetConnection(bool readOnly = false) { + if (readOnly) + { + ReadConnection ??= SQLite3.Open(DbFilePath, DefaultConnectionFlags | ConnectionFlags.ReadOnly, null); + return new ManagedConnection(ReadConnection, null); + } + WriteLock.Wait(); if (WriteConnection != null) { diff --git a/Emby.Server.Implementations/Data/ManagedConnection.cs b/Emby.Server.Implementations/Data/ManagedConnection.cs index 11e33278d4..97cb6f26f8 100644 --- a/Emby.Server.Implementations/Data/ManagedConnection.cs +++ b/Emby.Server.Implementations/Data/ManagedConnection.cs @@ -9,11 +9,12 @@ namespace Emby.Server.Implementations.Data { public sealed class ManagedConnection : IDisposable { - private readonly SemaphoreSlim _writeLock; + private readonly SemaphoreSlim? _writeLock; private SQLiteDatabaseConnection? _db; - private bool _disposed = false; + private bool _disposed; + public ManagedConnection(SQLiteDatabaseConnection db, SemaphoreSlim writeLock) { @@ -73,7 +74,7 @@ namespace Emby.Server.Implementations.Data return; } - _writeLock.Release(); + _writeLock?.Release(); _db = null; // Don't dispose it _disposed = true; From 09b8cde6aa4123cba3dae31e6ac03edca2a546e5 Mon Sep 17 00:00:00 2001 From: Jayson Reis Date: Sun, 23 Jan 2022 11:59:12 +0100 Subject: [PATCH 2/3] fix: Avoid opening read connections without mutexes --- Emby.Server.Implementations/Data/BaseSqliteRepository.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index 3ca9977c85..3387dbec9d 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -103,8 +103,8 @@ namespace Emby.Server.Implementations.Data { if (readOnly) { - ReadConnection ??= SQLite3.Open(DbFilePath, DefaultConnectionFlags | ConnectionFlags.ReadOnly, null); - return new ManagedConnection(ReadConnection, null); + ReadConnection ??= SQLite3.Open(DbFilePath, ConnectionFlags.ReadOnly, null); + return new ManagedConnection(ReadConnection, null!); } WriteLock.Wait(); From b705ace262de83867d4d0a04df285d0cc90dd378 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Sat, 5 Mar 2022 12:37:23 -0700 Subject: [PATCH 3/3] Apply suggestions from code review --- Emby.Server.Implementations/Data/BaseSqliteRepository.cs | 3 ++- Emby.Server.Implementations/Data/ManagedConnection.cs | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index 3387dbec9d..b86511482e 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -97,6 +97,7 @@ namespace Emby.Server.Implementations.Data /// /// The write connection. protected SQLiteDatabaseConnection WriteConnection { get; set; } + protected SQLiteDatabaseConnection ReadConnection { get; set; } protected ManagedConnection GetConnection(bool readOnly = false) @@ -104,7 +105,7 @@ namespace Emby.Server.Implementations.Data if (readOnly) { ReadConnection ??= SQLite3.Open(DbFilePath, ConnectionFlags.ReadOnly, null); - return new ManagedConnection(ReadConnection, null!); + return new ManagedConnection(ReadConnection, null); } WriteLock.Wait(); diff --git a/Emby.Server.Implementations/Data/ManagedConnection.cs b/Emby.Server.Implementations/Data/ManagedConnection.cs index 97cb6f26f8..fe09bdc2a4 100644 --- a/Emby.Server.Implementations/Data/ManagedConnection.cs +++ b/Emby.Server.Implementations/Data/ManagedConnection.cs @@ -15,8 +15,7 @@ namespace Emby.Server.Implementations.Data private bool _disposed; - - public ManagedConnection(SQLiteDatabaseConnection db, SemaphoreSlim writeLock) + public ManagedConnection(SQLiteDatabaseConnection db, SemaphoreSlim? writeLock) { _db = db; _writeLock = writeLock;