예제 #1
0
 /// <inheritdoc/>
 public void GetObjectData(SerializationInfo info, StreamingContext context)
 {
     info.AddValue("tv", GrainType.UnsafeGetArray(Type));
     info.AddValue("th", Type.GetHashCode());
     info.AddValue("kv", IdSpan.UnsafeGetArray(Key));
     info.AddValue("kh", Key.GetHashCode());
 }
예제 #2
0
        public bool TryGet(GrainType grainType, out IGrainContextActivator activator)
        {
            if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass) ||
                !typeof(Grain).IsAssignableFrom(grainClass))
            {
                activator = null;
                return(false);
            }

            var             sharedComponents  = _sharedComponentsResolver.GetComponents(grainType);
            IGrainActivator instanceActivator = sharedComponents.GetComponent <IGrainActivator>();

            if (instanceActivator is null)
            {
                throw new InvalidOperationException($"Could not find a suitable {nameof(IGrainActivator)} implementation for grain type {grainType}");
            }

            var(activationCollector, collectionAgeLimit) = GetCollectionAgeLimit(grainType, grainClass);

            activator = new ActivationDataActivator(
                instanceActivator,
                _placementStrategyResolver.GetPlacementStrategy(grainType),
                activationCollector,
                collectionAgeLimit,
                _messagingOptions,
                _maxWarningRequestProcessingTime,
                _maxRequestProcessingTime,
                _loggerFactory,
                _serviceProvider,
                _grainRuntime ??= _serviceProvider.GetRequiredService <IGrainRuntime>(),
                _grainReferenceActivator,
                sharedComponents,
                _activationMessageScheduler ??= _serviceProvider.GetRequiredService <ActivationMessageScheduler>());
            return(true);
        }
예제 #3
0
 public readonly void GetObjectData(SerializationInfo info, StreamingContext context)
 {
     info.AddValue("tv", GrainType.UnsafeGetArray(_type));
     info.AddValue("th", _type.GetHashCode());
     info.AddValue("kv", SpanId.UnsafeGetArray(_key));
     info.AddValue("kh", _key.GetHashCode());
 }
        /// <summary>
        /// Converts the provided <see cref="GrainReference"/> to a string which can be parsed by <see cref="GrainReferenceKeyStringConverter"/>.
        /// </summary>
        /// <param name="grainReference">
        /// The grain reference.
        /// </param>
        /// <returns>The key string.</returns>
        public static string ToKeyString(this GrainReference grainReference)
        {
            var id         = grainReference.GrainId;
            var typeString = Convert.ToBase64String(GrainType.UnsafeGetArray(id.Type));
            var keyString  = Convert.ToBase64String(IdSpan.UnsafeGetArray(id.Key));

            return($"{typeString}_{keyString}");
        }
