예제 #1
0
 public void Configure(GrainType grainType, GrainProperties properties, GrainTypeComponents shared)
 {
     if (_grainClassMap.TryGetGrainClass(grainType, out var grainClass) && grainClass.IsAssignableFrom(typeof(ExplicitlyRegisteredSimpleDIGrain)))
     {
         shared.SetComponent <IGrainActivator>(this);
     }
 }
예제 #2
0
        private static ImmutableDictionary <GrainType, GrainProperties> CreateGrainManifest(
            IEnumerable <IGrainPropertiesProvider> grainMetadataProviders,
            IOptions <GrainTypeOptions> grainTypeOptions,
            GrainTypeResolver grainTypeProvider)
        {
            var propertiesMap = ImmutableDictionary.CreateBuilder <GrainType, GrainProperties>();

            foreach (var grainClass in grainTypeOptions.Value.Classes)
            {
                var grainType  = grainTypeProvider.GetGrainType((Type)grainClass);
                var properties = new Dictionary <string, string>();
                foreach (var provider in grainMetadataProviders)
                {
                    provider.Populate((Type)grainClass, grainType, properties);
                }

                var result = new GrainProperties(properties.ToImmutableDictionary());
                if (propertiesMap.ContainsKey(grainType))
                {
                    throw new InvalidOperationException($"An entry with the key {grainType} is already present."
                                                        + $"\nExisting: {propertiesMap[grainType].ToDetailedString()}\nTrying to add: {result.ToDetailedString()}"
                                                        + "\nConsider using the [GrainType(\"name\")] attribute to give these classes unique names.");
                }

                propertiesMap.Add(grainType, result);
            }

            return(propertiesMap.ToImmutable());
        }
예제 #3
0
        public override void Initialize(GrainProperties properties)
        {
            base.Initialize(properties);
            CustomPlacementScenario result;

            if (properties.Properties.TryGetValue(ScenarioKey, out var value) && Enum.TryParse(value, out result))
            {
                this.Scenario = result;
            }
        }
예제 #4
0
        public bool TryResolvePlacementStrategy(GrainType grainType, GrainProperties properties, out PlacementStrategy result)
        {
            if (grainType.IsClient())
            {
                result = _strategy;
                return(true);
            }

            result = default;
            return(false);
        }
 public override void Initialize(GrainProperties properties)
 {
     base.Initialize(properties);
     if (properties.Properties.TryGetValue(MaxLocalPropertyKey, out var value) &&
         !string.IsNullOrWhiteSpace(value))
     {
         if (int.TryParse(value, out var maxLocal))
         {
             this.MaxLocal = maxLocal;
         }
     }
 }
        public bool TryGetConfigurator(GrainType grainType, GrainProperties properties, out IConfigureGrainContext configurator)
        {
            if (properties.Properties.TryGetValue(WellKnownGrainTypeProperties.MayInterleavePredicate, out var value) &&
                _grainClassMap.TryGetGrainClass(grainType, out var grainClass))
            {
                var predicate = GetMayInterleavePredicate(grainClass);
                configurator = new MayInterleaveConfigurator(message => predicate(message.BodyObject as IInvokable));
                return(true);
            }

            configurator = null;
            return(false);
        }
        public void Configure(GrainType grainType, GrainProperties properties, GrainTypeSharedContext shared)
        {
            if (properties.Properties.TryGetValue(WellKnownGrainTypeProperties.Reentrant, out var value) && bool.Parse(value))
            {
                var component = shared.GetComponent <GrainCanInterleave>();
                if (component is null)
                {
                    component = new GrainCanInterleave();
                    shared.SetComponent <GrainCanInterleave>(component);
                }

                component.MayInterleavePredicates.Add(_ => true);
            }
        }
예제 #8
0
        public bool TryResolveGrainDirectory(GrainType grainType, GrainProperties properties, out IGrainDirectory grainDirectory)
        {
            if (GenericGrainType.TryParse(grainType, out var constructed) && constructed.IsConstructed)
            {
                var generic  = constructed.GetUnconstructedGrainType().GrainType;
                var resolver = GetResolver();
                if (resolver.TryGetNonDefaultGrainDirectory(generic, out grainDirectory))
                {
                    return(true);
                }
            }

            grainDirectory = default;
            return(false);
        }
예제 #9
0
        public ValueTask <SiloAddress> GetActivationAddress(IAddressable reference)
        {
            var grainReference = reference as GrainReference;
            var grainId        = grainReference.GrainId;

            GrainProperties grainProperties = default;

            if (!siloManifest.Grains.TryGetValue(grainId.Type, out grainProperties))
            {
                var grainManifest = clusterManifest.AllGrainManifests
                                    .SelectMany(m => m.Grains.Where(g => g.Key == grainId.Type))
                                    .FirstOrDefault();
                if (grainManifest.Value != null)
                {
                    grainProperties = grainManifest.Value;
                }
                else
                {
                    throw new ArgumentException($"Unable to find Grain type '{grainId.Type}'. Make sure it is added to the Application Parts Manager at the Silo configuration.");
                }
            }

            if (grainProperties != default &&
                grainProperties.Properties.TryGetValue(WellKnownGrainTypeProperties.PlacementStrategy, out string placementStrategy))
            {
                if (placementStrategy == nameof(StatelessWorkerPlacement))
                {
                    throw new InvalidOperationException(
                              $"Grain '{grainReference.ToString()}' is a Stateless Worker. This type of grain can't be looked up by this method"
                              );
                }
            }

            if (this.catalog.FastLookup(grainId, out var addresses))
            {
                var placementResult = addresses.FirstOrDefault();
                return(new ValueTask <SiloAddress>(placementResult?.Silo));
            }

            return(LookupAsync(grainId, catalog));

            async ValueTask <SiloAddress> LookupAsync(GrainId grainId, Catalog catalog)
            {
                var places = await catalog.FullLookup(grainId);

                return(places.FirstOrDefault()?.Silo);
            }
        }
        public void Configure(GrainType grainType, GrainProperties properties, GrainTypeSharedContext shared)
        {
            if (shared.GetComponent <IGrainActivator>() is object)
            {
                return;
            }

            if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass))
            {
                return;
            }

            var argumentFactory     = _constructorArgumentFactory.CreateFactory(grainClass);
            var createGrainInstance = ActivatorUtilities.CreateFactory(grainClass, argumentFactory.ArgumentTypes);
            var instanceActivator   = new DefaultGrainActivator(createGrainInstance, argumentFactory);

            shared.SetComponent <IGrainActivator>(instanceActivator);
        }
예제 #11
0
 /// <summary>
 /// Initializes an instance of this type using the provided grain properties.
 /// </summary>
 /// <param name="properties">
 /// The grain properties.
 /// </param>
 public virtual void Initialize(GrainProperties properties)
 {
 }