diff --git a/src/Orleans.Core.Abstractions/Activation/IGrainContext.cs b/src/Orleans.Core.Abstractions/Activation/IGrainContext.cs index c5425344d2..da6df6c141 100644 --- a/src/Orleans.Core.Abstractions/Activation/IGrainContext.cs +++ b/src/Orleans.Core.Abstractions/Activation/IGrainContext.cs @@ -101,11 +101,6 @@ internal interface ICollectibleGrainContext : IGrainContext void DelayDeactivation(TimeSpan timeSpan); } - internal interface IActivationData : ICollectibleGrainContext - { - IGrainRuntime GrainRuntime { get; } - } - internal interface IGrainTimerRegistry { void OnTimerCreated(IGrainTimer timer); diff --git a/src/Orleans.Core.Abstractions/Core/Grain.cs b/src/Orleans.Core.Abstractions/Core/Grain.cs index ff43f6b0ad..a61e3e4c42 100644 --- a/src/Orleans.Core.Abstractions/Core/Grain.cs +++ b/src/Orleans.Core.Abstractions/Core/Grain.cs @@ -14,17 +14,15 @@ namespace Orleans /// public abstract class Grain : IGrainBase, IAddressable { - private readonly IGrainContext _grainContext; - // Do not use this directly because we currently don't provide a way to inject it; // any interaction with it will result in non unit-testable code. Any behaviour that can be accessed // from within client code (including subclasses of this class), should be exposed through IGrainRuntime. // The better solution is to refactor this interface and make it injectable through the constructor. - internal IActivationData Data => _grainContext as IActivationData; + internal IGrainContext GrainContext { get; private set; } - IGrainContext IGrainBase.GrainContext => _grainContext; + IGrainContext IGrainBase.GrainContext => GrainContext; - public GrainReference GrainReference { get { return _grainContext.GrainReference; } } + public GrainReference GrainReference { get { return GrainContext.GrainReference; } } internal IGrainRuntime Runtime { get; } @@ -41,10 +39,10 @@ protected IGrainFactory GrainFactory /// protected internal IServiceProvider ServiceProvider { - get { return _grainContext?.ActivationServices ?? Runtime?.ServiceProvider; } + get { return GrainContext?.ActivationServices ?? Runtime?.ServiceProvider; } } - internal GrainId GrainId => _grainContext.GrainId; + internal GrainId GrainId => GrainContext.GrainId; /// /// This constructor should never be invoked. We expose it so that client code (subclasses of Grain) do not have to add a constructor. @@ -61,7 +59,7 @@ protected Grain() : this(RuntimeContext.Current, grainRuntime: null) /// protected Grain(IGrainContext grainContext, IGrainRuntime grainRuntime = null) { - _grainContext = grainContext; + GrainContext = grainContext; Runtime = grainRuntime ?? grainContext?.ActivationServices.GetRequiredService(); } @@ -113,7 +111,7 @@ protected IDisposable RegisterTimer(Func asyncCallback, object sta throw new ArgumentNullException(nameof(asyncCallback)); EnsureRuntime(); - return Runtime.TimerRegistry.RegisterTimer(_grainContext ?? RuntimeContext.Current, asyncCallback, state, dueTime, period); + return Runtime.TimerRegistry.RegisterTimer(GrainContext ?? RuntimeContext.Current, asyncCallback, state, dueTime, period); } /// @@ -184,7 +182,7 @@ protected Task> GetReminders() protected void DeactivateOnIdle() { EnsureRuntime(); - Runtime.DeactivateOnIdle(_grainContext ?? RuntimeContext.Current); + Runtime.DeactivateOnIdle(GrainContext ?? RuntimeContext.Current); } /// @@ -197,7 +195,7 @@ protected void DeactivateOnIdle() protected void DelayDeactivation(TimeSpan timeSpan) { EnsureRuntime(); - Runtime.DelayDeactivation(_grainContext ?? RuntimeContext.Current, timeSpan); + Runtime.DelayDeactivation(GrainContext ?? RuntimeContext.Current, timeSpan); } /// @@ -287,7 +285,7 @@ private Task OnSetupState(CancellationToken ct) { if (ct.IsCancellationRequested) return Task.CompletedTask; - this.storage = this.Runtime.GetStorage(Data); + this.storage = this.Runtime.GetStorage(GrainContext); return this.ReadStateAsync(); } } diff --git a/src/Orleans.Core.Abstractions/Core/GrainExtensions.cs b/src/Orleans.Core.Abstractions/Core/GrainExtensions.cs index 56f0c69e84..80783f3f51 100644 --- a/src/Orleans.Core.Abstractions/Core/GrainExtensions.cs +++ b/src/Orleans.Core.Abstractions/Core/GrainExtensions.cs @@ -20,7 +20,7 @@ internal static GrainReference AsReference(this IAddressable grain) var context = grain switch { - Grain grainBase => grainBase.Data, + Grain grainBase => grainBase.GrainContext, IGrainBase activation => activation.GrainContext, ISystemTargetBase systemTarget => systemTarget, _ => throw new ArgumentException(GetWrongGrainTypeErrorMessage(grain), nameof(grain)) diff --git a/src/Orleans.Core/Statistics/MessagingProcessingStatisticsGroup.cs b/src/Orleans.Core/Statistics/MessagingProcessingStatisticsGroup.cs index f88828621c..7d57b7e42d 100644 --- a/src/Orleans.Core/Statistics/MessagingProcessingStatisticsGroup.cs +++ b/src/Orleans.Core/Statistics/MessagingProcessingStatisticsGroup.cs @@ -63,7 +63,7 @@ internal static void OnDispatcherMessageReceive(Message msg) { dispatcherReceivedByContext[0].Increment(); } - else if (context is IActivationData) + else if (context is IGrainContext) { dispatcherReceivedByContext[1].Increment(); } @@ -101,7 +101,7 @@ internal static void OnImaMessageEnqueued(IGrainContext context) { imaEnqueuedByContext[1].Increment(); } - else if (context is IActivationData) + else if (context is IGrainContext) { imaEnqueuedByContext[2].Increment(); } diff --git a/src/Orleans.Runtime/Catalog/ActivationData.cs b/src/Orleans.Runtime/Catalog/ActivationData.cs index 44342b1fa4..bd28b87ea0 100644 --- a/src/Orleans.Runtime/Catalog/ActivationData.cs +++ b/src/Orleans.Runtime/Catalog/ActivationData.cs @@ -21,7 +21,7 @@ namespace Orleans.Runtime /// MUST lock this object for any concurrent access /// Consider: compartmentalize by usage, e.g., using separate interfaces for data for catalog, etc. /// - internal class ActivationData : IActivationData, IGrainExtensionBinder, ICollectibleGrainContext, IAsyncDisposable, IActivationWorkingSetMember, IGrainTimerRegistry, IGrainManagementExtension + internal class ActivationData : IGrainContext, ICollectibleGrainContext, IGrainExtensionBinder, IActivationWorkingSetMember, IGrainTimerRegistry, IGrainManagementExtension, IAsyncDisposable { private readonly GrainTypeSharedContext _shared; private readonly IServiceScope serviceScope; diff --git a/test/Grains/TestInternalGrains/ActivationGCTestGrains.cs b/test/Grains/TestInternalGrains/ActivationGCTestGrains.cs index a814298515..54a72e1522 100644 --- a/test/Grains/TestInternalGrains/ActivationGCTestGrains.cs +++ b/test/Grains/TestInternalGrains/ActivationGCTestGrains.cs @@ -26,14 +26,15 @@ public Task Nop() internal class BusyActivationGcTestGrain1: Grain, IBusyActivationGcTestGrain1 { private readonly string _id = Guid.NewGuid().ToString(); - private readonly ActivationCollector activationCollector; + private readonly IGrainContext _grainContext; private int burstCount = 0; - public BusyActivationGcTestGrain1(ActivationCollector activationCollector) + public BusyActivationGcTestGrain1(ActivationCollector activationCollector, IGrainContext grainContext) { this.activationCollector = activationCollector; + _grainContext = grainContext; } public Task Nop() @@ -66,7 +67,7 @@ public Task EnableBurstOnCollection(int count) private void OnCollectActivation(GrainId grainId) { var other = grainId.Type; - var self = Data.Address.GrainId.Type; + var self = _grainContext.Address.GrainId.Type; if (other == self) { IBusyActivationGcTestGrain1 g = GrainFactory.GetGrain(grainId); diff --git a/test/Grains/TestInternalGrains/EchoTaskGrain.cs b/test/Grains/TestInternalGrains/EchoTaskGrain.cs index a977c9b02d..8f0f8b9422 100644 --- a/test/Grains/TestInternalGrains/EchoTaskGrain.cs +++ b/test/Grains/TestInternalGrains/EchoTaskGrain.cs @@ -66,12 +66,14 @@ public Task EchoError(string data) internal class EchoTaskGrain : Grain, IEchoTaskGrain, IDebuggerHelperTestGrain { private readonly IInternalGrainFactory internalGrainFactory; + private readonly IGrainContext _grainContext; private ILogger logger; - public EchoTaskGrain(IInternalGrainFactory internalGrainFactory, ILogger logger) + public EchoTaskGrain(IInternalGrainFactory internalGrainFactory, ILogger logger, IGrainContext grainContext) { this.internalGrainFactory = internalGrainFactory; this.logger = logger; + _grainContext = grainContext; } public Task GetMyIdAsync() { return Task.FromResult(State.MyId); } @@ -142,7 +144,7 @@ public Task PingAsync() public Task PingLocalSiloAsync() { logger.Info("IEchoGrainAsync.PingLocal"); - SiloAddress mySilo = Data.Address.SiloAddress; + SiloAddress mySilo = _grainContext.Address.SiloAddress; return GetSiloControlReference(mySilo).Ping("PingLocal"); } @@ -155,7 +157,7 @@ public Task PingRemoteSiloAsync(SiloAddress siloAddress) public async Task PingOtherSiloAsync() { logger.Info("IEchoGrainAsync.PingOtherSilo"); - SiloAddress mySilo = Data.Address.SiloAddress; + SiloAddress mySilo = _grainContext.Address.SiloAddress; IManagementGrain mgmtGrain = GrainFactory.GetGrain(0); var silos = await mgmtGrain.GetHosts(); @@ -170,7 +172,7 @@ public async Task PingOtherSiloAsync() public async Task PingClusterMemberAsync() { logger.Info("IEchoGrainAsync.PingClusterMemberAsync"); - SiloAddress mySilo = Data.Address.SiloAddress; + SiloAddress mySilo = _grainContext.Address.SiloAddress; IManagementGrain mgmtGrain = GrainFactory.GetGrain(0); var silos = await mgmtGrain.GetHosts();