From 63fa6b8b028d0a9ea4c015764031acb039be03aa Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 22 Jul 2018 17:56:43 +0200 Subject: [PATCH] Unified some cleaners. --- ...hemaIndexCleaner.cs => AppGrainCleaner.cs} | 8 ++-- .../{CleanerGrain.cs => AppCleanerGrain.cs} | 19 +++++---- .../Backup/BackupGrain.cs | 13 ++++++ .../Backup/EnqueueAppToCleanerMiddleware.cs | 4 +- .../{ICleanerGrain.cs => IAppCleanerGrain.cs} | 2 +- .../Backup/IBackupGrain.cs | 3 +- .../ICleanableAppGrain.cs | 17 ++++++++ ...IAppStorage.cs => ICleanableAppStorage.cs} | 2 +- .../Rules/Indexes/IRulesByAppIndex.cs | 5 +-- .../Rules/Indexes/RuleIndexCleaner.cs | 31 -------------- .../Schemas/Indexes/ISchemasByAppIndex.cs | 5 +-- .../Tags/GrainTagService.cs | 2 +- src/Squidex/Config/Domain/EntitiesServices.cs | 16 ++++---- src/Squidex/Config/Orleans/SiloWrapper.cs | 2 + ...leanerTests.cs => AppGrainCleanerTests.cs} | 14 +++---- .../EnqueueAppToCleanerMiddlewareTests.cs | 4 +- .../Indexes/SchemaIndexCleanerTests.cs | 40 ------------------- 17 files changed, 74 insertions(+), 113 deletions(-) rename src/Squidex.Domain.Apps.Entities/{Schemas/Indexes/SchemaIndexCleaner.cs => AppGrainCleaner.cs} (73%) rename src/Squidex.Domain.Apps.Entities/Backup/{CleanerGrain.cs => AppCleanerGrain.cs} (87%) rename src/Squidex.Domain.Apps.Entities/Backup/{ICleanerGrain.cs => IAppCleanerGrain.cs} (90%) create mode 100644 src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs rename src/Squidex.Domain.Apps.Entities/{IAppStorage.cs => ICleanableAppStorage.cs} (92%) delete mode 100644 src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs rename tests/Squidex.Domain.Apps.Entities.Tests/{Rules/Indexes/RuleIndexCleanerTests.cs => AppGrainCleanerTests.cs} (67%) delete mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs b/src/Squidex.Domain.Apps.Entities/AppGrainCleaner.cs similarity index 73% rename from src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs rename to src/Squidex.Domain.Apps.Entities/AppGrainCleaner.cs index 3945e7d1c..1d777f3e1 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs +++ b/src/Squidex.Domain.Apps.Entities/AppGrainCleaner.cs @@ -10,13 +10,13 @@ using System.Threading.Tasks; using Orleans; using Squidex.Infrastructure; -namespace Squidex.Domain.Apps.Entities.Schemas.Indexes +namespace Squidex.Domain.Apps.Entities { - public sealed class SchemaIndexCleaner : IAppStorage + public sealed class AppGrainCleaner : ICleanableAppStorage where T : ICleanableAppGrain { private readonly IGrainFactory grainFactory; - public SchemaIndexCleaner(IGrainFactory grainFactory) + public AppGrainCleaner(IGrainFactory grainFactory) { Guard.NotNull(grainFactory, nameof(grainFactory)); @@ -25,7 +25,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes public Task ClearAsync(Guid appId) { - return grainFactory.GetGrain(appId).ClearAsync(); + return grainFactory.GetGrain(appId).ClearAsync(); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs b/src/Squidex.Domain.Apps.Entities/Backup/AppCleanerGrain.cs similarity index 87% rename from src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs rename to src/Squidex.Domain.Apps.Entities/Backup/AppCleanerGrain.cs index ffdeafa00..d5724e662 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/AppCleanerGrain.cs @@ -21,16 +21,17 @@ using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Orleans; using Squidex.Infrastructure.States; +using Squidex.Infrastructure.Tasks; namespace Squidex.Domain.Apps.Entities.Backup { [Reentrant] - public sealed class CleanerGrain : GrainOfString, IRemindable, ICleanerGrain + public sealed class AppCleanerGrain : GrainOfString, IRemindable, IAppCleanerGrain { private readonly IGrainFactory grainFactory; private readonly IStore store; private readonly IEventStore eventStore; - private readonly IEnumerable storages; + private readonly IEnumerable storages; private IPersistence persistence; private bool isCleaning; private State state = new State(); @@ -43,7 +44,7 @@ namespace Squidex.Domain.Apps.Entities.Backup public HashSet PendingApps { get; set; } = new HashSet(); } - public CleanerGrain(IGrainFactory grainFactory, IEventStore eventStore, IStore store, IEnumerable storages) + public AppCleanerGrain(IGrainFactory grainFactory, IEventStore eventStore, IStore store, IEnumerable storages) { Guard.NotNull(grainFactory, nameof(grainFactory)); Guard.NotNull(store, nameof(store)); @@ -60,9 +61,9 @@ namespace Squidex.Domain.Apps.Entities.Backup public async override Task OnActivateAsync(string key) { - await RegisterOrUpdateReminder("Default", TimeSpan.Zero, TimeSpan.FromMinutes(10)); + await RegisterOrUpdateReminder("Default", TimeSpan.Zero, TimeSpan.FromMinutes(2)); - persistence = store.WithSnapshots(Guid.Empty, s => + persistence = store.WithSnapshots(Guid.Empty, s => { state = s; }); @@ -81,12 +82,16 @@ namespace Squidex.Domain.Apps.Entities.Backup public Task ActivateAsync() { - return CleanAsync(); + CleanAsync().Forget(); + + return TaskHelper.Done; } public Task ReceiveReminder(string reminderName, TickStatus status) { - return CleanAsync(); + CleanAsync().Forget(); + + return TaskHelper.Done; } private async Task CleanAsync() diff --git a/src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs b/src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs index f1d0a8882..6aa82decd 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs @@ -84,6 +84,19 @@ namespace Squidex.Domain.Apps.Entities.Backup await CleanupAsync(); } + public async Task ClearAsync() + { + foreach (var job in state.Jobs) + { + await CleanupArchiveAsync(job); + await CleanupBackupAsync(job); + } + + state = new BackupState(); + + await persistence.DeleteAsync(); + } + private async Task ReadAsync() { await persistence.ReadAsync(); diff --git a/src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs index 3e6edfbcf..2d479892b 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs @@ -17,13 +17,13 @@ namespace Squidex.Domain.Apps.Entities.Backup { public sealed class EnqueueAppToCleanerMiddleware : ICommandMiddleware { - private readonly ICleanerGrain cleaner; + private readonly IAppCleanerGrain cleaner; public EnqueueAppToCleanerMiddleware(IGrainFactory grainFactory) { Guard.NotNull(grainFactory, nameof(grainFactory)); - cleaner = grainFactory.GetGrain(SingleGrain.Id); + cleaner = grainFactory.GetGrain(SingleGrain.Id); } public async Task HandleAsync(CommandContext context, Func next) diff --git a/src/Squidex.Domain.Apps.Entities/Backup/ICleanerGrain.cs b/src/Squidex.Domain.Apps.Entities/Backup/IAppCleanerGrain.cs similarity index 90% rename from src/Squidex.Domain.Apps.Entities/Backup/ICleanerGrain.cs rename to src/Squidex.Domain.Apps.Entities/Backup/IAppCleanerGrain.cs index 82077e895..0059a4629 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/ICleanerGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/IAppCleanerGrain.cs @@ -11,7 +11,7 @@ using Squidex.Infrastructure.Orleans; namespace Squidex.Domain.Apps.Entities.Backup { - public interface ICleanerGrain : IBackgroundGrain + public interface IAppCleanerGrain : IBackgroundGrain { Task EnqueueAppAsync(Guid appId); } diff --git a/src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs b/src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs index 21f66e2ff..ec545f3dd 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs @@ -8,12 +8,11 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Orleans; using Squidex.Infrastructure.Orleans; namespace Squidex.Domain.Apps.Entities.Backup { - public interface IBackupGrain : IGrainWithGuidKey + public interface IBackupGrain : ICleanableAppGrain { Task RunAsync(); diff --git a/src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs b/src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs new file mode 100644 index 000000000..4c9d97206 --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Threading.Tasks; +using Orleans; + +namespace Squidex.Domain.Apps.Entities +{ + public interface ICleanableAppGrain : IGrainWithGuidKey + { + Task ClearAsync(); + } +} diff --git a/src/Squidex.Domain.Apps.Entities/IAppStorage.cs b/src/Squidex.Domain.Apps.Entities/ICleanableAppStorage.cs similarity index 92% rename from src/Squidex.Domain.Apps.Entities/IAppStorage.cs rename to src/Squidex.Domain.Apps.Entities/ICleanableAppStorage.cs index 16a051157..244388906 100644 --- a/src/Squidex.Domain.Apps.Entities/IAppStorage.cs +++ b/src/Squidex.Domain.Apps.Entities/ICleanableAppStorage.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace Squidex.Domain.Apps.Entities { - public interface IAppStorage + public interface ICleanableAppStorage { Task ClearAsync(Guid appId); } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs index a1a54459e..00fc680b0 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs @@ -8,11 +8,10 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Orleans; namespace Squidex.Domain.Apps.Entities.Rules { - public interface IRulesByAppIndex : IGrainWithGuidKey + public interface IRulesByAppIndex : ICleanableAppGrain { Task AddRuleAsync(Guid ruleId); @@ -20,8 +19,6 @@ namespace Squidex.Domain.Apps.Entities.Rules Task RebuildAsync(HashSet rules); - Task ClearAsync(); - Task> GetRuleIdsAsync(); } } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs deleted file mode 100644 index 04af08f23..000000000 --- a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs +++ /dev/null @@ -1,31 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Threading.Tasks; -using Orleans; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Apps.Entities.Rules.Indexes -{ - public sealed class RuleIndexCleaner : IAppStorage - { - private readonly IGrainFactory grainFactory; - - public RuleIndexCleaner(IGrainFactory grainFactory) - { - Guard.NotNull(grainFactory, nameof(grainFactory)); - - this.grainFactory = grainFactory; - } - - public Task ClearAsync(Guid appId) - { - return grainFactory.GetGrain(appId).ClearAsync(); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs index 58b9f9e1f..17da42a4e 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs @@ -8,18 +8,15 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Orleans; namespace Squidex.Domain.Apps.Entities.Schemas { - public interface ISchemasByAppIndex : IGrainWithGuidKey + public interface ISchemasByAppIndex : ICleanableAppGrain { Task AddSchemaAsync(Guid schemaId, string name); Task RemoveSchemaAsync(Guid schemaId); - Task ClearAsync(); - Task RebuildAsync(Dictionary schemas); Task GetSchemaIdAsync(string name); diff --git a/src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs b/src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs index 714759843..5eafa38e2 100644 --- a/src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs +++ b/src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs @@ -13,7 +13,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Tags { - public sealed class GrainTagService : ITagService, IAppStorage + public sealed class GrainTagService : ITagService, ICleanableAppStorage { private readonly IGrainFactory grainFactory; diff --git a/src/Squidex/Config/Domain/EntitiesServices.cs b/src/Squidex/Config/Domain/EntitiesServices.cs index 9f1da9a04..5d58210c4 100644 --- a/src/Squidex/Config/Domain/EntitiesServices.cs +++ b/src/Squidex/Config/Domain/EntitiesServices.cs @@ -52,8 +52,7 @@ namespace Squidex.Config.Domain c.GetRequiredService>(), c.GetRequiredService(), exposeSourceUrl)) - .As() - .As(); + .As().As(); services.AddSingletonAs() .As(); @@ -86,7 +85,7 @@ namespace Squidex.Config.Domain .AsSelf(); services.AddSingletonAs() - .As().As(); + .As().As(); services.AddSingletonAs() .As>(); @@ -94,11 +93,14 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As>(); - services.AddSingletonAs() - .As(); + services.AddSingletonAs>() + .As(); - services.AddSingletonAs() - .As(); + services.AddSingletonAs>() + .As(); + + services.AddSingletonAs>() + .As(); services.AddSingletonAs() .As(); diff --git a/src/Squidex/Config/Orleans/SiloWrapper.cs b/src/Squidex/Config/Orleans/SiloWrapper.cs index 62139bb06..38292f58c 100644 --- a/src/Squidex/Config/Orleans/SiloWrapper.cs +++ b/src/Squidex/Config/Orleans/SiloWrapper.cs @@ -15,6 +15,7 @@ using Orleans; using Orleans.Configuration; using Orleans.Hosting; using Squidex.Config.Domain; +using Squidex.Domain.Apps.Entities.Backup; using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Rules; using Squidex.Infrastructure; @@ -62,6 +63,7 @@ namespace Squidex.Config.Orleans .EnableDirectClient() .AddIncomingGrainCallFilter() .AddStartupTask>() + .AddStartupTask>() .AddStartupTask>() .AddStartupTask>() .AddStartupTask((services, ct) => diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/AppGrainCleanerTests.cs similarity index 67% rename from tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs rename to tests/Squidex.Domain.Apps.Entities.Tests/AppGrainCleanerTests.cs index 8d60f0d60..db2ed08d1 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/AppGrainCleanerTests.cs @@ -11,21 +11,21 @@ using FakeItEasy; using Orleans; using Xunit; -namespace Squidex.Domain.Apps.Entities.Rules.Indexes +namespace Squidex.Domain.Apps.Entities { - public class RuleIndexCleanerTests + public class AppGrainCleanerTests { private readonly IGrainFactory grainFactory = A.Fake(); - private readonly IRulesByAppIndex index = A.Fake(); + private readonly ICleanableAppGrain index = A.Fake(); private readonly Guid appId = Guid.NewGuid(); - private readonly RuleIndexCleaner sut; + private readonly AppGrainCleaner sut; - public RuleIndexCleanerTests() + public AppGrainCleanerTests() { - A.CallTo(() => grainFactory.GetGrain(appId, null)) + A.CallTo(() => grainFactory.GetGrain(appId, null)) .Returns(index); - sut = new RuleIndexCleaner(grainFactory); + sut = new AppGrainCleaner(grainFactory); } [Fact] diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs index 80819b22f..0a8c24350 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs @@ -20,13 +20,13 @@ namespace Squidex.Domain.Apps.Entities.Backup { private readonly IGrainFactory grainFactory = A.Fake(); private readonly ICommandBus commandBus = A.Fake(); - private readonly ICleanerGrain index = A.Fake(); + private readonly IAppCleanerGrain index = A.Fake(); private readonly Guid appId = Guid.NewGuid(); private readonly EnqueueAppToCleanerMiddleware sut; public EnqueueAppToCleanerMiddlewareTests() { - A.CallTo(() => grainFactory.GetGrain(SingleGrain.Id, null)) + A.CallTo(() => grainFactory.GetGrain(SingleGrain.Id, null)) .Returns(index); sut = new EnqueueAppToCleanerMiddleware(grainFactory); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs deleted file mode 100644 index 721a5c21a..000000000 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Threading.Tasks; -using FakeItEasy; -using Orleans; -using Xunit; - -namespace Squidex.Domain.Apps.Entities.Schemas.Indexes -{ - public class SchemaIndexCleanerTests - { - private readonly IGrainFactory grainFactory = A.Fake(); - private readonly ISchemasByAppIndex index = A.Fake(); - private readonly Guid appId = Guid.NewGuid(); - private readonly SchemaIndexCleaner sut; - - public SchemaIndexCleanerTests() - { - A.CallTo(() => grainFactory.GetGrain(appId, null)) - .Returns(index); - - sut = new SchemaIndexCleaner(grainFactory); - } - - [Fact] - public async Task Should_forward_to_index() - { - await sut.ClearAsync(appId); - - A.CallTo(() => index.ClearAsync()) - .MustHaveHappened(); - } - } -}