예제 #5
0
 private (IActivationCollector, TimeSpan) GetCollectionAgeLimit(GrainType grainType, Type grainClass)
 {
     if (_siloManifest.Grains.TryGetValue(grainType, out var properties) &&
         properties.Properties.TryGetValue(WellKnownGrainTypeProperties.IdleDeactivationPeriod, out var idleTimeoutString))
     {
         if (string.Equals(idleTimeoutString, WellKnownGrainTypeProperties.IndefiniteIdleDeactivationPeriodValue))
         {
             return(null, default);
예제 #6
0
        public static string SystemTargetName(GrainType id)
        {
            if (singletonSystemTargetNames.TryGetValue(id, out var name))
            {
                return(name);
            }

            return(string.Empty);
        }
예제 #7
0
        /// <summary>
        /// Creates a new <see cref="SystemTargetGrainId"/> instance.
        /// </summary>
        public static SystemTargetGrainId Create(GrainType kind, SiloAddress address, string extraIdentifier)
        {
            if (extraIdentifier is string)
            {
                return(new SystemTargetGrainId(GrainId.Create(kind, address.ToParsableString() + SegmentSeparator + extraIdentifier)));
            }

            return(Create(kind, address));
        }
예제 #8
0
        public static string SystemTargetName(GrainType id)
        {
            if (singletonSystemTargetNames.TryGetValue(id, out var name))
            {
                return(name);
            }

            return(id.ToStringUtf8());
        }
예제 #9
0
        /// <summary>
        /// Converts the provided value into a <see cref="GrainReference"/>.
        /// </summary>
        public GrainReference FromKeyString(string referenceString)
        {
            var splits = referenceString.Split('_');
            var type   = new GrainType(Convert.FromBase64String(splits[0]));
            var key    = new IdSpan(Convert.FromBase64String(splits[1]));
            var id     = new GrainId(type, key);

            return(_activator.CreateReference(id, default));
        }
예제 #10
0
        /// <summary>
        /// Returns the generic grain type corresponding to the provided value.
        /// </summary>
        public static bool TryParse(GrainType grainType, out GenericGrainType result)
        {
            if (TypeConverterExtensions.IsGenericType(grainType.Value))
            {
                result = new GenericGrainType(grainType);
                return(true);
            }

            result = default;
            return(false);
        }
예제 #11
0
 public GrainReferenceShared(
     GrainType graintype,
     GrainInterfaceType grainInterfaceType,
     IGrainReferenceRuntime runtime,
     InvokeMethodOptions invokeMethodOptions)
 {
     this.GrainType           = graintype;
     this.InterfaceType       = grainInterfaceType;
     this.Runtime             = runtime;
     this.InvokeMethodOptions = invokeMethodOptions;
 }
예제 #12
0
        private GrainTypeComponents Create(GrainType grainType)
        {
            var result     = new GrainTypeComponents();
            var properties = _resolver.GetGrainProperties(grainType);

            foreach (var configurator in _configurators)
            {
                configurator.Configure(grainType, properties, result);
            }

            return(result);
        }
        /// <summary>
        /// Converts the provided grain reference key <see cref="string"/> into a <see cref="GrainReference"/>.
        /// </summary>
        /// <param name="referenceString">
        /// The string representation of a grain reference.
        /// </param>
        /// <returns>The grain reference.</returns>
        public GrainReference FromKeyString(string referenceString)
        {
            var i = referenceString.IndexOf('_');

            if (i < 0)
            {
                throw new ArgumentException(nameof(referenceString));
            }
            var type = new GrainType(Convert.FromBase64String(referenceString.Substring(0, i)));
            var key  = new IdSpan(Convert.FromBase64String(referenceString.Substring(i + 1)));
            var id   = new GrainId(type, key);

            return(_activator.CreateReference(id, default));
        }
예제 #14
0
 public GrainReferenceShared(
     GrainType grainType,
     GrainInterfaceType grainInterfaceType,
     ushort interfaceVersion,
     IGrainReferenceRuntime runtime,
     InvokeMethodOptions invokeMethodOptions,
     IServiceProvider serviceProvider)
 {
     this.GrainType           = grainType;
     this.InterfaceType       = grainInterfaceType;
     this.Runtime             = runtime;
     this.InvokeMethodOptions = invokeMethodOptions;
     this.ServiceProvider     = serviceProvider;
     this.InterfaceVersion    = interfaceVersion;
 }
예제 #15
0
        /// <summary>
        /// Creates a new <see cref="SystemTargetGrainId"/> instance.
        /// </summary>
        public static SystemTargetGrainId Create(GrainType kind, SiloAddress address, string extraIdentifier)
        {
            var addr = address.ToUtf8String();

            if (extraIdentifier is string)
            {
                var extraLen = Encoding.UTF8.GetByteCount(extraIdentifier);
                var buf      = new byte[addr.Length + 1 + extraLen];
                addr.CopyTo(buf.AsSpan());
                buf[addr.Length] = (byte)SegmentSeparator;
                Encoding.UTF8.GetBytes(extraIdentifier, 0, extraIdentifier.Length, buf, addr.Length + 1);
                addr = buf;
            }

            return(new SystemTargetGrainId(new GrainId(kind, new IdSpan(addr))));
        }
예제 #16
0
        private GrainType GetGrainType()
        {
            // TODO: intern
            var key = this.Key;

            if (this.IsSystemTarget)
            {
                return(GrainType.Create($"{GrainTypePrefix.SystemTargetPrefix}{key.TypeCodeData:X16}"));
            }
            else if (this.IsClient)
            {
                return(GrainType.Create($"{GrainTypePrefix.ClientPrefix}.{key.TypeCodeData:X16}"));
            }
            else
            {
                return(GrainType.Create($"{GrainTypePrefix.LegacyGrainPrefix}{key.TypeCodeData:X16}"));
            }
        }
        public bool TryGet(GrainType grainType, out IGrainContextActivator activator)
        {
            if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass) ||
                !typeof(Grain).IsAssignableFrom(grainClass))
            {
                activator = null;
                return(false);
            }

            var sharedContext     = _sharedComponentsResolver.GetComponents(grainType);
            var instanceActivator = sharedContext.GetComponent <IGrainActivator>();

            if (instanceActivator is null)
            {
                throw new InvalidOperationException($"Could not find a suitable {nameof(IGrainActivator)} implementation for grain type {grainType}");
            }

            var innerActivator = new ActivationDataActivator(
                instanceActivator,
                _serviceProvider,
                sharedContext,
                _workItemGroupLogger,
                _activationTaskSchedulerLogger,
                _schedulerStatisticsGroup,
                _schedulingOptions,
                _statisticsOptions);

            if (sharedContext.PlacementStrategy is StatelessWorkerPlacement)
            {
                activator = new StatelessWorkerActivator(sharedContext, innerActivator);
            }
            else
            {
                activator = innerActivator;
            }

            return(true);
        }
        private ActivatorEntry CreateActivator(GrainType grainType)
        {
            lock (_lockObj)
            {
                if (!_activators.TryGetValue(grainType, out var configuredActivator))
                {
                    IGrainContextActivator unconfiguredActivator = null;
                    foreach (var provider in this._activatorProviders)
                    {
                        if (provider.TryGet(grainType, out unconfiguredActivator))
                        {
                            break;
                        }
                    }

                    if (unconfiguredActivator is null)
                    {
                        throw new InvalidOperationException($"Unable to find an {nameof(IGrainContextActivatorProvider)} for grain type {grainType}");
                    }

                    var properties = _resolver.GetGrainProperties(grainType);
                    List <IConfigureGrainContext> configureActions = new List <IConfigureGrainContext>();
                    foreach (var provider in _configuratorProviders)
                    {
                        if (provider.TryGetConfigurator(grainType, properties, out var configurator))
                        {
                            configureActions.Add(configurator);
                        }
                    }

                    var applicableConfigureActions = configureActions.Count > 0 ? configureActions.ToArray() : Array.Empty <IConfigureGrainContext>();
                    configuredActivator = new ActivatorEntry(unconfiguredActivator, applicableConfigureActions);
                    _activators         = _activators.SetItem(grainType, configuredActivator);
                }

                return(configuredActivator);
            }
        }
예제 #19
0
 /// <summary>
 /// Creates a new <see cref="GrainType"/> instance.
 /// </summary>
 private GrainId(SerializationInfo info, StreamingContext context)
 {
     Type = new GrainType(IdSpan.UnsafeCreate((byte[])info.GetValue("tv", typeof(byte[])), info.GetInt32("th")));
     Key  = IdSpan.UnsafeCreate((byte[])info.GetValue("kv", typeof(byte[])), info.GetInt32("kh"));
 }
예제 #20
0
 public static GrainType CreateGrainTypeForSystemTarget(int typeCode)
 {
     return(GrainType.Create($"{GrainTypePrefix.SystemTargetPrefix}{typeCode:X16}"));
 }
예제 #21
0
 public static GrainType CreateGrainTypeForGrain(int typeCode)
 {
     return(GrainType.Create($"{GrainTypePrefix.LegacyGrainPrefix}{typeCode:X16}"));
 }
예제 #22
0
 /// <inheritdoc />
 TGrainInterface IInternalGrainFactory.GetSystemTarget <TGrainInterface>(GrainType grainType, SiloAddress destination)
 {
     return(this.grainFactory.GetSystemTarget <TGrainInterface>(grainType, destination));
 }
예제 #23
0
 /// <summary>
 /// Populates grain properties to specify the preferred placement strategy.
 /// </summary>
 /// <param name="services">The service provider.</param>
 /// <param name="grainClass">The grain class.</param>
 /// <param name="grainType">The grain type.</param>
 /// <param name="properties">The grain properties which will be populated by this method call.</param>
 public virtual void PopulateGrainProperties(IServiceProvider services, Type grainClass, GrainType grainType, Dictionary <string, string> properties)
 {
     properties[WellKnownGrainTypeProperties.PlacementStrategy] = this.GetType().Name;
 }
예제 #24
0
 public static GrainId GetSystemTargetGrainId(GrainType kind, SiloAddress address)
 {
     return(GrainId.Create(kind, address.ToParsableString()));
 }
예제 #25
0
 /// <summary>
 /// Creates a new <see cref="SystemTargetGrainId"/> instance.
 /// </summary>
 public static SystemTargetGrainId Create(GrainType kind, SiloAddress address) => new SystemTargetGrainId(new GrainId(kind, new IdSpan(address.ToUtf8String())));
예제 #26
0
 /// <summary>
 /// Creates a system target <see cref="GrainType"/> with the provided name.
 /// </summary>
 public static GrainType CreateGrainType(string name) => GrainType.Create($"{GrainTypePrefix.SystemTargetPrefix}{name}");
예제 #27
0
 internal static GrainId CreateGrainServiceGrainId(GrainType grainType, SiloAddress address)
 => new GrainId(grainType, new IdSpan(address.ToUtf8String()));
예제 #28
0
 /// <summary>
 /// Creates a new <see cref="GrainType"/> instance.
 /// </summary>
 public static GrainId Create(GrainType type, IdSpan key) => new GrainId(type, key);
예제 #29
0
 /// <summary>
 /// Creates a new <see cref="GrainType"/> instance.
 /// </summary>
 public static GrainId Create(GrainType type, string key) => new GrainId(type, IdSpan.Create(key));
예제 #30
0
 /// <summary>
 /// Creates a new <see cref="GrainType"/> instance.
 /// </summary>
 public static GrainId Create(string type, string key) => Create(GrainType.Create(type), key);