notes/cleanup

This commit is contained in:
Shannon
2021-01-04 12:56:44 +11:00
parent d1d664c449
commit cbc08fb008
2 changed files with 22 additions and 23 deletions

View File

@@ -4,14 +4,12 @@ using System.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration.Models;
using Umbraco.Core.Hosting;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.Scoping;
using Umbraco.Core.Sync;
using Umbraco.Web;
namespace Umbraco.Core.Sync
@@ -19,9 +17,6 @@ namespace Umbraco.Core.Sync
/// <summary>
/// An <see cref="IServerMessenger"/> implementation that works by storing messages in the database.
/// </summary>
/// <remarks>
/// This binds to appropriate umbraco events in order to trigger the Boot(), Sync() & FlushBatch() calls
/// </remarks>
public class BatchedDatabaseServerMessenger : DatabaseServerMessenger
{
private readonly IRequestCache _requestCache;
@@ -48,37 +43,41 @@ namespace Umbraco.Core.Sync
_requestAccessor = requestAccessor;
}
/// <inheritdoc/>
protected override void DeliverRemote(ICacheRefresher refresher, MessageType messageType, IEnumerable<object> ids = null, string json = null)
{
var idsA = ids?.ToArray();
Type arrayType;
if (GetArrayType(idsA, out arrayType) == false)
if (GetArrayType(idsA, out Type arrayType) == false)
{
throw new ArgumentException("All items must be of the same type, either int or Guid.", nameof(ids));
}
BatchMessage(refresher, messageType, idsA, arrayType, json);
}
/// <inheritdoc/>
public override void SendMessages()
{
var batch = GetBatch(false);
ICollection<RefreshInstructionEnvelope> batch = GetBatch(false);
if (batch == null)
{
return;
}
var instructions = batch.SelectMany(x => x.Instructions).ToArray();
RefreshInstruction[] instructions = batch.SelectMany(x => x.Instructions).ToArray();
batch.Clear();
// Write the instructions but only create JSON blobs with a max instruction count equal to MaxProcessingInstructionCount
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
foreach (var instructionsBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
foreach (IEnumerable<RefreshInstruction> instructionsBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
{
WriteInstructions(scope, instructionsBatch);
}
scope.Complete();
}
}
private void WriteInstructions(IScope scope, IEnumerable<RefreshInstruction> instructions)
@@ -93,12 +92,14 @@ namespace Umbraco.Core.Sync
scope.Database.Insert(dto);
}
protected ICollection<RefreshInstructionEnvelope> GetBatch(bool create)
private ICollection<RefreshInstructionEnvelope> GetBatch(bool create)
{
var key = nameof(BatchedDatabaseServerMessenger);
if (!_requestCache.IsAvailable)
{
return null;
}
// no thread-safety here because it'll run in only 1 thread (request) at a time
var batch = (ICollection<RefreshInstructionEnvelope>)_requestCache.Get(key);
@@ -111,26 +112,27 @@ namespace Umbraco.Core.Sync
return batch;
}
protected void BatchMessage(
private void BatchMessage(
ICacheRefresher refresher,
MessageType messageType,
IEnumerable<object> ids = null,
Type idType = null,
string json = null)
{
var batch = GetBatch(true);
var instructions = RefreshInstruction.GetInstructions(refresher, messageType, ids, idType, json);
ICollection<RefreshInstructionEnvelope> batch = GetBatch(true);
IEnumerable<RefreshInstruction> instructions = RefreshInstruction.GetInstructions(refresher, messageType, ids, idType, json);
// batch if we can, else write to DB immediately
if (batch == null)
{
//only write the json blob with a maximum count of the MaxProcessingInstructionCount
using (var scope = ScopeProvider.CreateScope())
// only write the json blob with a maximum count of the MaxProcessingInstructionCount
using (IScope scope = ScopeProvider.CreateScope())
{
foreach (var maxBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
foreach (IEnumerable<RefreshInstruction> maxBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
{
WriteInstructions(scope, maxBatch);
}
scope.Complete();
}
}

View File

@@ -25,9 +25,6 @@ namespace Umbraco.Core.Sync
/// </summary>
public abstract class DatabaseServerMessenger : ServerMessengerBase
{
// TODO: This class is never used directly, only BatchedDatabaseServerMessenger is used so
// this could/should be combined with that or made abstract and/or just cleaned up.
// TODO: This class needs to be split into a service/repo for DB access
/*
@@ -55,7 +52,7 @@ namespace Umbraco.Core.Sync
/// <summary>
/// Initializes a new instance of the <see cref="DatabaseServerMessenger"/> class.
/// </summary>
public DatabaseServerMessenger(
protected DatabaseServerMessenger(
IMainDom mainDom,
IScopeProvider scopeProvider,
IProfilingLogger proflog,