From b1b47175d438974813d040fbcca4f2e6764d47f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Thu, 11 Apr 2024 20:59:57 -0700 Subject: [PATCH] Reduce contention by caching shellsetting accessors (#15728) --- .../Shell/ShellSettings.cs | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/OrchardCore/OrchardCore.Abstractions/Shell/ShellSettings.cs b/src/OrchardCore/OrchardCore.Abstractions/Shell/ShellSettings.cs index c1e90df6218..dd225764565 100644 --- a/src/OrchardCore/OrchardCore.Abstractions/Shell/ShellSettings.cs +++ b/src/OrchardCore/OrchardCore.Abstractions/Shell/ShellSettings.cs @@ -27,7 +27,13 @@ public class ShellSettings : IDisposable private readonly ShellConfiguration _settings; private readonly ShellConfiguration _configuration; internal volatile int _shellCreating; - private bool _disposed; + + private string _requestUrlPrefix; + private string _versionId; + private string _tenantId; + private string _requestUrlHost; + private string[] _requestUrlHosts; + private TenantState? _state; /// /// Initializes a new . @@ -67,7 +73,7 @@ public ShellSettings(ShellSettings settings) /// Whether this instance has been disposed or not. /// [JsonIgnore] - public bool Disposed => _disposed; + public bool Disposed { get; private set; } /// /// Whether this instance is disposable or not. @@ -80,33 +86,33 @@ public ShellSettings(ShellSettings settings) /// public string VersionId { - get => _settings["VersionId"]; + get => _versionId ??= _settings["VersionId"]; set { _settings["TenantId"] ??= _settings["VersionId"] ?? value; - _settings["VersionId"] = value; + _versionId = _settings["VersionId"] = value; } } /// /// The tenant identifier. /// - public string TenantId => _settings["TenantId"] ?? _settings["VersionId"]; + public string TenantId => _tenantId ??= _settings["TenantId"] ?? _settings["VersionId"]; /// /// The tenant request url host, multiple separated hosts may be provided. /// public string RequestUrlHost { - get => _settings["RequestUrlHost"]; - set => _settings["RequestUrlHost"] = value; + get => _requestUrlHost ??= _settings["RequestUrlHost"] ?? string.Empty; + set => _requestUrlHost = _settings["RequestUrlHost"] = value; } /// /// The tenant request url host(s). /// [JsonIgnore] - public string[] RequestUrlHosts => _settings["RequestUrlHost"] + public string[] RequestUrlHosts => _requestUrlHosts ??= _settings["RequestUrlHost"] ?.Split(HostSeparators, StringSplitOptions.RemoveEmptyEntries) ?? []; @@ -115,8 +121,8 @@ public string RequestUrlHost /// public string RequestUrlPrefix { - get => _settings["RequestUrlPrefix"]?.Trim(' ', '/'); - set => _settings["RequestUrlPrefix"] = value; + get => _requestUrlPrefix ??= _settings["RequestUrlPrefix"]?.Trim(' ', '/') ?? string.Empty; + set => _requestUrlPrefix = _settings["RequestUrlPrefix"] = value; } /// @@ -125,8 +131,8 @@ public string RequestUrlPrefix [JsonConverter(typeof(JsonStringEnumConverter))] public TenantState State { - get => _settings.GetValue("State"); - set => _settings["State"] = value.ToString(); + get => _state ??= _settings.GetValue("State"); + set => _state = Enum.Parse(_settings["State"] = value.ToString()); } /// @@ -161,12 +167,12 @@ public void Dispose() private void Close() { - if (_disposed) + if (Disposed) { return; } - _disposed = true; + Disposed = true; _settings?.Release(); _configuration?.Release();