Skip to content

Commit 9847c90

Browse files
authored
Consolidate dependencies and registration of SystemTargets (#9430)
1 parent ad11a2a commit 9847c90

34 files changed

+305
-356
lines changed

src/Orleans.Core/Runtime/Constants.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ internal static class Constants
1616
public static readonly GrainType CatalogType = SystemTargetGrainId.CreateGrainType("catalog");
1717
public static readonly GrainType MembershipServiceType = SystemTargetGrainId.CreateGrainType("clustering");
1818
public static readonly GrainType SystemMembershipTableType = SystemTargetGrainId.CreateGrainType("clustering.dev");
19-
public static readonly GrainType FallbackSystemTargetType = SystemTargetGrainId.CreateGrainType("fallback");
2019
public static readonly GrainType LifecycleSchedulingSystemTargetType = SystemTargetGrainId.CreateGrainType("lifecycle");
2120
public static readonly GrainType DeploymentLoadPublisherSystemTargetType = SystemTargetGrainId.CreateGrainType("load-publisher");
2221
public static readonly GrainType TestHooksSystemTargetType = SystemTargetGrainId.CreateGrainType("test.hooks");
@@ -47,7 +46,6 @@ internal static class Constants
4746
{ClientDirectoryType, "ClientDirectory"},
4847
{CatalogType,"Catalog"},
4948
{MembershipServiceType,"MembershipService"},
50-
{FallbackSystemTargetType, "FallbackSystemTarget"},
5149
{LifecycleSchedulingSystemTargetType, "LifecycleSchedulingSystemTarget"},
5250
{DeploymentLoadPublisherSystemTargetType, "DeploymentLoadPublisherSystemTarget"},
5351
{StreamProviderManagerAgentSystemTargetType,"StreamProviderManagerAgent"},

src/Orleans.Reminders/ReminderService/LocalReminderService.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,15 @@ internal sealed class LocalReminderService : GrainService, IReminderService, ILi
3737
public LocalReminderService(
3838
GrainReferenceActivator referenceActivator,
3939
GrainInterfaceTypeResolver interfaceTypeResolver,
40-
ILocalSiloDetails localSiloDetails,
4140
IReminderTable reminderTable,
42-
ILoggerFactory loggerFactory,
4341
IAsyncTimerFactory asyncTimerFactory,
4442
IOptions<ReminderOptions> reminderOptions,
4543
IConsistentRingProvider ringProvider,
46-
Catalog catalog)
44+
SystemTargetShared shared)
4745
: base(
48-
SystemTargetGrainId.CreateGrainServiceGrainId(GrainInterfaceUtils.GetGrainClassTypeCode(typeof(IReminderService)), null, localSiloDetails.SiloAddress),
49-
localSiloDetails.SiloAddress,
50-
loggerFactory,
51-
ringProvider)
46+
SystemTargetGrainId.CreateGrainServiceGrainId(GrainInterfaceUtils.GetGrainClassTypeCode(typeof(IReminderService)), null, shared.SiloAddress),
47+
ringProvider,
48+
shared)
5249
{
5350
_referenceActivator = referenceActivator;
5451
_grainInterfaceType = interfaceTypeResolver.GetGrainInterfaceType(typeof(IRemindable));
@@ -57,9 +54,9 @@ public LocalReminderService(
5754
this.asyncTimerFactory = asyncTimerFactory;
5855
ReminderInstruments.RegisterActiveRemindersObserve(() => localReminders.Count);
5956
startedTask = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
60-
this.logger = loggerFactory.CreateLogger<LocalReminderService>();
57+
this.logger = shared.LoggerFactory.CreateLogger<LocalReminderService>();
6158
this.listRefreshTimer = asyncTimerFactory.Create(this.reminderOptions.RefreshReminderListPeriod, "ReminderService.ReminderListRefresher");
62-
catalog.RegisterSystemTarget(this);
59+
shared.ActivationDirectory.RecordNewTarget(this);
6360
}
6461

6562
void ILifecycleParticipant<ISiloLifecycle>.Participate(ISiloLifecycle observer)

src/Orleans.Runtime/Cancellation/GrainCallCancellationManager.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ public GrainCallCancellationManager(
6161
IServiceProvider serviceProvider,
6262
Catalog catalog,
6363
ActivationDirectory activationDirectory,
64-
IClusterMembershipService clusterMembershipService) : base(Constants.CancellationManagerType, localSiloDetails.SiloAddress, loggerFactory)
64+
IClusterMembershipService clusterMembershipService,
65+
SystemTargetShared shared) : base(Constants.CancellationManagerType, shared)
6566
{
6667
_serviceProvider = serviceProvider;
6768
_logger = loggerFactory.CreateLogger<GrainCallCancellationManager>();
6869
_catalog = catalog;
6970
_activationDirectory = activationDirectory;
7071
_clusterMembershipService = clusterMembershipService;
71-
_catalog.RegisterSystemTarget(this);
7272

73+
using (new ExecutionContextSuppressor())
7374
{
74-
using var _ = new ExecutionContextSuppressor();
7575
_membershipUpdatesTask = Task.Factory.StartNew(
7676
state => ((GrainCallCancellationManager)state!).ProcessMembershipUpdates(),
7777
this,
@@ -80,6 +80,8 @@ public GrainCallCancellationManager(
8080
WorkItemGroup.TaskScheduler).Unwrap();
8181
_membershipUpdatesTask.Ignore();
8282
}
83+
84+
shared.ActivationDirectory.RecordNewTarget(this);
8385
}
8486

8587
private IInternalGrainFactory GrainFactory => _grainFactory ??= _serviceProvider.GetRequiredService<IInternalGrainFactory>();

src/Orleans.Runtime/Catalog/ActivationMigrationManager.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ internal interface IActivationMigrationManager
5353
/// <summary>
5454
/// Migrates grain activations to target hosts and handles migration requests from other hosts.
5555
/// </summary>
56-
internal partial class ActivationMigrationManager : SystemTarget, IActivationMigrationManagerSystemTarget, IActivationMigrationManager, ILifecycleParticipant<ISiloLifecycle>
56+
internal sealed partial class ActivationMigrationManager : SystemTarget, IActivationMigrationManagerSystemTarget, IActivationMigrationManager, ILifecycleParticipant<ISiloLifecycle>
5757
{
5858
private const int MaxBatchSize = 1_000;
5959
private readonly ConcurrentDictionary<SiloAddress, (Task PumpTask, Channel<MigrationWorkItem> WorkItemChannel)> _workers = new();
@@ -74,13 +74,14 @@ public ActivationMigrationManager(
7474
ILoggerFactory loggerFactory,
7575
IInternalGrainFactory grainFactory,
7676
Catalog catalog,
77-
IClusterMembershipService clusterMembershipService) : base(Constants.ActivationMigratorType, localSiloDetails.SiloAddress, loggerFactory)
77+
SystemTargetShared shared,
78+
IClusterMembershipService clusterMembershipService) : base(Constants.ActivationMigratorType, shared)
7879
{
7980
_grainFactory = grainFactory;
8081
_logger = loggerFactory.CreateLogger<ActivationMigrationManager>();
8182
_catalog = catalog;
8283
_clusterMembershipService = clusterMembershipService;
83-
_catalog.RegisterSystemTarget(this);
84+
shared.ActivationDirectory.RecordNewTarget(this);
8485

8586
{
8687
using var _ = new ExecutionContextSuppressor();

src/Orleans.Runtime/Catalog/Catalog.cs

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,21 @@
55
using System.Threading.Tasks;
66
using Microsoft.Extensions.DependencyInjection;
77
using Microsoft.Extensions.Logging;
8-
using Microsoft.Extensions.Options;
9-
using Orleans.Configuration;
108
using Orleans.GrainDirectory;
119
using Orleans.Runtime.GrainDirectory;
12-
using Orleans.Runtime.Scheduler;
1310

1411
namespace Orleans.Runtime
1512
{
16-
internal sealed partial class Catalog : SystemTarget, ICatalog
13+
internal sealed partial class Catalog : SystemTarget, ICatalog, ILifecycleParticipant<ISiloLifecycle>
1714
{
18-
public SiloAddress LocalSilo { get; private set; }
19-
internal ISiloStatusOracle SiloStatusOracle { get; set; }
15+
private readonly SiloAddress _siloAddress;
2016
private readonly ActivationCollector activationCollector;
2117
private readonly GrainDirectoryResolver grainDirectoryResolver;
2218
private readonly ActivationDirectory activations;
2319
private readonly IServiceProvider serviceProvider;
2420
private readonly ILogger logger;
2521
private readonly GrainContextActivator grainActivator;
22+
private ISiloStatusOracle _siloStatusOracle;
2623

2724
public Catalog(
2825
ILocalSiloDetails localSiloDetails,
@@ -31,17 +28,17 @@ public Catalog(
3128
ActivationCollector activationCollector,
3229
IServiceProvider serviceProvider,
3330
ILoggerFactory loggerFactory,
34-
GrainContextActivator grainActivator)
35-
: base(Constants.CatalogType, localSiloDetails.SiloAddress, loggerFactory)
31+
GrainContextActivator grainActivator,
32+
SystemTargetShared shared)
33+
: base(Constants.CatalogType, shared)
3634
{
37-
this.LocalSilo = localSiloDetails.SiloAddress;
35+
this._siloAddress = localSiloDetails.SiloAddress;
3836
this.grainDirectoryResolver = grainDirectoryResolver;
3937
this.activations = activationDirectory;
4038
this.serviceProvider = serviceProvider;
4139
this.grainActivator = grainActivator;
4240
this.logger = loggerFactory.CreateLogger<Catalog>();
4341
this.activationCollector = activationCollector;
44-
this.RuntimeClient = serviceProvider.GetRequiredService<InsideRuntimeClient>();
4542

4643
GC.GetTotalMemory(true); // need to call once w/true to ensure false returns OK value
4744

@@ -58,7 +55,7 @@ public Catalog(
5855

5956
return counter;
6057
});
61-
RegisterSystemTarget(this);
58+
shared.ActivationDirectory.RecordNewTarget(this);
6259
}
6360

6461
/// <summary>
@@ -94,29 +91,6 @@ internal int UnregisterGrainForTesting(GrainId grain)
9491
return 1;
9592
}
9693

97-
public void RegisterSystemTarget(ISystemTarget target)
98-
{
99-
var systemTarget = target as SystemTarget;
100-
if (systemTarget == null) throw new ArgumentException($"Parameter must be of type {typeof(SystemTarget)}", nameof(target));
101-
systemTarget.RuntimeClient = this.RuntimeClient;
102-
var sp = this.serviceProvider;
103-
systemTarget.WorkItemGroup = new WorkItemGroup(
104-
systemTarget,
105-
sp.GetRequiredService<ILogger<WorkItemGroup>>(),
106-
sp.GetRequiredService<ILogger<ActivationTaskScheduler>>(),
107-
sp.GetRequiredService<IOptions<SchedulingOptions>>());
108-
activations.RecordNewTarget(systemTarget);
109-
}
110-
111-
public void UnregisterSystemTarget(ISystemTarget target)
112-
{
113-
var systemTarget = target as SystemTarget;
114-
if (systemTarget == null) throw new ArgumentException($"Parameter must be of type {typeof(SystemTarget)}", nameof(target));
115-
activations.RemoveTarget(systemTarget);
116-
}
117-
118-
public int ActivationCount { get { return activations.Count; } }
119-
12094
/// <summary>
12195
/// If activation already exists, return it.
12296
/// Otherwise, creates a new activation, begins rehydrating it and activating it, then returns it.
@@ -154,7 +128,7 @@ public IGrainContext GetOrCreateActivation(
154128
return result;
155129
}
156130

157-
if (!SiloStatusOracle.CurrentStatus.IsTerminating())
131+
if (!_siloStatusOracle.CurrentStatus.IsTerminating())
158132
{
159133
var address = new GrainAddress
160134
{
@@ -191,7 +165,7 @@ public IGrainContext GetOrCreateActivation(
191165
static IGrainContext UnableToCreateActivation(Catalog self, GrainId grainId)
192166
{
193167
// Did not find and did not start placing new
194-
var isTerminating = self.SiloStatusOracle.CurrentStatus.IsTerminating();
168+
var isTerminating = self._siloStatusOracle.CurrentStatus.IsTerminating();
195169
if (isTerminating)
196170
{
197171
self.LogDebugUnableToCreateActivationTerminating(grainId);
@@ -292,14 +266,6 @@ await Parallel.ForEachAsync(activations, options, (kv, _) =>
292266
}).WaitAsync(cancellationToken);
293267
}
294268

295-
public SiloStatus LocalSiloStatus
296-
{
297-
get
298-
{
299-
return SiloStatusOracle.CurrentStatus;
300-
}
301-
}
302-
303269
public async Task DeleteActivations(List<GrainAddress> addresses, DeactivationReasonCode reasonCode, string reasonText)
304270
{
305271
var tasks = new List<Task>(addresses.Count);
@@ -320,7 +286,7 @@ await Parallel.ForEachAsync(addresses, (activationAddress, cancellationToken) =>
320286
internal void OnSiloStatusChange(ILocalGrainDirectory directory, SiloAddress updatedSilo, SiloStatus status)
321287
{
322288
// ignore joining events and also events on myself.
323-
if (updatedSilo.Equals(LocalSilo)) return;
289+
if (updatedSilo.Equals(_siloAddress)) return;
324290

325291
// We deactivate those activations when silo goes either of ShuttingDown/Stopping/Dead states,
326292
// since this is what Directory is doing as well. Directory removes a silo based on all those 3 statuses,
@@ -386,6 +352,12 @@ void StartDeactivatingActivations(DeactivationReason reason, List<IGrainContext>
386352
}
387353
}
388354

355+
void ILifecycleParticipant<ISiloLifecycle>.Participate(ISiloLifecycle lifecycle)
356+
{
357+
// Do nothing, just ensure that this instance is created so that it can register itself in the activation directory.
358+
_siloStatusOracle = serviceProvider.GetRequiredService<ISiloStatusOracle>();
359+
}
360+
389361
private readonly struct SiloAddressLogValue(SiloAddress silo)
390362
{
391363
public override string ToString() => silo.ToStringWithHashCode();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#nullable enable
2+
using System;
3+
using Microsoft.Extensions.Logging;
4+
using Microsoft.Extensions.Options;
5+
using Orleans.Configuration;
6+
using Orleans.GrainReferences;
7+
using Orleans.Runtime.Scheduler;
8+
using Orleans.Timers;
9+
10+
namespace Orleans.Runtime;
11+
12+
internal sealed class SystemTargetShared(
13+
InsideRuntimeClient runtimeClient,
14+
ILocalSiloDetails localSiloDetails,
15+
ILoggerFactory loggerFactory,
16+
IOptions<SchedulingOptions> schedulingOptions,
17+
GrainReferenceActivator grainReferenceActivator,
18+
ITimerRegistry timerRegistry,
19+
ActivationDirectory activations)
20+
{
21+
private readonly ILogger<WorkItemGroup> _workItemGroupLogger = loggerFactory.CreateLogger<WorkItemGroup>();
22+
private readonly ILogger<ActivationTaskScheduler> _activationTaskSchedulerLogger = loggerFactory.CreateLogger<ActivationTaskScheduler>();
23+
public SiloAddress SiloAddress => localSiloDetails.SiloAddress;
24+
25+
public ILoggerFactory LoggerFactory => loggerFactory;
26+
public GrainReferenceActivator GrainReferenceActivator => grainReferenceActivator;
27+
public ITimerRegistry TimerRegistry => timerRegistry;
28+
29+
public RuntimeMessagingTrace MessagingTrace => new(loggerFactory);
30+
public InsideRuntimeClient RuntimeClient => runtimeClient;
31+
public ActivationDirectory ActivationDirectory => activations;
32+
public WorkItemGroup CreateWorkItemGroup(SystemTarget systemTarget)
33+
{
34+
ArgumentNullException.ThrowIfNull(systemTarget);
35+
return new WorkItemGroup(
36+
systemTarget,
37+
_workItemGroupLogger,
38+
_activationTaskSchedulerLogger,
39+
schedulingOptions);
40+
}
41+
}

0 commit comments

Comments
 (0)