Skip to content

Commit

Permalink
Merge pull request #2807 from ReubenBond/prep-non-static-client
Browse files Browse the repository at this point in the history
Prep non-static client
  • Loading branch information
jdom authored Mar 6, 2017
2 parents f6a37ee + 63c82a0 commit 7cf2035
Show file tree
Hide file tree
Showing 43 changed files with 301 additions and 334 deletions.
5 changes: 3 additions & 2 deletions src/ClientGenerator/ClientGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,9 @@ private bool CreateGrainClient(CodeGenOptions options)
{
Directory.CreateDirectory(outputFileDirectory);
}

var codeGenerator = new RoslynCodeGenerator(new SerializationManager(null, new GlobalConfiguration()));

var config = new ClusterConfiguration();
var codeGenerator = new RoslynCodeGenerator(new SerializationManager(null, config.Globals, config.Defaults));

// Generate source
ConsoleText.WriteStatus("Orleans-CodeGen - Generating file {0}", options.OutputFileName);
Expand Down
2 changes: 1 addition & 1 deletion src/Orleans/Core/GrainAttributes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public abstract class RegistrationAttribute : Attribute

internal RegistrationAttribute(MultiClusterRegistrationStrategy strategy)
{
RegistrationStrategy = strategy ?? MultiClusterRegistrationStrategy.GetDefault();
this.RegistrationStrategy = strategy;
}
}

