From 4f6415b0e5ffdc13fbd4851773a47a5cb214fc98 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 16 Nov 2017 13:33:10 -0500 Subject: [PATCH] Cache BestForTags briefly for better performance when processing releases --- .../Profiles/Delay/DelayProfileService.cs | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs b/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs index 6c3db01a7..cb0b19201 100644 --- a/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs +++ b/src/NzbDrone.Core/Profiles/Delay/DelayProfileService.cs @@ -1,5 +1,7 @@ +using System; using System.Collections.Generic; using System.Linq; +using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Profiles.Delay @@ -20,22 +22,29 @@ namespace NzbDrone.Core.Profiles.Delay public class DelayProfileService : IDelayProfileService { private readonly IDelayProfileRepository _repo; + private readonly ICached _bestForTagsCache; - public DelayProfileService(IDelayProfileRepository repo) + public DelayProfileService(IDelayProfileRepository repo, ICacheManager cacheManager) { _repo = repo; + _bestForTagsCache = cacheManager.GetCache(GetType(), "best"); } public DelayProfile Add(DelayProfile profile) { profile.Order = _repo.Count(); - return _repo.Insert(profile); + var result = _repo.Insert(profile); + _bestForTagsCache.Clear(); + + return result; } public DelayProfile Update(DelayProfile profile) { - return _repo.Update(profile); + var result = _repo.Update(profile); + _bestForTagsCache.Clear(); + return result; } public void Delete(int id) @@ -52,6 +61,7 @@ namespace NzbDrone.Core.Profiles.Delay } _repo.UpdateMany(all); + _bestForTagsCache.Clear(); } public List All() @@ -77,8 +87,15 @@ namespace NzbDrone.Core.Profiles.Delay public DelayProfile BestForTags(HashSet tagIds) { - return _repo.All().Where(r => r.Tags.Intersect(tagIds).Any() || r.Tags.Empty()) - .OrderBy(d => d.Order).First(); + var key = "-" + tagIds.Select(v => v.ToString()).Join(","); + return _bestForTagsCache.Get(key, () => FetchBestForTags(tagIds), TimeSpan.FromSeconds(30)); + } + + private DelayProfile FetchBestForTags(HashSet tagIds) + { + return _repo.All() + .Where(r => r.Tags.Intersect(tagIds).Any() || r.Tags.Empty()) + .OrderBy(d => d.Order).First(); } public List Reorder(int id, int? afterId)