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>
pull/11464/head
gnattu 3 weeks ago
parent 2cbef3aa38
commit 935929b6a4

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

@ -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;
/// <summary>
/// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class.
/// </summary>
/// <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;
_configuration = configuration;
}
/// <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" />.
/// </summary>
/// <value>The journal mode.</value>
protected virtual string JournalMode => "WAL";
protected virtual string JournalMode => _configuration.GetSqliteWalDisabled() ? "TRUNCATE" : "WAL";
/// <summary>
/// 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,
IImageProcessor imageProcessor,
IConfiguration configuration)
: base(logger)
: base(logger, configuration)
{
_config = config;
_appHost = appHost;

@ -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<SqliteUserDataRepository> logger,
IServerConfigurationManager config,
IUserManager userManager)
: base(logger)
IUserManager userManager,
IConfiguration configuration)
: base(logger, configuration)
{
_userManager = userManager;

@ -64,6 +64,11 @@ namespace MediaBrowser.Controller.Extensions
/// </summary>
public const string SqliteCacheSizeKey = "sqlite:cacheSize";
/// <summary>
/// Disable WAL journaling of sqlite.
/// </summary>
public const string SqliteDisableWalKey = "sqlite:disableWal";
/// <summary>
/// Gets a value indicating whether the application should host static web content from the <see cref="IConfiguration"/>.
/// </summary>
@ -128,5 +133,26 @@ namespace MediaBrowser.Controller.Extensions
/// <returns>The sqlite cache size.</returns>
public static int? GetSqliteCacheSize(this IConfiguration configuration)
=> 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