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 <gnattuoc@me.com>
gnattu 1 month ago
parent 2cbef3aa38
commit 935929b6a4

@ -19,7 +19,8 @@ namespace Emby.Server.Implementations
{ FfmpegAnalyzeDurationKey, "200M" }, { FfmpegAnalyzeDurationKey, "200M" },
{ PlaylistsAllowDuplicatesKey, bool.FalseString }, { PlaylistsAllowDuplicatesKey, bool.FalseString },
{ BindToUnixSocketKey, bool.FalseString }, { BindToUnixSocketKey, bool.FalseString },
{ SqliteCacheSizeKey, "20000" } { SqliteCacheSizeKey, "20000" },
{ SqliteDisableWalKey, bool.FalseString }
}; };
} }
} }

@ -5,22 +5,27 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Jellyfin.Extensions; using Jellyfin.Extensions;
using MediaBrowser.Controller.Extensions;
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Data namespace Emby.Server.Implementations.Data
{ {
public abstract class BaseSqliteRepository : IDisposable public abstract class BaseSqliteRepository : IDisposable
{ {
private readonly IConfiguration _configuration;
private bool _disposed = false; private bool _disposed = false;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class. /// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class.
/// </summary> /// </summary>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
protected BaseSqliteRepository(ILogger<BaseSqliteRepository> logger) /// <param name="configuration">The configuration.</param>
protected BaseSqliteRepository(ILogger<BaseSqliteRepository> logger, IConfiguration configuration)
{ {
Logger = logger; Logger = logger;
_configuration = configuration;
} }
/// <summary> /// <summary>
@ -60,7 +65,7 @@ namespace Emby.Server.Implementations.Data
/// Gets the journal mode. <see href="https://www.sqlite.org/pragma.html#pragma_journal_mode" />. /// Gets the journal mode. <see href="https://www.sqlite.org/pragma.html#pragma_journal_mode" />.
/// </summary> /// </summary>
/// <value>The journal mode.</value> /// <value>The journal mode.</value>
protected virtual string JournalMode => "WAL"; protected virtual string JournalMode => _configuration.GetSqliteWalDisabled() ? "TRUNCATE" : "WAL";
/// <summary> /// <summary>
/// Gets the journal size limit. <see href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit" />. /// Gets the journal size limit. <see href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit" />.

@ -313,7 +313,7 @@ namespace Emby.Server.Implementations.Data
ILocalizationManager localization, ILocalizationManager localization,
IImageProcessor imageProcessor, IImageProcessor imageProcessor,
IConfiguration configuration) IConfiguration configuration)
: base(logger) : base(logger, configuration)
{ {
_config = config; _config = config;
_appHost = appHost; _appHost = appHost;

@ -12,6 +12,7 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Persistence;
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Data namespace Emby.Server.Implementations.Data
@ -23,8 +24,9 @@ namespace Emby.Server.Implementations.Data
public SqliteUserDataRepository( public SqliteUserDataRepository(
ILogger<SqliteUserDataRepository> logger, ILogger<SqliteUserDataRepository> logger,
IServerConfigurationManager config, IServerConfigurationManager config,
IUserManager userManager) IUserManager userManager,
: base(logger) IConfiguration configuration)
: base(logger, configuration)
{ {
_userManager = userManager; _userManager = userManager;

@ -64,6 +64,11 @@ namespace MediaBrowser.Controller.Extensions
/// </summary> /// </summary>
public const string SqliteCacheSizeKey = "sqlite:cacheSize"; public const string SqliteCacheSizeKey = "sqlite:cacheSize";
/// <summary>
/// Disable WAL journaling of sqlite.
/// </summary>
public const string SqliteDisableWalKey = "sqlite:disableWal";
/// <summary> /// <summary>
/// Gets a value indicating whether the application should host static web content from the <see cref="IConfiguration"/>. /// Gets a value indicating whether the application should host static web content from the <see cref="IConfiguration"/>.
/// </summary> /// </summary>
@ -128,5 +133,26 @@ namespace MediaBrowser.Controller.Extensions
/// <returns>The sqlite cache size.</returns> /// <returns>The sqlite cache size.</returns>
public static int? GetSqliteCacheSize(this IConfiguration configuration) public static int? GetSqliteCacheSize(this IConfiguration configuration)
=> configuration.GetValue<int?>(SqliteCacheSizeKey); => configuration.GetValue<int?>(SqliteCacheSizeKey);
/// <summary>
/// Gets whether WAL journaling disabled from the <see cref="IConfiguration" />.
/// </summary>
/// <param name="configuration">The configuration to read the setting from.</param>
/// <returns>Whether WAL journaling disabled.</returns>
public static bool GetSqliteWalDisabled(this IConfiguration configuration)
{
var disableSqliteWal = configuration.GetValue<string?>(SqliteDisableWalKey);
var disableWal = false;
if (disableSqliteWal is not null)
{
disableWal = disableSqliteWal.ToUpperInvariant() switch
{
"FALSE" or "NO" or "0" => false,
_ => true
};
}
return disableWal;
}
} }
} }

Loading…
Cancel
Save