55using System . Threading . Tasks ;
66using Microsoft . Extensions . DependencyInjection ;
77using Microsoft . Extensions . Logging ;
8- using Microsoft . Extensions . Options ;
9- using Orleans . Configuration ;
108using Orleans . GrainDirectory ;
119using Orleans . Runtime . GrainDirectory ;
12- using Orleans . Runtime . Scheduler ;
1310
1411namespace 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 ( ) ;
0 commit comments