Expand Down
17 changes: 2 additions & 15 deletions src/Orleans/GrainDirectory/ClusterLocalRegistration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,7 @@ namespace Orleans.GrainDirectory
[Serializable]
internal class ClusterLocalRegistration : MultiClusterRegistrationStrategy
{
private static readonly Lazy<ClusterLocalRegistration> singleton = new Lazy<ClusterLocalRegistration>(() => new ClusterLocalRegistration());

internal static ClusterLocalRegistration Singleton
{
get { return singleton.Value; }
}

internal static void Initialize()
{
var instance = Singleton;
}

private ClusterLocalRegistration()
{ }
internal static ClusterLocalRegistration Singleton { get; } = new ClusterLocalRegistration();

public override bool Equals(object obj)
{
Expand All @@ -33,7 +20,7 @@ public override bool Equals(object obj)

public override int GetHashCode()
{
return GetType().GetHashCode();
return this.GetType().GetHashCode();
}

public override IEnumerable<string> GetRemoteInstances(MultiClusterConfiguration mcConfig, string myClusterId)
Expand Down
30 changes: 5 additions & 25 deletions src/Orleans/GrainDirectory/GlobalSingleInstanceRegistration.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;

using Orleans.MultiCluster;

namespace Orleans.GrainDirectory
Expand All @@ -11,27 +13,7 @@ namespace Orleans.GrainDirectory
[Serializable]
internal class GlobalSingleInstanceRegistration : MultiClusterRegistrationStrategy
{
private static GlobalSingleInstanceRegistration singleton;

internal static GlobalSingleInstanceRegistration Singleton
{
get
{
if (singleton == null)
{
Initialize();
}
return singleton;
}
}

internal static void Initialize()
{
singleton = new GlobalSingleInstanceRegistration();
}

private GlobalSingleInstanceRegistration()
{ }
internal static GlobalSingleInstanceRegistration Singleton { get; } = new GlobalSingleInstanceRegistration();

public override bool Equals(object obj)
{
Expand All @@ -40,14 +22,12 @@ public override bool Equals(object obj)

public override int GetHashCode()
{
return GetType().GetHashCode();
return this.GetType().GetHashCode();
}

private static List<string> emptyList = new List<string>();

public override IEnumerable<string> GetRemoteInstances(MultiClusterConfiguration mcConfig, string myClusterId)
{
return emptyList; // there is only one instance, so no remote instances
return Enumerable.Empty<string>(); // there is only one instance, so no remote instances
}
}
}
60 changes: 34 additions & 26 deletions src/Orleans/GrainDirectory/MultiClusterRegistrationStrategy.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using System;
using System.Linq;
using System.Reflection;
using Orleans.Runtime.Configuration;
using Orleans.MultiCluster;
using System.Collections.Generic;

namespace Orleans.GrainDirectory
{

/// <summary>
/// Interface for multi-cluster registration strategies. Used by protocols that coordinate multiple instances.
/// </summary>
Expand All @@ -22,41 +22,49 @@ public interface IMultiClusterRegistrationStrategy {

}

/// <summary>
/// A superclass for all multi-cluster registration strategies.
/// Strategy object which is used as keys to select the proper registrar.
/// </summary>
[Serializable]
internal abstract class MultiClusterRegistrationStrategy : IMultiClusterRegistrationStrategy
internal class MultiClusterRegistrationStrategyManager
{
private static MultiClusterRegistrationStrategy defaultStrategy;

internal static void Initialize(GlobalConfiguration config)
public MultiClusterRegistrationStrategyManager(GlobalConfiguration config)
{
InitializeStrategies();

if (config.HasMultiClusterNetwork && config.UseGlobalSingleInstanceByDefault)
defaultStrategy = GlobalSingleInstanceRegistration.Singleton;
{
this.DefaultStrategy = GlobalSingleInstanceRegistration.Singleton;
}
else
defaultStrategy = ClusterLocalRegistration.Singleton;
}

private static void InitializeStrategies()
{
ClusterLocalRegistration.Initialize();
GlobalSingleInstanceRegistration.Initialize();
{
this.DefaultStrategy = ClusterLocalRegistration.Singleton;
}
}

internal static MultiClusterRegistrationStrategy GetDefault()
{
return defaultStrategy;
}
public MultiClusterRegistrationStrategy DefaultStrategy { get; }

internal static MultiClusterRegistrationStrategy FromAttributes(IEnumerable<object> attributes)
internal MultiClusterRegistrationStrategy GetMultiClusterRegistrationStrategy(Type grainClass)
{
return (attributes.FirstOrDefault() as RegistrationAttribute)?.RegistrationStrategy ?? defaultStrategy;
var attribs = grainClass.GetTypeInfo().GetCustomAttributes<RegistrationAttribute>(inherit: true).ToArray();

switch (attribs.Length)
{
case 0:
return this.DefaultStrategy; // no strategy is specified
case 1:
return attribs[0].RegistrationStrategy ?? this.DefaultStrategy;
default:
throw new InvalidOperationException(
string.Format(
"More than one {0} cannot be specified for grain interface {1}",
typeof(MultiClusterRegistrationStrategy).Name,
grainClass.Name));
}
}
}

/// <summary>
/// A superclass for all multi-cluster registration strategies.
/// Strategy object which is used as keys to select the proper registrar.
/// </summary>
[Serializable]
internal abstract class MultiClusterRegistrationStrategy : IMultiClusterRegistrationStrategy
{
public abstract IEnumerable<string> GetRemoteInstances(MultiClusterConfiguration mcConfig, string myClusterId);
}
}
6 changes: 4 additions & 2 deletions src/Orleans/Logging/LogManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ public class LogManager
/// </summary>
internal static bool ShowDate = true;

// TODO: This is a hack (global variable) to work around initialization order issues in telemetry provider code.
// This is used by Performance Counter code to know which grains to create counters for.
internal static IList<string> GrainTypes = null;

// http://www.csharp-examples.net/string-format-datetime/
// http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx

Expand Down Expand Up @@ -126,8 +130,6 @@ public static void Initialize(ITraceConfiguration config, bool configChange = fa
runtimeTraceLevel = config.DefaultTraceLevel;
appTraceLevel = config.DefaultTraceLevel;
SetTraceLevelOverrides(config.TraceLevelOverrides);
Message.LargeMessageSizeThreshold = config.LargeMessageWarningThreshold;
SerializationManager.LARGE_OBJECT_LIMIT = config.LargeMessageWarningThreshold;
RequestContext.PropagateActivityId = config.PropagateActivityId;
defaultModificationCounter++;
if (configChange)
Expand Down
2 changes: 1 addition & 1 deletion src/Orleans/Messaging/IncomingMessageBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public bool TryDecodeMessage(out Message msg)
{
MessagingStatisticsGroup.OnMessageReceive(msg, headerLength, bodyLength);

if (headerLength + bodyLength > Message.LargeMessageSizeThreshold)
if (headerLength + bodyLength > this.serializationManager.LargeObjectSizeThreshold)
{
Log.Info(
ErrorCode.Messaging_LargeMsg_Incoming,
Expand Down
16 changes: 1 addition & 15 deletions src/Orleans/Messaging/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace Orleans.Runtime
{
internal class Message : IOutgoingMessage
{
public static int LargeMessageSizeThreshold { get; set; }
public const int LENGTH_HEADER_SIZE = 8;
public const int LENGTH_META_HEADER = 4;

Expand Down Expand Up @@ -464,13 +463,7 @@ public bool IsDuplicate(Message other)

#region Serialization

public List<ArraySegment<byte>> Serialize(SerializationManager serializationManager, out int headerLength)
{
int dummy;
return Serialize_Impl(serializationManager, out headerLength, out dummy);
}

private List<ArraySegment<byte>> Serialize_Impl(SerializationManager serializationManager, out int headerLengthOut, out int bodyLengthOut)
public List<ArraySegment<byte>> Serialize(SerializationManager serializationManager, out int headerLengthOut, out int bodyLengthOut)
{
var context = new SerializationContext(serializationManager)
{
Expand Down Expand Up @@ -504,13 +497,6 @@ private List<ArraySegment<byte>> Serialize_Impl(SerializationManager serializati
bytes.AddRange(headerBytes);
bytes.AddRange(bodyBytes);

if (headerLength + bodyLength > LargeMessageSizeThreshold)
{
logger.Info(ErrorCode.Messaging_LargeMsg_Outgoing, "Preparing to send large message Size={0} HeaderLength={1} BodyLength={2} #ArraySegments={3}. Msg={4}",
headerLength + bodyLength + LENGTH_HEADER_SIZE, headerLength, bodyLength, bytes.Count, this.ToString());
if (logger.IsVerbose3) logger.Verbose3("Sending large message {0}", this.ToLongString());
}

headerLengthOut = headerLength;
bodyLengthOut = bodyLength;
return bytes;
Expand Down
11 changes: 9 additions & 2 deletions src/Orleans/Messaging/OutgoingMessageSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,18 @@ protected override void Process(Message msg)
int headerLength = 0;
try
{
data = msg.Serialize(this.serializationManager, out headerLength);
int bodyLength;
data = msg.Serialize(this.serializationManager, out headerLength, out bodyLength);
if (headerLength + bodyLength > this.serializationManager.LargeObjectSizeThreshold)
{
this.Log.Info(ErrorCode.Messaging_LargeMsg_Outgoing, "Preparing to send large message Size={0} HeaderLength={1} BodyLength={2} #ArraySegments={3}. Msg={4}",
headerLength + bodyLength + Message.LENGTH_HEADER_SIZE, headerLength, bodyLength, data.Count, this.ToString());
if (this.Log.IsVerbose3) this.Log.Verbose3("Sending large message {0}", msg.ToLongString());
}
}
catch (Exception exc)
{
OnMessageSerializationFailure(msg, exc);
this.OnMessageSerializationFailure(msg, exc);
return;
}

Expand Down
5 changes: 0 additions & 5 deletions src/Orleans/Providers/ILocalDataStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,4 @@ public interface ILocalDataStore
bool DeleteRow(IList<Tuple<string, string>> keys, string eTag);
void Clear();
}

internal static class LocalDataStoreInstance
{
public static ILocalDataStore LocalDataStore { get; internal set; }
}
}
2 changes: 1 addition & 1 deletion src/Orleans/Runtime/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ internal class Constants

internal const long ReminderTableGrainId = 12345;

public static TimeSpan DEFAULT_OPENCONNECTION_TIMEOUT = TimeSpan.FromSeconds(5);
public static readonly TimeSpan DEFAULT_OPENCONNECTION_TIMEOUT = TimeSpan.FromSeconds(5);

/// <summary>
/// The default timeout before a request is assumed to have failed.
Expand Down
2 changes: 1 addition & 1 deletion src/Orleans/Runtime/GrainInterfaceMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ internal GrainClassData(int grainTypeCode, string grainClass, bool isGeneric, Gr
this.interfaceData = interfaceData;
genericClassNames = new Dictionary<string, string>(); // TODO: initialize only for generic classes
placementStrategy = placement;
this.registrationStrategy = registrationStrategy ?? MultiClusterRegistrationStrategy.GetDefault();
this.registrationStrategy = registrationStrategy;
}

internal string GetClassName(string typeArguments)
Expand Down
1 change: 1 addition & 0 deletions src/Orleans/Runtime/OutsideRuntimeClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ public OutsideRuntimeClient(ClientConfiguration cfg, bool secondary = false)
services.AddFromExisting<IGrainReferenceConverter, GrainFactory>();
services.AddSingleton<ClientProviderRuntime>();
services.AddFromExisting<IMessagingConfiguration, ClientConfiguration>();
services.AddFromExisting<ITraceConfiguration, ClientConfiguration>();
services.AddSingleton<IGatewayListProvider>(
sp => ActivatorUtilities.CreateInstance<GatewayProviderFactory>(sp).CreateGatewayListProvider());
services.AddSingleton<SerializationManager>();
Expand Down
17 changes: 8 additions & 9 deletions src/Orleans/Serialization/SerializationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public static object GetUninitializedObjectWithFormatterServices(Type type)
internal CounterStatistic FallbackDeserTimeStatistic;
internal CounterStatistic FallbackCopiesTimeStatistic;

internal static int LARGE_OBJECT_LIMIT = Constants.LARGE_OBJECT_HEAP_THRESHOLD;
internal int LargeObjectSizeThreshold { get; }

private readonly ThreadLocal<SerializationContext> serializationContext;

Expand All @@ -150,13 +150,11 @@ internal IRuntimeClient RuntimeClient

#region Static initialization

public SerializationManager(IServiceProvider serviceProvider, IMessagingConfiguration config)
: this(serviceProvider, config.SerializationProviders, config.FallbackSerializationProvider)
{
}

internal SerializationManager(IServiceProvider serviceProvider, List<TypeInfo> serializationProviders = null, TypeInfo fallbackType = null)
public SerializationManager(IServiceProvider serviceProvider, IMessagingConfiguration config, ITraceConfiguration traceConfig)
{
var serializationProviders = config.SerializationProviders;
var fallbackType = config.FallbackSerializationProvider;
this.LargeObjectSizeThreshold = traceConfig.LargeMessageWarningThreshold;
this.serializationContext = new ThreadLocal<SerializationContext>(() => new SerializationContext(this));
this.deserializationContext = new ThreadLocal<DeserializationContext>(() => new DeserializationContext(this));

Expand Down Expand Up @@ -1015,7 +1013,7 @@ private object DeepCopierHelper(Type t, object original, ICopyContext context)
if (t.TypeHandle.Equals(byteArrayTypeHandle) && (originalArray.Rank == 1))
{
var source = (byte[])original;
if (source.Length > LARGE_OBJECT_LIMIT)
if (source.Length > this.LargeObjectSizeThreshold)
{
logger.Info(ErrorCode.Ser_LargeObjectAllocated,
"Large byte array of size {0} is being copied. This will result in an allocation on the large object heap. " +
Expand All @@ -1032,7 +1030,7 @@ private object DeepCopierHelper(Type t, object original, ICopyContext context)
if (et.IsOrleansShallowCopyable())
{
// Only check the size for primitive types because otherwise Buffer.ByteLength throws
if (etInfo.IsPrimitive && Buffer.ByteLength(originalArray) > LARGE_OBJECT_LIMIT)
if (etInfo.IsPrimitive && Buffer.ByteLength(originalArray) > this.LargeObjectSizeThreshold)
{
logger.Info(ErrorCode.Ser_LargeObjectAllocated,
"Large {0} array of total byte size {1} is being copied. This will result in an allocation on the large object heap. " +
Expand Down Expand Up @@ -1984,6 +1982,7 @@ private object FallbackSerializationDeepCopy(object obj, ICopyContext context)
#endregion

#region Utilities

internal Type ResolveTypeName(string typeName)
{
Type t;
Expand Down
6 changes: 3 additions & 3 deletions src/OrleansAzureUtils/Hosting/AzureConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ internal sealed class AzureConstants
{
public static readonly TimeSpan STARTUP_TIME_PAUSE = TimeSpan.FromSeconds(5); // In seconds
public const int MAX_RETRIES = 120; // 120 x 5s = Total: 10 minutes
public static string DataConnectionConfigurationSettingName = "DataConnectionString";
public static string SiloEndpointConfigurationKeyName = "OrleansSiloEndpoint";
public static string ProxyEndpointConfigurationKeyName = "OrleansProxyEndpoint";
public const string DataConnectionConfigurationSettingName = "DataConnectionString";
public const string SiloEndpointConfigurationKeyName = "OrleansSiloEndpoint";
public const string ProxyEndpointConfigurationKeyName = "OrleansProxyEndpoint";
}
}
6 changes: 3 additions & 3 deletions src/OrleansConsulUtils/SerializableMembershipTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ public class SuspectingSilo
/// </summary>
internal class ConsulSiloRegistrationAssembler
{
private static String DeploymentKVPrefix = "orleans"; //Ensures a root KV namespace for orleans in Consul
private static Char KeySeparator = '/';
internal static String SiloIAmAliveSuffix = "iamalive";
private const string DeploymentKVPrefix = "orleans"; //Ensures a root KV namespace for orleans in Consul
private const char KeySeparator = '/';
internal const string SiloIAmAliveSuffix = "iamalive";

internal static String ParseDeploymentKVPrefix(String deploymentId)
{
Expand Down
Loading

0 comments on commit 7cf2035

Please sign in to comment.