diff --git a/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs b/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs index 0ae721943d..14fef80f0d 100644 --- a/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs @@ -26,6 +26,9 @@ namespace Umbraco.Core.Cache public DeepCloneRuntimeCacheProvider(IRuntimeCacheProvider innerProvider) { + if (innerProvider.GetType() == typeof(DeepCloneRuntimeCacheProvider)) + throw new InvalidOperationException("A " + typeof(DeepCloneRuntimeCacheProvider) + " cannot wrap another instance of " + typeof(DeepCloneRuntimeCacheProvider)); + InnerProvider = innerProvider; } @@ -105,9 +108,11 @@ namespace Umbraco.Core.Cache var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache if (value == null) return null; // do not store null values (backward compat) + //Clone/reset to go into the cache return CheckCloneableAndTracksChanges(value); }, timeout, isSliding, priority, removedCallback, dependentFiles); + //Clone/reset to go out of the cache return CheckCloneableAndTracksChanges(cached); } diff --git a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs index 22b99ac732..d40386ebbc 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs @@ -277,7 +277,7 @@ AND umbracoNode.id <> @id", public PreValueCollection GetPreValuesCollectionByDataTypeId(int dataTypeId) { var collection = GetCachedPreValueCollection(dataTypeId); - return collection == null ? null : (PreValueCollection) collection.DeepClone(); + return collection; } public string GetPreValueAsString(int preValueId) diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index ff0f9e9028..bfb92ccf1a 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -48,7 +48,12 @@ namespace Umbraco.Core.Persistence _cacheHelper.IsolatedRuntimeCache.CacheFactory = type => { var cache = origFactory(type); - return new DeepCloneRuntimeCacheProvider(cache); + + //if the result is already a DeepCloneRuntimeCacheProvider then return it, otherwise + //wrap the result with a DeepCloneRuntimeCacheProvider + return cache is DeepCloneRuntimeCacheProvider + ? cache + : new DeepCloneRuntimeCacheProvider(cache); }; }