From 935929b6a4f772ea06ddd972fab3c131ea5d7f62 Mon Sep 17 00:00:00 2001 From: gnattu Date: Tue, 30 Apr 2024 04:08:47 +0800 Subject: [PATCH] Add Env Var to disable WAL journaling SQLite WAL journaling is not compatible with all filesystems/VFS extensions, causing the database being locked up in certain conditions. Add an env var to disable WAL journaling for better compatibility. Signed-off-by: gnattu --- .../ConfigurationOptions.cs | 3 ++- .../Data/BaseSqliteRepository.cs | 9 +++++-- .../Data/SqliteItemRepository.cs | 2 +- .../Data/SqliteUserDataRepository.cs | 6 +++-- .../Extensions/ConfigurationExtensions.cs | 26 +++++++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Emby.Server.Implementations/ConfigurationOptions.cs b/Emby.Server.Implementations/ConfigurationOptions.cs index f0c2676279..f2743762e3 100644 --- a/Emby.Server.Implementations/ConfigurationOptions.cs +++ b/Emby.Server.Implementations/ConfigurationOptions.cs @@ -19,7 +19,8 @@ namespace Emby.Server.Implementations { FfmpegAnalyzeDurationKey, "200M" }, { PlaylistsAllowDuplicatesKey, bool.FalseString }, { BindToUnixSocketKey, bool.FalseString }, - { SqliteCacheSizeKey, "20000" } + { SqliteCacheSizeKey, "20000" }, + { SqliteDisableWalKey, bool.FalseString } }; } } diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index b1c99227c3..7ec980eb5e 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -5,22 +5,27 @@ using System; using System.Collections.Generic; using Jellyfin.Extensions; +using MediaBrowser.Controller.Extensions; using Microsoft.Data.Sqlite; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Data { public abstract class BaseSqliteRepository : IDisposable { + private readonly IConfiguration _configuration; private bool _disposed = false; /// /// Initializes a new instance of the class. /// /// The logger. - protected BaseSqliteRepository(ILogger logger) + /// The configuration. + protected BaseSqliteRepository(ILogger logger, IConfiguration configuration) { Logger = logger; + _configuration = configuration; } /// @@ -60,7 +65,7 @@ namespace Emby.Server.Implementations.Data /// Gets the journal mode. . /// /// The journal mode. - protected virtual string JournalMode => "WAL"; + protected virtual string JournalMode => _configuration.GetSqliteWalDisabled() ? "TRUNCATE" : "WAL"; /// /// Gets the journal size limit. . diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 59e4ff1a96..7e035083a4 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -313,7 +313,7 @@ namespace Emby.Server.Implementations.Data ILocalizationManager localization, IImageProcessor imageProcessor, IConfiguration configuration) - : base(logger) + : base(logger, configuration) { _config = config; _appHost = appHost; diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index 20359e4ad7..f361e1a572 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -12,6 +12,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using Microsoft.Data.Sqlite; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Data @@ -23,8 +24,9 @@ namespace Emby.Server.Implementations.Data public SqliteUserDataRepository( ILogger logger, IServerConfigurationManager config, - IUserManager userManager) - : base(logger) + IUserManager userManager, + IConfiguration configuration) + : base(logger, configuration) { _userManager = userManager; diff --git a/MediaBrowser.Controller/Extensions/ConfigurationExtensions.cs b/MediaBrowser.Controller/Extensions/ConfigurationExtensions.cs index 6c58064ce9..8041c254a7 100644 --- a/MediaBrowser.Controller/Extensions/ConfigurationExtensions.cs +++ b/MediaBrowser.Controller/Extensions/ConfigurationExtensions.cs @@ -64,6 +64,11 @@ namespace MediaBrowser.Controller.Extensions /// public const string SqliteCacheSizeKey = "sqlite:cacheSize"; + /// + /// Disable WAL journaling of sqlite. + /// + public const string SqliteDisableWalKey = "sqlite:disableWal"; + /// /// Gets a value indicating whether the application should host static web content from the . /// @@ -128,5 +133,26 @@ namespace MediaBrowser.Controller.Extensions /// The sqlite cache size. public static int? GetSqliteCacheSize(this IConfiguration configuration) => configuration.GetValue(SqliteCacheSizeKey); + + /// + /// Gets whether WAL journaling disabled from the . + /// + /// The configuration to read the setting from. + /// Whether WAL journaling disabled. + public static bool GetSqliteWalDisabled(this IConfiguration configuration) + { + var disableSqliteWal = configuration.GetValue(SqliteDisableWalKey); + var disableWal = false; + if (disableSqliteWal is not null) + { + disableWal = disableSqliteWal.ToUpperInvariant() switch + { + "FALSE" or "NO" or "0" => false, + _ => true + }; + } + + return disableWal; + } } }