protected SystemTarget(GrainId grainId, SiloAddress silo, bool lowPriority) { GrainId = grainId; Silo = silo; ActivationId = ActivationId.GetSystemActivation(grainId, silo); SchedulingContext = new SchedulingContext(this, lowPriority); }
public Message CreateResponseMessage() { var response = new Message(this.Category, Directions.Response) { Id = this.Id, IsReadOnly = this.IsReadOnly, IsAlwaysInterleave = this.IsAlwaysInterleave, TargetSilo = this.SendingSilo }; if (this.ContainsHeader(Header.SENDING_GRAIN)) { response.SetHeader(Header.TARGET_GRAIN, this.GetHeader(Header.SENDING_GRAIN)); if (this.ContainsHeader(Header.SENDING_ACTIVATION)) { response.SetHeader(Header.TARGET_ACTIVATION, this.GetHeader(Header.SENDING_ACTIVATION)); } } response.SendingSilo = this.TargetSilo; if (this.ContainsHeader(Header.TARGET_GRAIN)) { response.SetHeader(Header.SENDING_GRAIN, this.GetHeader(Header.TARGET_GRAIN)); if (this.ContainsHeader(Header.TARGET_ACTIVATION)) { response.SetHeader(Header.SENDING_ACTIVATION, this.GetHeader(Header.TARGET_ACTIVATION)); } else if (this.TargetGrain.IsSystemTarget) { response.SetHeader(Header.SENDING_ACTIVATION, ActivationId.GetSystemActivation(TargetGrain, TargetSilo)); } } if (this.ContainsHeader(Header.TIMESTAMPS)) { response.SetHeader(Header.TIMESTAMPS, this.GetHeader(Header.TIMESTAMPS)); } if (this.ContainsHeader(Header.DEBUG_CONTEXT)) { response.SetHeader(Header.DEBUG_CONTEXT, this.GetHeader(Header.DEBUG_CONTEXT)); } if (this.ContainsHeader(Header.CACHE_INVALIDATION_HEADER)) { response.SetHeader(Header.CACHE_INVALIDATION_HEADER, this.GetHeader(Header.CACHE_INVALIDATION_HEADER)); } if (this.ContainsHeader(Header.EXPIRATION)) { response.SetHeader(Header.EXPIRATION, this.GetHeader(Header.EXPIRATION)); } if (Message.WriteMessagingTraces) { response.AddTimestamp(LifecycleTag.CreateResponse); } RequestContext.ExportToMessage(response); return(response); }
internal SystemTarget(GrainId grainId, SiloAddress silo, bool lowPriority, ILoggerFactory loggerFactory) { this.grainId = grainId; Silo = silo; this.loggerFactory = loggerFactory; ActivationId = ActivationId.GetSystemActivation(grainId, silo); schedulingContext = new SchedulingContext(this, lowPriority); this.timerLogger = loggerFactory.CreateLogger <GrainTimer>(); }
internal SystemTarget(GrainId grainId, SiloAddress silo, bool lowPriority, ILoggerFactory loggerFactory) { this.grainId = grainId; this.Silo = silo; this.ActivationAddress = ActivationAddress.GetAddress(this.Silo, this.grainId, this.ActivationId); this.ActivationId = ActivationId.GetSystemActivation(grainId, silo); this.IsLowPriority = lowPriority; this.timerLogger = loggerFactory.CreateLogger <GrainTimer>(); }
public Message CreateResponseMessage(Message request) { var response = new Message { Category = request.Category, Direction = Message.Directions.Response, Id = request.Id, IsReadOnly = request.IsReadOnly, IsAlwaysInterleave = request.IsAlwaysInterleave, TargetSilo = request.SendingSilo, TraceContext = request.TraceContext, TransactionInfo = request.TransactionInfo }; if (request.SendingGrain != null) { response.TargetGrain = request.SendingGrain; if (request.SendingActivation != null) { response.TargetActivation = request.SendingActivation; } } response.SendingSilo = request.TargetSilo; if (request.TargetGrain != null) { response.SendingGrain = request.TargetGrain; if (request.TargetActivation != null) { response.SendingActivation = request.TargetActivation; } else if (request.TargetGrain.IsSystemTarget) { response.SendingActivation = ActivationId.GetSystemActivation(request.TargetGrain, request.TargetSilo); } } if (request.DebugContext != null) { response.DebugContext = request.DebugContext; } response.CacheInvalidationHeader = request.CacheInvalidationHeader; response.TimeToLive = request.TimeToLive; var contextData = RequestContextExtensions.Export(this.serializationManager); if (contextData != null) { response.RequestContextData = contextData; } messagingTrace.OnCreateMessage(response); return(response); }
public Message CreateResponseMessage() { var response = new Message(this.Category, Directions.Response) { Id = this.Id, IsReadOnly = this.IsReadOnly, IsAlwaysInterleave = this.IsAlwaysInterleave, TargetSilo = this.SendingSilo }; if (this.ContainsHeader(Header.SENDING_GRAIN)) { response.SetHeader(Header.TARGET_GRAIN, this.GetHeader(Header.SENDING_GRAIN)); if (this.ContainsHeader(Header.SENDING_ACTIVATION)) { response.SetHeader(Header.TARGET_ACTIVATION, this.GetHeader(Header.SENDING_ACTIVATION)); } } response.SendingSilo = this.TargetSilo; if (this.ContainsHeader(Header.TARGET_GRAIN)) { response.SetHeader(Header.SENDING_GRAIN, this.GetHeader(Header.TARGET_GRAIN)); if (this.ContainsHeader(Header.TARGET_ACTIVATION)) { response.SetHeader(Header.SENDING_ACTIVATION, this.GetHeader(Header.TARGET_ACTIVATION)); } else if (this.TargetGrain.IsSystemTarget) { response.SetHeader(Header.SENDING_ACTIVATION, ActivationId.GetSystemActivation(TargetGrain, TargetSilo)); } } if (this.ContainsHeader(Header.DEBUG_CONTEXT)) { response.SetHeader(Header.DEBUG_CONTEXT, this.GetHeader(Header.DEBUG_CONTEXT)); } if (this.ContainsHeader(Header.CACHE_INVALIDATION_HEADER)) { response.SetHeader(Header.CACHE_INVALIDATION_HEADER, this.GetHeader(Header.CACHE_INVALIDATION_HEADER)); } if (this.ContainsHeader(Header.EXPIRATION)) { response.SetHeader(Header.EXPIRATION, this.GetHeader(Header.EXPIRATION)); } var contextData = RequestContext.Export(); if (contextData != null) { response.RequestContextData = contextData; } return(response); }
public Message CreateResponseMessage(Message request) { var response = new Message { Category = request.Category, Direction = Message.Directions.Response, Id = request.Id, IsReadOnly = request.IsReadOnly, IsAlwaysInterleave = request.IsAlwaysInterleave, TargetSilo = request.SendingSilo }; if (request.SendingGrain != null) { response.TargetGrain = request.SendingGrain; if (request.SendingActivation != null) { response.TargetActivation = request.SendingActivation; } } response.SendingSilo = request.TargetSilo; if (request.TargetGrain != null) { response.SendingGrain = request.TargetGrain; if (request.TargetActivation != null) { response.SendingActivation = request.TargetActivation; } else if (request.TargetGrain.IsSystemTarget) { response.SendingActivation = ActivationId.GetSystemActivation(request.TargetGrain, request.TargetSilo); } } if (request.DebugContext != null) { response.DebugContext = request.DebugContext; } response.CacheInvalidationHeader = request.CacheInvalidationHeader; response.Expiration = request.Expiration; var contextData = RequestContext.Export(); if (contextData != null) { response.RequestContextData = contextData; } return(response); }
internal void SendSystemTargetMessage(Message message) { message.Category = message.TargetGrain.Equals(Constants.MembershipOracleId) ? Message.Categories.Ping : Message.Categories.System; if (message.TargetSilo == null) { message.TargetSilo = Transport.MyAddress; } if (message.TargetActivation == null) { message.TargetActivation = ActivationId.GetSystemActivation(message.TargetGrain, message.TargetSilo); } TransportMessage(message); }
private void SendRequestMessage( GrainReference target, Message message, TaskCompletionSource <object> context, Action <Message, TaskCompletionSource <object> > callback, string debugContext, InvokeMethodOptions options, string genericArguments = null) { // fill in sender if (message.SendingSilo == null) { message.SendingSilo = MySilo; } if (!String.IsNullOrEmpty(genericArguments)) { message.GenericGrainType = genericArguments; } SchedulingContext schedulingContext = RuntimeContext.Current != null ? RuntimeContext.Current.ActivationContext as SchedulingContext : null; ActivationData sendingActivation = null; if (schedulingContext == null) { throw new InvalidOperationException( String.Format("Trying to send a message {0} on a silo not from within grain and not from within system target (RuntimeContext is not set to SchedulingContext) " + "RuntimeContext.Current={1} TaskScheduler.Current={2}", message, RuntimeContext.Current == null ? "null" : RuntimeContext.Current.ToString(), TaskScheduler.Current)); } switch (schedulingContext.ContextType) { case SchedulingContextType.SystemThread: throw new ArgumentException( String.Format("Trying to send a message {0} on a silo not from within grain and not from within system target (RuntimeContext is of SchedulingContextType.SystemThread type)", message), "context"); case SchedulingContextType.Activation: message.SendingActivation = schedulingContext.Activation.ActivationId; message.SendingGrain = schedulingContext.Activation.Grain; sendingActivation = schedulingContext.Activation; break; case SchedulingContextType.SystemTarget: message.SendingActivation = schedulingContext.SystemTarget.ActivationId; message.SendingGrain = ((ISystemTargetBase)schedulingContext.SystemTarget).GrainId; break; } // fill in destination var targetGrainId = target.GrainId; message.TargetGrain = targetGrainId; if (targetGrainId.IsSystemTarget) { SiloAddress targetSilo = (target.SystemTargetSilo ?? MySilo); message.TargetSilo = targetSilo; message.TargetActivation = ActivationId.GetSystemActivation(targetGrainId, targetSilo); message.Category = targetGrainId.Equals(Constants.MembershipOracleId) ? Message.Categories.Ping : Message.Categories.System; } if (target.IsObserverReference) { message.TargetObserverId = target.ObserverId; } if (debugContext != null) { message.DebugContext = debugContext; } var oneWay = (options & InvokeMethodOptions.OneWay) != 0; if (context == null && !oneWay) { logger.Warn(ErrorCode.IGC_SendRequest_NullContext, "Null context {0}: {1}", message, Utils.GetStackTrace()); } if (message.IsExpirableMessage(Config.Globals)) { message.TimeToLive = ResponseTimeout; } if (!oneWay) { var callbackData = new CallbackData( callback, tryResendMessage, context, message, unregisterCallback, Config.Globals); callbacks.TryAdd(message.Id, callbackData); callbackData.StartTimer(ResponseTimeout); } if (targetGrainId.IsSystemTarget) { // Messages to system targets bypass the task system and get sent "in-line" this.Dispatcher.TransportMessage(message); } else { this.Dispatcher.SendMessage(message, sendingActivation); } }
public void SendRequest( GrainReference target, InvokeMethodRequest request, TaskCompletionSource <object> context, string debugContext, InvokeMethodOptions options, string genericArguments = null) { var message = this.messageFactory.CreateMessage(request, options); // fill in sender if (message.SendingSilo == null) { message.SendingSilo = MySilo; } if (!String.IsNullOrEmpty(genericArguments)) { message.GenericGrainType = genericArguments; } SchedulingContext schedulingContext = RuntimeContext.CurrentActivationContext as SchedulingContext; ActivationData sendingActivation = null; if (schedulingContext == null) { var clientAddress = this.HostedClient.ClientAddress; message.SendingGrain = clientAddress.Grain; message.SendingActivation = clientAddress.Activation; } else { switch (schedulingContext.ContextType) { case SchedulingContextType.SystemThread: throw new ArgumentException( String.Format( "Trying to send a message {0} on a silo not from within grain and not from within system target (RuntimeContext is of SchedulingContextType.SystemThread type)", message), "context"); case SchedulingContextType.Activation: message.SendingActivation = schedulingContext.Activation.ActivationId; message.SendingGrain = schedulingContext.Activation.Grain; sendingActivation = schedulingContext.Activation; break; case SchedulingContextType.SystemTarget: message.SendingActivation = schedulingContext.SystemTarget.ActivationId; message.SendingGrain = ((ISystemTargetBase)schedulingContext.SystemTarget).GrainId; break; } } // fill in destination var targetGrainId = target.GrainId; message.TargetGrain = targetGrainId; SharedCallbackData sharedData; if (targetGrainId.IsSystemTarget) { SiloAddress targetSilo = (target.SystemTargetSilo ?? MySilo); message.TargetSilo = targetSilo; message.TargetActivation = ActivationId.GetSystemActivation(targetGrainId, targetSilo); message.Category = targetGrainId.Equals(Constants.MembershipOracleId) ? Message.Categories.Ping : Message.Categories.System; sharedData = this.systemSharedCallbackData; } else { sharedData = this.sharedCallbackData; } if (target.IsObserverReference) { message.TargetObserverId = target.ObserverId; } if (debugContext != null) { message.DebugContext = debugContext; } var oneWay = (options & InvokeMethodOptions.OneWay) != 0; if (context is null && !oneWay) { this.logger.Warn(ErrorCode.IGC_SendRequest_NullContext, "Null context {0}: {1}", message, Utils.GetStackTrace()); } if (message.IsExpirableMessage(this.messagingOptions.DropExpiredMessages)) { message.TimeToLive = sharedData.ResponseTimeout; } if (!oneWay) { var callbackData = new CallbackData(sharedData, context, message); callbacks.TryAdd(message.Id, callbackData); } this.messagingTrace.OnSendRequest(message); if (targetGrainId.IsSystemTarget) { // Messages to system targets bypass the task system and get sent "in-line" this.Dispatcher.TransportMessage(message); } else { this.Dispatcher.SendMessage(message, sendingActivation); } }