Fix Nucache rebuilding more type caches than necessary (#12785)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -26,7 +26,7 @@ public class PublishedSnapshotRebuilder : IPublishedSnapshotRebuilder
|
||||
/// <inheritdoc />
|
||||
public void Rebuild()
|
||||
{
|
||||
_publishedSnapshotService.Rebuild();
|
||||
_publishedSnapshotService.RebuildAll();
|
||||
_distributedCache.RefreshAllPublishedSnapshot();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -34,7 +34,8 @@ public class PublishedSnapshotCacheStatusController : UmbracoAuthorizedApiContro
|
||||
[HttpPost]
|
||||
public string RebuildDbCache()
|
||||
{
|
||||
_publishedSnapshotService.Rebuild();
|
||||
//Rebuild All
|
||||
_publishedSnapshotService.RebuildAll();
|
||||
return _publishedSnapshotStatus.GetStatus();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user