Esempio n. 1
0
        private List <GrainId> GetGrainsInClusterWithStatus(string clusterId, GrainDirectoryEntryStatus?status = null)
        {
            List <GrainId> grains     = new List <GrainId>();
            var            silos      = Clusters[clusterId].Silos;
            int            totalSoFar = 0;

            foreach (var silo in silos)
            {
                var dir = silo.AppDomainTestHook.GetDirectoryForTypeNamesContaining("ClusterTestGrain");
                foreach (var grainKeyValue in dir)
                {
                    GrainId         grainId   = grainKeyValue.Key;
                    IGrainInfo      grainInfo = grainKeyValue.Value;
                    ActivationId    actId     = grainInfo.Instances.First().Key;
                    IActivationInfo actInfo   = grainInfo.Instances[actId];

                    if (grainId.IsSystemTarget || grainId.IsClient || !grainId.IsGrain)
                    {
                        // Skip system grains, system targets and clients
                        // which never go through cluster-single-instance registration process
                        continue;
                    }

                    if (!status.HasValue || actInfo.RegistrationStatus == status)
                    {
                        grains.Add(grainId);
                    }
                }
                WriteLog("Returning: Silo {0} State = {1} Count = {2}", silo.SiloAddress, status.HasValue ? status.Value.ToString() : "ANY", (grains.Count - totalSoFar));
                totalSoFar = grains.Count;
            }
            WriteLog("Returning: Cluster {0} State = {1} Count = {2}", clusterId, status.HasValue ? status.Value.ToString() : "ANY", grains.Count);
            return(grains);
        }
Esempio n. 2
0
        public bool Merge(GrainId grain, IGrainInfo other)
        {
            bool modified = false;

            foreach (var pair in other.Instances)
            {
                if (Instances.ContainsKey(pair.Key))
                {
                    continue;
                }

                Instances[pair.Key] = new ActivationInfo(pair.Value.SiloAddress);
                modified            = true;
            }

            if (modified)
            {
                VersionTag = rand.Next();
            }

            if (SingleInstance && (Instances.Count > 0))
            {
                // Grain is supposed to be in single activation mode, but we have two activations!!
                // Eventually we should somehow delegate handling this to the silo, but for now, we'll arbitrarily pick one value.
                var orderedActivations = Instances.OrderBy(pair => pair.Key);
                var activationToKeep   = orderedActivations.First();
                var activationsToDrop  = orderedActivations.Skip(1);
                Instances.Clear();
                Instances.Add(activationToKeep.Key, activationToKeep.Value);
                var list = new List <ActivationAddress>(1);
                foreach (var activation in activationsToDrop.Select(keyValuePair => ActivationAddress.GetAddress(keyValuePair.Value.SiloAddress, grain, keyValuePair.Key)))
                {
                    list.Add(activation);
                    CatalogFactory.GetSystemTarget(Constants.CatalogId, activation.Silo).
                    DeleteActivations(list).Ignore();

                    list.Clear();
                }
                return(true);
            }
            return(false);
        }
Esempio n. 3
0
        private Dictionary <GrainId, List <IActivationInfo> > GetGrainActivations(Dictionary <GrainId, List <IActivationInfo> > exclude = null)
        {
            var grains = new Dictionary <GrainId, List <IActivationInfo> >();

            int instancecount = 0;

            foreach (var kvp in Clusters)
            {
                foreach (var silo in kvp.Value.Silos)
                {
                    var dir = silo.AppDomainTestHook.GetDirectoryForTypeNamesContaining("ClusterTestGrain");

                    foreach (var grainKeyValue in dir)
                    {
                        GrainId    grainId   = grainKeyValue.Key;
                        IGrainInfo grainInfo = grainKeyValue.Value;

                        if (exclude != null && exclude.ContainsKey(grainId))
                        {
                            continue;
                        }

                        List <IActivationInfo> acts;
                        if (!grains.TryGetValue(grainId, out acts))
                        {
                            grains[grainId] = acts = new List <IActivationInfo>();
                        }

                        foreach (var instinfo in grainInfo.Instances)
                        {
                            acts.Add(instinfo.Value);
                            instancecount++;
                        }
                    }
                }
            }

            WriteLog("Returning: {0} instances for {1} grains", instancecount, grains.Count());

            return(grains);
        }
        public bool Merge(GrainId grain, IGrainInfo other)
        {
            bool modified = false;
            foreach (var pair in other.Instances)
            {
                if (Instances.ContainsKey(pair.Key)) continue;

                Instances[pair.Key] = new ActivationInfo(pair.Value.SiloAddress);
                modified = true;
            }

            if (modified)
            {
                VersionTag = rand.Next();
            }
            
            if (SingleInstance && (Instances.Count > 0))
            {
                // Grain is supposed to be in single activation mode, but we have two activations!!
                // Eventually we should somehow delegate handling this to the silo, but for now, we'll arbitrarily pick one value.
                var orderedActivations = Instances.OrderBy(pair => pair.Key);
                var activationToKeep = orderedActivations.First();
                var activationsToDrop = orderedActivations.Skip(1);
                Instances.Clear();
                Instances.Add(activationToKeep.Key, activationToKeep.Value);
                var list = new List<ActivationAddress>(1);
                foreach (var activation in activationsToDrop.Select(keyValuePair => ActivationAddress.GetAddress(keyValuePair.Value.SiloAddress, grain, keyValuePair.Key)))
                {
                    list.Add(activation);
                    InsideRuntimeClient.Current.InternalGrainFactory.GetSystemTarget<ICatalog>(Constants.CatalogId, activation.Silo).
                        DeleteActivations(list).Ignore();

                    list.Clear();
                }
                return true;
            }
            return false;
        }
Esempio n. 5
0
        public Dictionary <SiloAddress, List <ActivationAddress> > Merge(GrainId grain, IGrainInfo other)
        {
            bool modified = false;

            foreach (var pair in other.Instances)
            {
                if (Instances.ContainsKey(pair.Key))
                {
                    continue;
                }

                Instances[pair.Key] = new ActivationInfo(pair.Value.SiloAddress, pair.Value.RegistrationStatus);
                modified            = true;
            }

            if (modified)
            {
                VersionTag = rand.Next();
            }

            if (SingleInstance && (Instances.Count > 0))
            {
                // Grain is supposed to be in single activation mode, but we have two activations!!
                // Eventually we should somehow delegate handling this to the silo, but for now, we'll arbitrarily pick one value.
                var orderedActivations = Instances.OrderBy(pair => pair.Key);
                var activationToKeep   = orderedActivations.First();
                var activationsToDrop  = orderedActivations.Skip(1);
                Instances.Clear();
                Instances.Add(activationToKeep.Key, activationToKeep.Value);
                var mapping = new Dictionary <SiloAddress, List <ActivationAddress> >();
                foreach (var activationPair in activationsToDrop)
                {
                    var activation = ActivationAddress.GetAddress(activationPair.Value.SiloAddress, grain, activationPair.Key);

                    List <ActivationAddress> activationsToRemoveOnSilo;
                    if (!mapping.TryGetValue(activation.Silo, out activationsToRemoveOnSilo))
                    {
                        activationsToRemoveOnSilo = mapping[activation.Silo] = new List <ActivationAddress>(1);
                    }

                    activationsToRemoveOnSilo.Add(activation);
                }

                return(mapping);
            }

            return(null);
        }