Backport pull request #11823 from jellyfin/release-10.9.z

Add Env Var to disable second level cache

Original-merge: 95c7d997c1

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
pull/11877/head
gnattu 7 months ago committed by Joshua M. Boniface
parent c4b7c91f3a
commit 9563e4f85e

@ -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" },
{ SqliteDisableSecondLevelCacheKey, bool.FalseString }
}; };
} }
} }

@ -16,21 +16,28 @@ public static class ServiceCollectionExtensions
/// Adds the <see cref="IDbContextFactory{TContext}"/> interface to the service collection with second level caching enabled. /// Adds the <see cref="IDbContextFactory{TContext}"/> interface to the service collection with second level caching enabled.
/// </summary> /// </summary>
/// <param name="serviceCollection">An instance of the <see cref="IServiceCollection"/> interface.</param> /// <param name="serviceCollection">An instance of the <see cref="IServiceCollection"/> interface.</param>
/// <param name="disableSecondLevelCache">Whether second level cache disabled..</param>
/// <returns>The updated service collection.</returns> /// <returns>The updated service collection.</returns>
public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection) public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection, bool disableSecondLevelCache)
{ {
serviceCollection.AddEFSecondLevelCache(options => if (!disableSecondLevelCache)
options.UseMemoryCacheProvider() {
.CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromMinutes(10)) serviceCollection.AddEFSecondLevelCache(options =>
.UseCacheKeyPrefix("EF_") options.UseMemoryCacheProvider()
// Don't cache null values. Remove this optional setting if it's not necessary. .CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromMinutes(10))
.SkipCachingResults(result => result.Value is null or EFTableRows { RowsCount: 0 })); .UseCacheKeyPrefix("EF_")
// Don't cache null values. Remove this optional setting if it's not necessary.
.SkipCachingResults(result => result.Value is null or EFTableRows { RowsCount: 0 }));
}
serviceCollection.AddPooledDbContextFactory<JellyfinDbContext>((serviceProvider, opt) => serviceCollection.AddPooledDbContextFactory<JellyfinDbContext>((serviceProvider, opt) =>
{ {
var applicationPaths = serviceProvider.GetRequiredService<IApplicationPaths>(); var applicationPaths = serviceProvider.GetRequiredService<IApplicationPaths>();
opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}") var dbOpt = opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}");
.AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>()); if (!disableSecondLevelCache)
{
dbOpt.AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>());
}
}); });
return serviceCollection; return serviceCollection;

@ -85,6 +85,6 @@ public static class WebHostBuilderExtensions
logger.LogInformation("Kestrel listening to unix socket {SocketPath}", socketPath); logger.LogInformation("Kestrel listening to unix socket {SocketPath}", socketPath);
} }
}) })
.UseStartup(_ => new Startup(appHost)); .UseStartup(_ => new Startup(appHost, startupConfig));
} }
} }

@ -40,15 +40,18 @@ namespace Jellyfin.Server
{ {
private readonly CoreAppHost _serverApplicationHost; private readonly CoreAppHost _serverApplicationHost;
private readonly IServerConfigurationManager _serverConfigurationManager; private readonly IServerConfigurationManager _serverConfigurationManager;
private readonly IConfiguration _startupConfig;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="Startup" /> class. /// Initializes a new instance of the <see cref="Startup" /> class.
/// </summary> /// </summary>
/// <param name="appHost">The server application host.</param> /// <param name="appHost">The server application host.</param>
public Startup(CoreAppHost appHost) /// <param name="startupConfig">The server startupConfig.</param>
public Startup(CoreAppHost appHost, IConfiguration startupConfig)
{ {
_serverApplicationHost = appHost; _serverApplicationHost = appHost;
_serverConfigurationManager = appHost.ConfigurationManager; _serverConfigurationManager = appHost.ConfigurationManager;
_startupConfig = startupConfig;
} }
/// <summary> /// <summary>
@ -67,7 +70,7 @@ namespace Jellyfin.Server
// TODO remove once this is fixed upstream https://github.com/dotnet/aspnetcore/issues/34371 // TODO remove once this is fixed upstream https://github.com/dotnet/aspnetcore/issues/34371
services.AddSingleton<IActionResultExecutor<PhysicalFileResult>, SymlinkFollowingPhysicalFileResultExecutor>(); services.AddSingleton<IActionResultExecutor<PhysicalFileResult>, SymlinkFollowingPhysicalFileResultExecutor>();
services.AddJellyfinApi(_serverApplicationHost.GetApiPluginAssemblies(), _serverConfigurationManager.GetNetworkConfiguration()); services.AddJellyfinApi(_serverApplicationHost.GetApiPluginAssemblies(), _serverConfigurationManager.GetNetworkConfiguration());
services.AddJellyfinDbContext(); services.AddJellyfinDbContext(_startupConfig.GetSqliteSecondLevelCacheDisabled());
services.AddJellyfinApiSwagger(); services.AddJellyfinApiSwagger();
// configure custom legacy authentication // configure custom legacy authentication

@ -64,6 +64,11 @@ namespace MediaBrowser.Controller.Extensions
/// </summary> /// </summary>
public const string SqliteCacheSizeKey = "sqlite:cacheSize"; public const string SqliteCacheSizeKey = "sqlite:cacheSize";
/// <summary>
/// Disable second level cache of sqlite.
/// </summary>
public const string SqliteDisableSecondLevelCacheKey = "sqlite:disableSecondLevelCache";
/// <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,15 @@ 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 second level cache disabled from the <see cref="IConfiguration" />.
/// </summary>
/// <param name="configuration">The configuration to read the setting from.</param>
/// <returns>Whether second level cache disabled.</returns>
public static bool GetSqliteSecondLevelCacheDisabled(this IConfiguration configuration)
{
return configuration.GetValue<bool>(SqliteDisableSecondLevelCacheKey);
}
} }
} }

Loading…
Cancel
Save