From daaf52d771c29d056076818a32634f788972010e Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 6 Apr 2018 23:56:31 +0100 Subject: [PATCH] Memory improvements --- src/Ombi.Schedule/JobSetup.cs | 36 +++++++++++++++++++++++++++++++++-- src/Ombi/Startup.cs | 9 ++++++--- src/Ombi/StartupExtensions.cs | 4 ++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/Ombi.Schedule/JobSetup.cs b/src/Ombi.Schedule/JobSetup.cs index 85b842d27..b328e6daf 100644 --- a/src/Ombi.Schedule/JobSetup.cs +++ b/src/Ombi.Schedule/JobSetup.cs @@ -1,4 +1,5 @@ -using Hangfire; +using System; +using Hangfire; using Ombi.Core.Settings; using Ombi.Schedule.Jobs; using Ombi.Schedule.Jobs.Couchpotato; @@ -12,7 +13,7 @@ using Ombi.Settings.Settings.Models; namespace Ombi.Schedule { - public class JobSetup : IJobSetup + public class JobSetup : IJobSetup, IDisposable { public JobSetup(IPlexContentSync plexContentSync, IRadarrSync radarrSync, IOmbiAutomaticUpdater updater, IEmbyContentSync embySync, IPlexUserImporter userImporter, @@ -65,5 +66,36 @@ namespace Ombi.Schedule RecurringJob.AddOrUpdate(() => _plexUserImporter.Start(), JobSettingsHelper.UserImporter(s)); RecurringJob.AddOrUpdate(() => _newsletter.Start(), JobSettingsHelper.Newsletter(s)); } + + + private bool _disposed; + protected virtual void Dispose(bool disposing) + { + if (_disposed) + return; + + if (disposing) + { + _plexContentSync?.Dispose(); + _radarrSync?.Dispose(); + _updater?.Dispose(); + _plexUserImporter?.Dispose(); + _embyContentSync?.Dispose(); + _embyUserImporter?.Dispose(); + _sonarrSync?.Dispose(); + _cpCache?.Dispose(); + _srSync?.Dispose(); + _jobSettings?.Dispose(); + _refreshMetadata?.Dispose(); + _newsletter?.Dispose(); + } + _disposed = true; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } } } diff --git a/src/Ombi/Startup.cs b/src/Ombi/Startup.cs index 1d7d67550..4aaadacb6 100644 --- a/src/Ombi/Startup.cs +++ b/src/Ombi/Startup.cs @@ -11,6 +11,7 @@ using Hangfire; using Hangfire.Console; using Hangfire.Dashboard; using Hangfire.SQLite; +using Microsoft.ApplicationInsights.Extensibility; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -85,7 +86,7 @@ namespace Ombi // This method gets called by the runtime. Use this method to add services to the container. public IServiceProvider ConfigureServices(IServiceCollection services) { - + TelemetryConfiguration.Active.DisableTelemetry = true; // Add framework services. services.AddDbContext(); @@ -183,12 +184,12 @@ namespace Ombi Authorization = new[] { new HangfireAuthorizationFilter() } }); GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 3 }); - + // Setup the scheduler var jobSetup = app.ApplicationServices.GetService(); jobSetup.Setup(); ctx.Seed(); - + var provider = new FileExtensionContentTypeProvider { Mappings = { [".map"] = "application/octet-stream" } }; app.UseStaticFiles(new StaticFileOptions() @@ -218,6 +219,8 @@ namespace Ombi name: "spa-fallback", defaults: new { controller = "Home", action = "Index" }); }); + + ombiService.Dispose(); } } diff --git a/src/Ombi/StartupExtensions.cs b/src/Ombi/StartupExtensions.cs index e4dae18e4..1c8f54b4e 100644 --- a/src/Ombi/StartupExtensions.cs +++ b/src/Ombi/StartupExtensions.cs @@ -168,6 +168,7 @@ namespace Ombi if (user == null) { context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; + context.Response.RegisterForDispose(um); await context.Response.WriteAsync("Invalid User Access Token"); } else @@ -177,6 +178,7 @@ namespace Ombi var roles = await um.GetRolesAsync(user); var principal = new GenericPrincipal(identity, roles.ToArray()); context.User = principal; + context.Response.RegisterForDispose(um); await next(); } } @@ -189,6 +191,7 @@ namespace Ombi if (!valid) { context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; + context.Response.RegisterForDispose(settingsProvider); await context.Response.WriteAsync("Invalid API Key"); } else @@ -196,6 +199,7 @@ namespace Ombi var identity = new GenericIdentity("API"); var principal = new GenericPrincipal(identity, new[] { "Admin", "ApiUser" }); context.User = principal; + context.Response.RegisterForDispose(settingsProvider); await next(); } }