Initialize important services before unattended installs (#17366)

* Added new notification to hook in after the premigrations and use this to init different services.

* Force MaxDegreeOfParallelism to 1, while investigating scopes

* Tried some more workarounds

* Updated scopes and changed parallel to non parallel to ensure migration works

* Missing scope

* Make it parallel again - The secret is, the SuppressFlow needs to be when you create the task, but not on the await!.

* Fixed issue when DEBUG_SCOPES is not added to tests.

* Remove test exception

* Try build on ubuntu again, even that we know it can be stuck. Just a test to see if all tests pass

* Updated comment

---------

Co-authored-by: kjac <kja@umbraco.dk>
This commit is contained in:
Bjarke Berg
2024-10-28 12:10:38 +01:00
committed by GitHub
parent 5cc0a35665
commit 935c3b8e42
35 changed files with 300 additions and 225 deletions

View File

@@ -72,15 +72,18 @@ internal sealed class DocumentCacheService : IDocumentCacheService
public async Task<IPublishedContent?> GetByKeyAsync(Guid key, bool? preview = null)
{
using ICoreScope scope = _scopeProvider.CreateCoreScope();
bool calculatedPreview = preview ?? GetPreview();
ContentCacheNode? contentCacheNode = await _hybridCache.GetOrCreateAsync(
GetCacheKey(key, calculatedPreview), // Unique key to the cache entry
async cancel => await _databaseCacheRepository.GetContentSourceAsync(key, calculatedPreview));
async cancel =>
{
using ICoreScope scope = _scopeProvider.CreateCoreScope();
ContentCacheNode? contentCacheNode = await _databaseCacheRepository.GetContentSourceAsync(key, calculatedPreview);
scope.Complete();
return contentCacheNode;
});
scope.Complete();
return contentCacheNode is null ? null : _publishedContentFactory.ToIPublishedContent(contentCacheNode, calculatedPreview).CreateModel(_publishedModelFactory);
}
@@ -99,11 +102,16 @@ internal sealed class DocumentCacheService : IDocumentCacheService
bool calculatedPreview = preview ?? GetPreview();
using ICoreScope scope = _scopeProvider.CreateCoreScope();
ContentCacheNode? contentCacheNode = await _hybridCache.GetOrCreateAsync(
GetCacheKey(keyAttempt.Result, calculatedPreview), // Unique key to the cache entry
async cancel => await _databaseCacheRepository.GetContentSourceAsync(id, calculatedPreview));
scope.Complete();
async cancel =>
{
using ICoreScope scope = _scopeProvider.CreateCoreScope();
ContentCacheNode? contentCacheNode = await _databaseCacheRepository.GetContentSourceAsync(id, calculatedPreview);
scope.Complete();
return contentCacheNode;
});
return contentCacheNode is null ? null : _publishedContentFactory.ToIPublishedContent(contentCacheNode, calculatedPreview).CreateModel(_publishedModelFactory);;
}
@@ -120,8 +128,6 @@ internal sealed class DocumentCacheService : IDocumentCacheService
public async Task SeedAsync(CancellationToken cancellationToken)
{
using ICoreScope scope = _scopeProvider.CreateCoreScope();
foreach (Guid key in SeedKeys)
{
if(cancellationToken.IsCancellationRequested)
@@ -131,31 +137,32 @@ internal sealed class DocumentCacheService : IDocumentCacheService
var cacheKey = GetCacheKey(key, false);
// We'll use GetOrCreateAsync because it may be in the second level cache, in which case we don't have to re-seed.
ContentCacheNode? cachedValue = await _hybridCache.GetOrCreateAsync<ContentCacheNode?>(
cacheKey,
async cancel =>
{
ContentCacheNode? cacheNode = await _databaseCacheRepository.GetContentSourceAsync(key, false);
// We don't want to seed drafts
if (cacheNode is null || cacheNode.IsDraft)
// We'll use GetOrCreateAsync because it may be in the second level cache, in which case we don't have to re-seed.
ContentCacheNode? cachedValue = await _hybridCache.GetOrCreateAsync<ContentCacheNode?>(
cacheKey,
async cancel =>
{
return null;
}
using ICoreScope scope = _scopeProvider.CreateCoreScope();
return cacheNode;
},
GetSeedEntryOptions());
ContentCacheNode? cacheNode = await _databaseCacheRepository.GetContentSourceAsync(key, false);
// If the value is null, it's likely because
if (cachedValue is null)
scope.Complete();
// We don't want to seed drafts
if (cacheNode is null || cacheNode.IsDraft)
{
return null;
}
return cacheNode;
},
GetSeedEntryOptions());
// If the value is null, it's likely because
if (cachedValue is null)
{
await _hybridCache.RemoveAsync(cacheKey);
}
}
scope.Complete();
}
private HybridCacheEntryOptions GetSeedEntryOptions() => new()
@@ -257,6 +264,7 @@ internal sealed class DocumentCacheService : IDocumentCacheService
using ICoreScope scope = _scopeProvider.CreateCoreScope();
_databaseCacheRepository.Rebuild(contentTypeIds.ToList());
IEnumerable<ContentCacheNode> contentByContentTypeKey = _databaseCacheRepository.GetContentByContentTypeKey(contentTypeIds.Select(x => _idKeyMap.GetKeyForId(x, UmbracoObjectTypes.DocumentType).Result), ContentCacheDataSerializerEntityType.Document);
scope.Complete();
foreach (ContentCacheNode content in contentByContentTypeKey)
{
@@ -268,6 +276,6 @@ internal sealed class DocumentCacheService : IDocumentCacheService
}
}
scope.Complete();
}
}