public IGrainContext CreateContext(GrainAddress activationAddress) { var context = new ActivationData( activationAddress, _createWorkItemGroup, _serviceProvider, _sharedComponents); RuntimeContext.SetExecutionContext(context, out var existingContext); try { // Instantiate the grain itself var grainInstance = (Grain)_grainActivator.CreateInstance(context); context.SetGrainInstance(grainInstance); } finally { RuntimeContext.SetExecutionContext(existingContext); } return(context); }
/// <summary> /// Perform just the prompt, local part of creating an activation object /// Caller is responsible for registering locally, registering with store and calling its activate routine /// </summary> /// <param name="grainTypeName"></param> /// <param name="data"></param> /// <param name="genericArguments"></param> /// <returns></returns> private void CreateGrainInstance(string grainTypeName, ActivationData data, string genericArguments) { string grainClassName; var interfaceToClassMap = GrainTypeManager.GetGrainInterfaceToClassMap(); if (!interfaceToClassMap.TryGetValue(grainTypeName, out grainClassName)) { // Lookup from grain type code var typeCode = data.Grain.GetTypeCode(); if (typeCode != 0) { PlacementStrategy unused; GetGrainTypeInfo(typeCode, out grainClassName, out unused, genericArguments); } else { grainClassName = grainTypeName; } } GrainTypeData grainTypeData = GrainTypeManager[grainClassName]; Type grainType = grainTypeData.Type; Type stateObjectType = grainTypeData.StateObjectType; lock (data) { var grain = (Grain) Activator.CreateInstance(grainType); grain.Identity = data.Identity; grain.Runtime = grainRuntime; data.SetGrainInstance(grain); if (stateObjectType != null) { SetupStorageProvider(data); var state = (GrainState)Activator.CreateInstance(stateObjectType); state.InitState(null); data.GrainInstance.GrainState = state; data.GrainInstance.Storage = new GrainStateStorageBridge(data.GrainTypeName, data.GrainInstance, data.StorageProvider); } } activations.IncrementGrainCounter(grainClassName); data.GrainInstance.Data = data; if (logger.IsVerbose) logger.Verbose("CreateGrainInstance {0}{1}", data.Grain, data.ActivationId); }
/// <summary> /// Unregister message target and stop delivering messages to it /// </summary> /// <param name="activation"></param> public void UnregisterMessageTarget(ActivationData activation) { activations.RemoveTarget(activation); // this should be removed once we've refactored the deactivation code path. For now safe to keep. ActivationCollector.TryCancelCollection(activation); activationsDestroyed.Increment(); scheduler.UnregisterWorkContext(new SchedulingContext(activation)); if (activation.GrainInstance == null) return; var grainTypeName = TypeUtils.GetFullName(activation.GrainInstanceType); activations.DecrementGrainCounter(grainTypeName); activation.SetGrainInstance(null); }
/// <summary> /// Perform just the prompt, local part of creating an activation object /// Caller is responsible for registering locally, registering with store and calling its activate routine /// </summary> /// <param name="grainTypeName"></param> /// <param name="data"></param> /// <param name="genericArguments"></param> /// <returns></returns> private void CreateGrainInstance(string grainTypeName, ActivationData data, string genericArguments) { string grainClassName; if (!GrainTypeManager.TryGetPrimaryImplementation(grainTypeName, out grainClassName)) { // Lookup from grain type code var typeCode = data.Grain.GetTypeCode(); if (typeCode != 0) { PlacementStrategy unused; MultiClusterRegistrationStrategy unusedActivationStrategy; GetGrainTypeInfo(typeCode, out grainClassName, out unused, out unusedActivationStrategy, genericArguments); } else { grainClassName = grainTypeName; } } GrainTypeData grainTypeData = GrainTypeManager[grainClassName]; //Get the grain's type Type grainType = grainTypeData.Type; //Gets the type for the grain's state Type stateObjectType = grainTypeData.StateObjectType; lock (data) { Grain grain; //Create a new instance of a stateless grain if (stateObjectType == null) { //Create a new instance of the given grain type grain = grainCreator.CreateGrainInstance(grainType, data.Identity); } //Create a new instance of a stateful grain else { SetupStorageProvider(grainType, data); grain = grainCreator.CreateGrainInstance(grainType, data.Identity, stateObjectType, data.StorageProvider); } grain.Data = data; data.SetGrainInstance(grain); } activations.IncrementGrainCounter(grainClassName); if (logger.IsVerbose) logger.Verbose("CreateGrainInstance {0}{1}", data.Grain, data.ActivationId); }
/// <summary> /// Perform just the prompt, local part of creating an activation object /// Caller is responsible for registering locally, registering with store and calling its activate routine /// </summary> /// <param name="grainTypeName"></param> /// <param name="data"></param> /// <param name="genericArguments"></param> /// <returns></returns> private void CreateGrainInstance(string grainTypeName, ActivationData data, string genericArguments) { string grainClassName; var interfaceToClassMap = GrainTypeManager.GetGrainInterfaceToClassMap(); if (!interfaceToClassMap.TryGetValue(grainTypeName, out grainClassName)) { // Lookup from grain type code var typeCode = data.Grain.GetTypeCode(); if (typeCode != 0) { PlacementStrategy unused; GetGrainTypeInfo(typeCode, out grainClassName, out unused, genericArguments); } else { grainClassName = grainTypeName; } } GrainTypeData grainTypeData = GrainTypeManager[grainClassName]; Type grainType = grainTypeData.Type; // TODO: Change back to GetRequiredService after stable Microsoft.Framework.DependencyInjection is released and can be referenced here var services = Runtime.Silo.CurrentSilo.Services; var grain = services != null ? (Grain) services.GetService(grainType) : (Grain) Activator.CreateInstance(grainType); // Inject runtime hooks into grain instance grain.Runtime = grainRuntime; grain.Data = data; Type stateObjectType = grainTypeData.StateObjectType; object state = null; if (stateObjectType != null) { state = Activator.CreateInstance(stateObjectType); } lock (data) { grain.Identity = data.Identity; data.SetGrainInstance(grain); var statefulGrain = grain as IStatefulGrain; if (statefulGrain != null) { if (state != null) { SetupStorageProvider(data); statefulGrain.GrainState.State = state; statefulGrain.SetStorage(new GrainStateStorageBridge(data.GrainTypeName, statefulGrain, data.StorageProvider)); } } } activations.IncrementGrainCounter(grainClassName); if (logger.IsVerbose) logger.Verbose("CreateGrainInstance {0}{1}", data.Grain, data.ActivationId); }
/// <summary> /// Perform just the prompt, local part of creating an activation object /// Caller is responsible for registering locally, registering with store and calling its activate routine /// </summary> /// <param name="grainTypeName"></param> /// <param name="data"></param> /// <param name="genericArguments"></param> /// <returns></returns> private void CreateGrainInstance(string grainTypeName, ActivationData data, string genericArguments) { string grainClassName; var interfaceToClassMap = GrainTypeManager.GetGrainInterfaceToClassMap(); if (!interfaceToClassMap.TryGetValue(grainTypeName, out grainClassName)) { // Lookup from grain type code var typeCode = data.Grain.GetTypeCode(); if (typeCode != 0) { PlacementStrategy unused; MultiClusterRegistrationStrategy unusedActivationStrategy; GetGrainTypeInfo(typeCode, out grainClassName, out unused, out unusedActivationStrategy, genericArguments); } else { grainClassName = grainTypeName; } } GrainTypeData grainTypeData = GrainTypeManager[grainClassName]; Type grainType = grainTypeData.Type; //Create a new instance of the given grain type var grain = grainCreator.CreateGrainInstance(grainType, data.Identity); grain.Data = data; Type stateObjectType = grainTypeData.StateObjectType; object state = null; if (stateObjectType != null) { state = Activator.CreateInstance(stateObjectType); } lock (data) { data.SetGrainInstance(grain); var statefulGrain = grain as IStatefulGrain; if (statefulGrain != null) { if (state != null) { SetupStorageProvider(data); statefulGrain.GrainState.State = state; statefulGrain.SetStorage(new GrainStateStorageBridge(data.GrainTypeName, statefulGrain, data.StorageProvider)); } } } activations.IncrementGrainCounter(grainClassName); if (logger.IsVerbose) logger.Verbose("CreateGrainInstance {0}{1}", data.Grain, data.ActivationId); }