diff --git a/src/Squidex.Domain.Apps.Entities/AppProvider.cs b/src/Squidex.Domain.Apps.Entities/AppProvider.cs index 781184d7b..a00bda2d7 100644 --- a/src/Squidex.Domain.Apps.Entities/AppProvider.cs +++ b/src/Squidex.Domain.Apps.Entities/AppProvider.cs @@ -88,7 +88,7 @@ namespace Squidex.Domain.Apps.Entities { return localCache.GetOrCreateAsync($"GetSchemaAsync({appId}, {name})", async () => { - using (Profiler.TraceMethod()) + using (Profiler.TraceMethod("GetSchemaAsyncByName")) { var schemaId = await GetSchemaIdAsync(appId, name); @@ -106,7 +106,7 @@ namespace Squidex.Domain.Apps.Entities { return localCache.GetOrCreateAsync($"GetSchemaAsync({appId}, {id}, {allowDeleted})", async () => { - using (Profiler.TraceMethod()) + using (Profiler.TraceMethod("GetSchemaAsyncById")) { var schema = await grainFactory.GetGrain(id).GetStateAsync(); diff --git a/src/Squidex/Config/Constants.cs b/src/Squidex/Config/Constants.cs index bd08faef8..ac38bffe5 100644 --- a/src/Squidex/Config/Constants.cs +++ b/src/Squidex/Config/Constants.cs @@ -17,6 +17,8 @@ namespace Squidex.Config public static readonly string ApiScope = "squidex-api"; + public static readonly string OrleansClusterId = "squidex"; + public static readonly string OrleansPrefix = "/orleans"; public static readonly string PortalPrefix = "/portal"; diff --git a/src/Squidex/Config/Orleans/ClientWrapper.cs b/src/Squidex/Config/Orleans/ClientWrapper.cs index 355534f05..03b60afb8 100644 --- a/src/Squidex/Config/Orleans/ClientWrapper.cs +++ b/src/Squidex/Config/Orleans/ClientWrapper.cs @@ -24,14 +24,11 @@ namespace Squidex.Config.Orleans { Client = new ClientBuilder() .UseDashboard() - .UseStaticClustering(options => - { - options.Gateways.Add(new IPEndPoint(ConfigUtilities.SiloAddress, 40000).ToGatewayUri()); - }) + .UseLocalhostClustering(40000) .Configure(options => { - options.ClusterId = "squidex"; - options.ServiceId = "squidex"; + options.ClusterId = Constants.OrleansClusterId; + options.ServiceId = Constants.OrleansClusterId; }) .ConfigureServices((context, services) => { diff --git a/src/Squidex/Config/Orleans/ConfigUtilities.cs b/src/Squidex/Config/Orleans/ConfigUtilities.cs deleted file mode 100644 index 8a44cc97d..000000000 --- a/src/Squidex/Config/Orleans/ConfigUtilities.cs +++ /dev/null @@ -1,130 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using System.Threading.Tasks; -using Orleans.Runtime; - -namespace Squidex.Config.Orleans -{ - public static class ConfigUtilities - { - public static IPAddress SiloAddress { get; } = GetBestIPAddressAsync().Result; - - private static Task GetBestIPAddressAsync() - { - return ResolveIPAddressAsync(Dns.GetHostName(), null, AddressFamily.InterNetwork); - } - - internal static async Task ResolveIPAddressAsync(string addressOrHost, byte[] subnet, AddressFamily family) - { - var loopback = family == AddressFamily.InterNetwork ? IPAddress.Loopback : IPAddress.IPv6Loopback; - - IList nodeIps; - - if (string.IsNullOrEmpty(addressOrHost)) - { - nodeIps = - NetworkInterface.GetAllNetworkInterfaces() - .SelectMany(i => i.GetIPProperties().UnicastAddresses) - .Select(a => a.Address) - .Where(a => a.AddressFamily == family && !IPAddress.IsLoopback(a)) - .ToList(); - } - else - { - if (addressOrHost.Equals("loopback", StringComparison.OrdinalIgnoreCase)) - { - return loopback; - } - - if (IPAddress.TryParse(addressOrHost, out IPAddress address)) - { - return address; - } - - nodeIps = await Dns.GetHostAddressesAsync(addressOrHost); - } - - var candidates = new List(); - - foreach (var nodeIp in nodeIps.Where(x => x.AddressFamily == family)) - { - if (subnet == null) - { - candidates.Add(nodeIp); - } - else - { - var ip = nodeIp; - - if (subnet.Select((b, i) => ip.GetAddressBytes()[i] == b).All(x => x)) - { - candidates.Add(nodeIp); - } - } - } - - if (candidates.Count > 0) - { - return PickIPAddress(candidates); - } - - var subnetStr = Utils.EnumerableToString(subnet, null, ".", false); - - throw new ArgumentException($"Hostname '{addressOrHost}' with subnet {subnetStr} and family {family} is not a valid IP address or DNS name"); - } - - internal static IPAddress PickIPAddress(IReadOnlyList candidates) - { - IPAddress result = null; - - foreach (IPAddress address in candidates) - { - if (result == null) - { - result = address; - } - else - { - if (CompareIPAddresses(address, result)) - { - result = address; - } - } - } - - return result; - } - - private static bool CompareIPAddresses(IPAddress lhs, IPAddress rhs) - { - var lbytes = lhs.GetAddressBytes(); - var rbytes = rhs.GetAddressBytes(); - - if (lbytes.Length != rbytes.Length) - { - return lbytes.Length < rbytes.Length; - } - - for (int i = 0; i < lbytes.Length; i++) - { - if (lbytes[i] != rbytes[i]) - { - return lbytes[i] < rbytes[i]; - } - } - - return false; - } - } -} diff --git a/src/Squidex/Config/Orleans/SiloWrapper.cs b/src/Squidex/Config/Orleans/SiloWrapper.cs index 81077508c..578d08376 100644 --- a/src/Squidex/Config/Orleans/SiloWrapper.cs +++ b/src/Squidex/Config/Orleans/SiloWrapper.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Net; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -66,8 +67,8 @@ namespace Squidex.Config.Orleans }) .Configure(options => { - options.ClusterId = "squidex"; - options.ServiceId = "squidex"; + options.ClusterId = Constants.OrleansClusterId; + options.ServiceId = Constants.OrleansClusterId; }) .ConfigureLogging((hostingContext, builder) => { @@ -102,7 +103,7 @@ namespace Squidex.Config.Orleans { ["MongoDB"] = () => { - hostBuilder.ConfigureEndpoints(ConfigUtilities.SiloAddress, 11111, 40000, true); + hostBuilder.ConfigureEndpoints(Dns.GetHostName(), 11111, 40000, listenOnAnyHostAddress: true); var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration"); var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database"); @@ -116,7 +117,7 @@ namespace Squidex.Config.Orleans }, ["Development"] = () => { - hostBuilder.UseLocalhostClustering(gatewayPort: 40000, clusterId: "squidex"); + hostBuilder.UseLocalhostClustering(gatewayPort: 40000, serviceId: Constants.OrleansClusterId, clusterId: Constants.OrleansClusterId); hostBuilder.Configure(options => options.ExpectedClusterSize = 1); } });