Merge pull request #4538 from sbwalker/dev

fix #4498 build ServerState Assemblies collection in a more thread safe manner
This commit is contained in:
Shaun Walker 2024-08-20 14:03:02 -04:00 committed by GitHub
commit e2f99a1554
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 10 deletions

View File

@ -185,6 +185,7 @@ namespace Oqtane.Repository
if (siteId != -1) if (siteId != -1)
{ {
var siteKey = _tenants.GetAlias().SiteKey; var siteKey = _tenants.GetAlias().SiteKey;
var assemblies = new List<string>();
// get all module definition permissions for site // get all module definition permissions for site
List<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList(); List<Permission> permissions = _permissions.GetPermissions(siteId, EntityNames.ModuleDefinition).ToList();
@ -193,7 +194,6 @@ namespace Oqtane.Repository
var settings = _settings.GetSettings(EntityNames.ModuleDefinition).ToList(); var settings = _settings.GetSettings(EntityNames.ModuleDefinition).ToList();
// populate module definition site settings and permissions // populate module definition site settings and permissions
var serverState = _serverState.GetServerState(siteKey);
foreach (ModuleDefinition moduledefinition in ModuleDefinitions) foreach (ModuleDefinition moduledefinition in ModuleDefinitions)
{ {
moduledefinition.SiteId = siteId; moduledefinition.SiteId = siteId;
@ -211,17 +211,17 @@ namespace Oqtane.Repository
if (moduledefinition.IsEnabled) if (moduledefinition.IsEnabled)
{ {
// build list of assemblies for site // 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)) if (!string.IsNullOrEmpty(moduledefinition.Dependencies))
{ {
foreach (var assembly in moduledefinition.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse()) 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 // clean up any orphaned permissions
var ids = new HashSet<int>(ModuleDefinitions.Select(item => item.ModuleDefinitionId)); var ids = new HashSet<int>(ModuleDefinitions.Select(item => item.ModuleDefinitionId));
foreach (var permission in permissions.Where(item => !ids.Contains(item.EntityId))) foreach (var permission in permissions.Where(item => !ids.Contains(item.EntityId)))

View File

@ -161,12 +161,12 @@ namespace Oqtane.Repository
if (siteId != -1) if (siteId != -1)
{ {
var siteKey = _tenants.GetAlias().SiteKey; var siteKey = _tenants.GetAlias().SiteKey;
var assemblies = new List<string>();
// get settings for site // get settings for site
var settings = _settings.GetSettings(EntityNames.Theme).ToList(); var settings = _settings.GetSettings(EntityNames.Theme).ToList();
// populate theme site settings // populate theme site settings
var serverState = _serverState.GetServerState(siteKey);
foreach (Theme theme in Themes) foreach (Theme theme in Themes)
{ {
theme.SiteId = siteId; theme.SiteId = siteId;
@ -184,22 +184,29 @@ namespace Oqtane.Repository
if (theme.IsEnabled) if (theme.IsEnabled)
{ {
// build list of assemblies for site // 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)) if (!string.IsNullOrEmpty(theme.Dependencies))
{ {
foreach (var assembly in theme.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse()) 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; return Themes;