From 2b4c60fe6b3e4d34e68d00d95f151f43e3370bfb Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 25 Aug 2022 21:32:01 +0200 Subject: [PATCH] No parallel updates when in transaction. (#915) * No parallel updates when in transaction. * Option for clustering. --- .../Contents/MongoContentRepository.cs | 7 ++++--- .../Contents/MongoContentRepository_SnapshotStore.cs | 5 ++--- .../Contents/ContentOptions.cs | 2 ++ backend/src/Squidex/appsettings.json | 5 +++++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index a6b818e44..a2c43b8b1 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -26,6 +26,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents { private readonly MongoContentCollection collectionComplete; private readonly MongoContentCollection collectionPublished; + private readonly ContentOptions options; private readonly IMongoDatabase database; private readonly IAppProvider appProvider; @@ -42,7 +43,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents public MongoContentRepository(IMongoDatabase database, IAppProvider appProvider, IOptions options) { + this.appProvider = appProvider; this.database = database; + this.options = options.Value; collectionComplete = new MongoContentCollection("States_Contents_All3", database, @@ -51,8 +54,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents collectionPublished = new MongoContentCollection("States_Contents_Published3", database, ReadPreference.Secondary, options.Value.OptimizeForSelfHosting); - - this.appProvider = appProvider; } public async Task InitializeAsync( @@ -64,7 +65,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents var clusterVersion = await database.GetMajorVersionAsync(ct); var clusteredAsReplica = database.Client.Cluster.Description.Type == ClusterType.ReplicaSet; - CanUseTransactions = clusteredAsReplica && clusterVersion >= 4; + CanUseTransactions = clusteredAsReplica && clusterVersion >= 4 && options.UseTransactions; } public IAsyncEnumerable StreamAll(DomainId appId, HashSet? schemaIds, diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs index a5f5f65f3..7c9bb60d5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs @@ -106,9 +106,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents // Make an update with full transaction support to be more consistent. await session.WithTransactionAsync(async (session, ct) => { - await Task.WhenAll( - UpsertVersionedCompleteAsync(session, job, ct), - UpsertVersionedPublishedAsync(session, job, ct)); + await UpsertVersionedCompleteAsync(session, job, ct); + await UpsertVersionedPublishedAsync(session, job, ct); return true; }, null, ct); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs index ac93f714c..f198a186d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentOptions.cs @@ -13,6 +13,8 @@ namespace Squidex.Domain.Apps.Entities.Contents public bool OptimizeForSelfHosting { get; set; } + public bool UseTransactions { get; set; } + public int DefaultPageSize { get; set; } = 200; public int MaxResults { get; set; } = 200; diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json index 1b37dd060..07d7321d2 100644 --- a/backend/src/Squidex/appsettings.json +++ b/backend/src/Squidex/appsettings.json @@ -234,6 +234,11 @@ // Creates one database per app and one collection per schema. Slows down inserts, but you can create custom indexes. "optimizeForSelfHosting": false, + // False to not use transactions. Improves performance. + // + // Warning: Can cause consistency issues. + "useTransactions": true, + // The default page size if not specified by a query. // // Warning: Can slow down queries if increased.