From 14f60a108ab5834c67a968c8c422648f1561075c Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 29 Apr 2025 18:10:44 +0200 Subject: [PATCH 1/5] V13: Clear Member Username Cache in Load Balanced Environments (#19191) * Clear usernamekey * Odd explaining comment * Update src/Umbraco.Core/Cache/Refreshers/Implement/MemberCacheRefresher.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Make UserNameCachePrefix readonly for better immutabilityly * Move prefix to CacheKeys constants --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> # Conflicts: # src/Umbraco.Core/Cache/CacheKeys.cs --- src/Umbraco.Core/Cache/CacheKeys.cs | 2 ++ .../Implement/MemberCacheRefresher.cs | 17 ++++++++++++++--- .../Repositories/Implement/MemberRepository.cs | 7 +++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Cache/CacheKeys.cs b/src/Umbraco.Core/Cache/CacheKeys.cs index 7f8484fca4..0e75b6820d 100644 --- a/src/Umbraco.Core/Cache/CacheKeys.cs +++ b/src/Umbraco.Core/Cache/CacheKeys.cs @@ -22,4 +22,6 @@ public static class CacheKeys public const string PreviewPropertyCacheKeyPrefix = "Cache.Property.CacheValues[D:"; public const string PropertyCacheKeyPrefix = "Cache.Property.CacheValues[P:"; + + public const string MemberUserNameCachePrefix = "uRepo_userNameKey+"; } diff --git a/src/Umbraco.Core/Cache/Refreshers/Implement/MemberCacheRefresher.cs b/src/Umbraco.Core/Cache/Refreshers/Implement/MemberCacheRefresher.cs index 18809a6bbe..1c19f62576 100644 --- a/src/Umbraco.Core/Cache/Refreshers/Implement/MemberCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/Refreshers/Implement/MemberCacheRefresher.cs @@ -71,11 +71,22 @@ public sealed class MemberCacheRefresher : PayloadCacheRefresherBase(p.Id)); - memberCache.Result?.Clear(RepositoryCacheKeys.GetKey(p.Username)); + continue; } + + memberCache.Result?.Clear(RepositoryCacheKeys.GetKey(p.Id)); + memberCache.Result?.Clear(RepositoryCacheKeys.GetKey(p.Username)); + + // This specific cache key was introduced to fix an issue where the member username could not be the same as the member id, because the cache keys collided. + // This is done in a bit of a hacky way, because the cache key is created internally in the repository, but we need to clear it here. + // Ideally, we want to use a shared way of generating the key between this and the repository. + // Additionally, the RepositoryCacheKeys actually caches the string to avoid re-allocating memory; we would like to also use this in the repository + // See: + // https://github.com/umbraco/Umbraco-CMS/pull/17350 + // https://github.com/umbraco/Umbraco-CMS/pull/17815 + memberCache.Result?.Clear(RepositoryCacheKeys.GetKey(CacheKeys.MemberUserNameCachePrefix + p.Username)); } } } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs index 75ea4f365d..9adc60426f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs @@ -39,7 +39,6 @@ public class MemberRepository : ContentRepositoryBase - _memberByUsernameCachePolicy.GetByUserName(UsernameCacheKey, username, PerformGetByUsername, PerformGetAllByUsername); + _memberByUsernameCachePolicy.GetByUserName(CacheKeys.MemberUserNameCachePrefix, username, PerformGetByUsername, PerformGetAllByUsername); public int[] GetMemberIds(string[] usernames) { @@ -609,7 +608,7 @@ public class MemberRepository : ContentRepositoryBase Date: Wed, 30 Apr 2025 09:57:55 +0200 Subject: [PATCH 2/5] Updates Examine to latest patch release. (#19193) --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 0817e00c6a..48cae8dc62 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -45,8 +45,8 @@ - - + + @@ -100,4 +100,4 @@ - \ No newline at end of file + From 15a8b4066abdf4f1feae4d554441b23bff6a2400 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Wed, 30 Apr 2025 15:04:08 +0200 Subject: [PATCH 3/5] Bumped version to 15.4.0. --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index ec32c8345a..54cdf6d288 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "15.4.0-rc3", + "version": "15.4.0", "assemblyVersion": { "precision": "build" }, From fc1455e0d8d71475e272c764eb17746159a0e30b Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Sat, 3 May 2025 17:28:44 +0200 Subject: [PATCH 4/5] Bumped version to 15.4.1. --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 54cdf6d288..3780adcd49 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "15.4.0", + "version": "15.4.1", "assemblyVersion": { "precision": "build" }, From 0ad020f0ce62ab32eae127262efb31acd1137790 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 5 May 2025 07:38:31 +0200 Subject: [PATCH 5/5] Restored interface methods on obsolete IBackgroundTaskQueue (#19223) * Restore interface methods on obsolete IBackgroundTaskQueue. * Fixed typos in comment. --- src/Umbraco.Core/HostedServices/IBackgroundTaskQueue.cs | 2 +- .../HostedServices/IBackgroundTaskQueue.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/HostedServices/IBackgroundTaskQueue.cs b/src/Umbraco.Core/HostedServices/IBackgroundTaskQueue.cs index 0fef380e8f..de51cd45e0 100644 --- a/src/Umbraco.Core/HostedServices/IBackgroundTaskQueue.cs +++ b/src/Umbraco.Core/HostedServices/IBackgroundTaskQueue.cs @@ -9,7 +9,7 @@ namespace Umbraco.Cms.Core.HostedServices; public interface IBackgroundTaskQueue { /// - /// Enqueue a work item to be executed on in the background. + /// Enqueue a work item to be executed in the background. /// void QueueBackgroundWorkItem(Func workItem); diff --git a/src/Umbraco.Infrastructure/HostedServices/IBackgroundTaskQueue.cs b/src/Umbraco.Infrastructure/HostedServices/IBackgroundTaskQueue.cs index 983af4be9a..8e4a6f6a23 100644 --- a/src/Umbraco.Infrastructure/HostedServices/IBackgroundTaskQueue.cs +++ b/src/Umbraco.Infrastructure/HostedServices/IBackgroundTaskQueue.cs @@ -9,4 +9,13 @@ namespace Umbraco.Cms.Infrastructure.HostedServices; [Obsolete("This has been relocated into Umbraco.Cms.Core. This definition in Umbraco.Cms.Infrastructure is scheduled for removal in Umbraco 17.")] public interface IBackgroundTaskQueue : Core.HostedServices.IBackgroundTaskQueue { + /// + /// Enqueue a work item to be executed in the background. + /// + void QueueBackgroundWorkItem(Func workItem); + + /// + /// Dequeue the first item on the queue. + /// + Task?> DequeueAsync(CancellationToken cancellationToken); }