From aee0c27da7ef7d3cf80d1aeaadb4aed2a9a54801 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 20 Aug 2024 14:02:37 -0400 Subject: [PATCH] fix #4498 build ServerState Assemblies collection in a more thread safe manner --- .../Repository/ModuleDefinitionRepository.cs | 17 ++++++++++++----- Oqtane.Server/Repository/ThemeRepository.cs | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index bf9b7c92..15eadf9e 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -185,6 +185,7 @@ namespace Oqtane.Repository if (siteId != -1) { var siteKey = _tenants.GetAlias().SiteKey; + var assemblies = new List(); // get all module definition permissions for site List permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList(); @@ -193,7 +194,6 @@ namespace Oqtane.Repository var settings = _settings.GetSettings(EntityNames.ModuleDefinition).ToList(); // populate module definition site settings and permissions - var serverState = _serverState.GetServerState(siteKey); foreach (ModuleDefinition moduledefinition in ModuleDefinitions) { moduledefinition.SiteId = siteId; @@ -211,17 +211,17 @@ namespace Oqtane.Repository if (moduledefinition.IsEnabled) { // build list of assemblies for site - if (!serverState.Assemblies.Contains(moduledefinition.AssemblyName)) + if (!assemblies.Contains(moduledefinition.AssemblyName)) { - serverState.Assemblies.Add(moduledefinition.AssemblyName); + assemblies.Add(moduledefinition.AssemblyName); } if (!string.IsNullOrEmpty(moduledefinition.Dependencies)) { foreach (var assembly in moduledefinition.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse()) { - if (!serverState.Assemblies.Contains(assembly.Trim())) + if (!assemblies.Contains(assembly.Trim())) { - serverState.Assemblies.Insert(0, assembly.Trim()); + assemblies.Insert(0, assembly.Trim()); } } } @@ -248,6 +248,13 @@ namespace Oqtane.Repository } } + // cache site assemblies + var serverState = _serverState.GetServerState(siteKey); + foreach (var assembly in assemblies) + { + if (!serverState.Assemblies.Contains(assembly)) serverState.Assemblies.Add(assembly); + } + // clean up any orphaned permissions var ids = new HashSet(ModuleDefinitions.Select(item => item.ModuleDefinitionId)); foreach (var permission in permissions.Where(item => !ids.Contains(item.EntityId))) diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs index bd557bdd..338e73ed 100644 --- a/Oqtane.Server/Repository/ThemeRepository.cs +++ b/Oqtane.Server/Repository/ThemeRepository.cs @@ -161,12 +161,12 @@ namespace Oqtane.Repository if (siteId != -1) { var siteKey = _tenants.GetAlias().SiteKey; + var assemblies = new List(); // get settings for site var settings = _settings.GetSettings(EntityNames.Theme).ToList(); // populate theme site settings - var serverState = _serverState.GetServerState(siteKey); foreach (Theme theme in Themes) { theme.SiteId = siteId; @@ -184,22 +184,29 @@ namespace Oqtane.Repository if (theme.IsEnabled) { // build list of assemblies for site - if (!serverState.Assemblies.Contains(theme.AssemblyName)) + if (!assemblies.Contains(theme.AssemblyName)) { - serverState.Assemblies.Add(theme.AssemblyName); + assemblies.Add(theme.AssemblyName); } if (!string.IsNullOrEmpty(theme.Dependencies)) { foreach (var assembly in theme.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse()) { - if (!serverState.Assemblies.Contains(assembly.Trim())) + if (!assemblies.Contains(assembly.Trim())) { - serverState.Assemblies.Insert(0, assembly.Trim()); + assemblies.Insert(0, assembly.Trim()); } } } } } + + // cache site assemblies + var serverState = _serverState.GetServerState(siteKey); + foreach (var assembly in assemblies) + { + if (!serverState.Assemblies.Contains(assembly)) serverState.Assemblies.Add(assembly); + } } return Themes;