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 34d753093d..676d3499ad 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -314,7 +314,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; + } } }