Fix Nucache rebuilding more type caches than necessary (#12785)

This commit is contained in:
Chad
2022-09-08 23:17:54 +12:00
committed by GitHub
parent 5f42cf0cf7
commit fdc1b02b4f
6 changed files with 47 additions and 11 deletions

View File

@@ -61,6 +61,22 @@ public interface IPublishedSnapshotService : IDisposable
IReadOnlyCollection<int>? mediaTypeIds = null,
IReadOnlyCollection<int>? memberTypeIds = null);
/// <summary>
/// Rebuilds all internal database caches (but does not reload).
/// </summary>
/// <remarks>
/// <para>
/// Forces the snapshot service to rebuild its internal database caches. For instance, some caches
/// may rely on a database table to store pre-serialized version of documents.
/// </para>
/// <para>
/// This does *not* reload the caches. Caches need to be reloaded, for instance via
/// <see cref="DistributedCache" /> RefreshAllPublishedSnapshot method.
/// </para>
/// </remarks>
void RebuildAll() => Rebuild(Array.Empty<int>(), Array.Empty<int>(), Array.Empty<int>());
/* An IPublishedCachesService implementation can rely on transaction-level events to update
* its internal, database-level data, as these events are purely internal. However, it cannot
* rely on cache refreshers CacheUpdated events to update itself, as these events are external

View File

@@ -26,7 +26,7 @@ public class PublishedSnapshotRebuilder : IPublishedSnapshotRebuilder
/// <inheritdoc />
public void Rebuild()
{
_publishedSnapshotService.Rebuild();
_publishedSnapshotService.RebuildAll();
_distributedCache.RefreshAllPublishedSnapshot();
}
}

View File

@@ -97,6 +97,7 @@ public class NuCacheContentRepository : RepositoryBase, INuCacheContentRepositor
OnRepositoryRefreshed(serializer, member, false);
}
/// <inheritdoc/>
public void Rebuild(
IReadOnlyCollection<int>? contentTypeIds = null,
IReadOnlyCollection<int>? mediaTypeIds = null,
@@ -107,9 +108,20 @@ public class NuCacheContentRepository : RepositoryBase, INuCacheContentRepositor
| ContentCacheDataSerializerEntityType.Media
| ContentCacheDataSerializerEntityType.Member);
RebuildContentDbCache(serializer, _nucacheSettings.Value.SqlPageSize, contentTypeIds);
RebuildMediaDbCache(serializer, _nucacheSettings.Value.SqlPageSize, mediaTypeIds);
RebuildMemberDbCache(serializer, _nucacheSettings.Value.SqlPageSize, memberTypeIds);
if(contentTypeIds != null)
{
RebuildContentDbCache(serializer, _nucacheSettings.Value.SqlPageSize, contentTypeIds);
}
if (mediaTypeIds != null)
{
RebuildMediaDbCache(serializer, _nucacheSettings.Value.SqlPageSize, mediaTypeIds);
}
if (memberTypeIds != null)
{
RebuildMemberDbCache(serializer, _nucacheSettings.Value.SqlPageSize, memberTypeIds);
}
}
// assumes content tree lock

View File

@@ -51,7 +51,7 @@ public class NuCacheContentService : RepositoryService, INuCacheContentService
using (_profilingLogger.TraceDuration<NuCacheContentService>(
$"Rebuilding NuCache database with {serializer} serializer"))
{
Rebuild();
RebuildAll();
_keyValueService.SetValue(NuCacheSerializerKey, serializer.ToString());
}
}
@@ -113,11 +113,17 @@ public class NuCacheContentService : RepositoryService, INuCacheContentService
public void RefreshMember(IMember member)
=> _repository.RefreshMember(member);
/// <inheritdoc />
public void RebuildAll()
{
Rebuild(Array.Empty<int>(), Array.Empty<int>(), Array.Empty<int>());
}
/// <inheritdoc />
public void Rebuild(
IReadOnlyCollection<int>? contentTypeIds = null,
IReadOnlyCollection<int>? mediaTypeIds = null,
IReadOnlyCollection<int>? memberTypeIds = null)
IReadOnlyCollection<int>? contentTypeIds = null,
IReadOnlyCollection<int>? mediaTypeIds = null,
IReadOnlyCollection<int>? memberTypeIds = null)
{
using (ICoreScope scope = ScopeProvider.CreateCoreScope(repositoryCacheMode: RepositoryCacheMode.Scoped))
{

View File

@@ -34,7 +34,8 @@ public class PublishedSnapshotCacheStatusController : UmbracoAuthorizedApiContro
[HttpPost]
public string RebuildDbCache()
{
_publishedSnapshotService.Rebuild();
//Rebuild All
_publishedSnapshotService.RebuildAll();
return _publishedSnapshotStatus.GetStatus();
}

View File

@@ -1,3 +1,4 @@
using System;
using NUnit.Framework;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.PublishedCache;
@@ -59,7 +60,7 @@ public class NuCacheRebuildTests : UmbracoIntegrationTest
Assert.AreEqual("hello", segment);
PublishedSnapshotService.Rebuild();
PublishedSnapshotService.RebuildAll();
cachedContent = ContentService.GetById(content.Id);
segment = urlSegmentProvider.GetUrlSegment(cachedContent);
@@ -76,7 +77,7 @@ public class NuCacheRebuildTests : UmbracoIntegrationTest
// The page has now been published, so we should see the new url segment
Assert.AreEqual("goodbye", segment);
PublishedSnapshotService.Rebuild();
PublishedSnapshotService.RebuildAll();
cachedContent = ContentService.GetById(content.Id);
segment = urlSegmentProvider.GetUrlSegment(cachedContent);