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
        /// <summary>
        /// Returns a list of activations (along with the version number of the list) for the given grain.
        /// If the grain is not found, null is returned.
        /// </summary>
        /// <param name="grain"></param>
        /// <returns></returns>
        internal AddressesAndTag LookUpActivations(GrainId grain)
        {
            var result = new AddressesAndTag();

            ActivationId[]    activationIds;
            IActivationInfo[] activationInfos;
            const int         arrayReusingThreshold = 100;
            int grainInfoInstancesCount;

            lock (lockable)
            {
                IGrainInfo graininfo;
                if (!partitionData.TryGetValue(grain, out graininfo))
                {
                    return(result);
                }

                result.VersionTag = graininfo.VersionTag;

                grainInfoInstancesCount = graininfo.Instances.Count;
                if (grainInfoInstancesCount < arrayReusingThreshold)
                {
                    if ((activationIds = activationIdsHolder) == null)
                    {
                        activationIdsHolder = activationIds = new ActivationId[arrayReusingThreshold];
                    }

                    if ((activationInfos = activationInfosHolder) == null)
                    {
                        activationInfosHolder = activationInfos = new IActivationInfo[arrayReusingThreshold];
                    }
                }
                else
                {
                    activationIds   = new ActivationId[grainInfoInstancesCount];
                    activationInfos = new IActivationInfo[grainInfoInstancesCount];
                }


                graininfo.Instances.Keys.CopyTo(activationIds, 0);
                graininfo.Instances.Values.CopyTo(activationInfos, 0);
            }

            result.Addresses = new List <ActivationAddress>(grainInfoInstancesCount);
            for (var i = 0; i < grainInfoInstancesCount; i++)
            {
                var activationInfo = activationInfos[i];
                if (IsValidSilo(activationInfo.SiloAddress))
                {
                    result.Addresses.Add(ActivationAddress.GetAddress(activationInfo.SiloAddress, grain, activationIds[i]));
                }

                activationInfos[i] = null;
                activationIds[i]   = null;
            }

            return(result);
        }
Esempio n. 3
0
 public bool RemoveActivation(ActivationId act, UnregistrationCause cause, out IActivationInfo info, out bool wasRemoved)
 {
     info       = null;
     wasRemoved = false;
     if (Instances.TryGetValue(act, out info) && info.OkToRemove(cause))
     {
         Instances.Remove(act);
         wasRemoved = true;
         VersionTag = rand.Next();
     }
     return(Instances.Count == 0);
 }
Esempio n. 4
0
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress = iActivationInfo.SiloAddress;
     TimeCreated = iActivationInfo.TimeCreated;
 }
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress = iActivationInfo.SiloAddress;
     TimeCreated = iActivationInfo.TimeCreated;
 }
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress        = iActivationInfo.SiloAddress;
     TimeCreated        = iActivationInfo.TimeCreated;
     RegistrationStatus = iActivationInfo.RegistrationStatus;
 }
Esempio n. 7
0
 /// <summary>
 /// Removes an activation of the given grain from the partition
 /// </summary>
 /// <param name="grain">the identity of the grain</param>
 /// <param name="activation">the id of the activation</param>
 /// <param name="cause">reason for removing the activation</param>
 /// <param name="entry">returns the entry, if found </param>
 /// <param name="wasRemoved">returns whether the entry was actually removed</param>
 internal void RemoveActivation(GrainId grain, ActivationId activation, UnregistrationCause cause, out IActivationInfo entry, out bool wasRemoved)
 {
     wasRemoved = false;
     entry      = null;
     lock (lockable)
     {
         if (partitionData.ContainsKey(grain) && partitionData[grain].RemoveActivation(activation, cause, globalConfig, out entry, out wasRemoved))
         {
             // if the last activation for the grain was removed, we remove the entire grain info
             partitionData.Remove(grain);
         }
     }
     if (log.IsEnabled(LogLevel.Trace))
     {
         log.Trace("Removing activation for grain {0} cause={1} was_removed={2}", grain.ToString(), cause, wasRemoved);
     }
 }
        /// <summary>
        /// Removes an activation of the given grain from the partition
        /// </summary>
        /// <param name="grain">the identity of the grain</param>
        /// <param name="activation">the id of the activation</param>
        /// <param name="cause">reason for removing the activation</param>
        /// <param name="entry">returns the entry, if found </param>
        /// <param name="wasRemoved">returns whether the entry was actually removed</param>
        internal void RemoveActivation(GrainId grain, ActivationId activation, UnregistrationCause cause, out IActivationInfo entry, out bool wasRemoved)
        {
            wasRemoved = false;
            entry = null;
            lock (lockable)
            {
                if (partitionData.ContainsKey(grain) && partitionData[grain].RemoveActivation(activation, cause, out entry, out wasRemoved))
                    // if the last activation for the grain was removed, we remove the entire grain info 
                    partitionData.Remove(grain);

            }
            if (log.IsVerbose3)
                log.Verbose3("Removing activation for grain {0} cause={1} was_removed={2}", grain.ToString(), cause, wasRemoved);
        }
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress = iActivationInfo.SiloAddress;
     TimeCreated = iActivationInfo.TimeCreated;
     RegistrationStatus = iActivationInfo.RegistrationStatus;
 }
 public bool RemoveActivation(ActivationId act, UnregistrationCause cause, out IActivationInfo info, out bool wasRemoved)
 {
     info = null;
     wasRemoved = false;
     if (Instances.TryGetValue(act, out info) && info.OkToRemove(cause))
     {
         Instances.Remove(act);
         wasRemoved = true;
         VersionTag = rand.Next();
     }
     return Instances.Count == 0;
 }
Esempio n. 11
0
        /// <summary>
        /// Returns a list of activations (along with the version number of the list) for the given grain.
        /// If the grain is not found, null is returned.
        /// </summary>
        /// <param name="grain"></param>
        /// <returns></returns>
        internal AddressesAndTag LookUpActivations(GrainId grain)
        {
            var result = new AddressesAndTag();
            ActivationId[] activationIds;
            IActivationInfo[] activationInfos;
            const int arrayReusingThreshold = 100;
            int grainInfoInstancesCount;

            lock (lockable)
            {
                IGrainInfo graininfo;
                if (!partitionData.TryGetValue(grain, out graininfo))
                {
                    return result;
                }

                result.VersionTag = graininfo.VersionTag;

                grainInfoInstancesCount = graininfo.Instances.Count;
                if (grainInfoInstancesCount < arrayReusingThreshold)
                {
                    if ((activationIds = activationIdsHolder) == null)
                    {
                        activationIdsHolder = activationIds = new ActivationId[arrayReusingThreshold];
                    }

                    if ((activationInfos = activationInfosHolder) == null)
                    {
                        activationInfosHolder = activationInfos = new IActivationInfo[arrayReusingThreshold];
                    }
                }
                else
                {
                    activationIds = new ActivationId[grainInfoInstancesCount];
                    activationInfos = new IActivationInfo[grainInfoInstancesCount];
                }


                graininfo.Instances.Keys.CopyTo(activationIds, 0);
                graininfo.Instances.Values.CopyTo(activationInfos, 0);
            }

            result.Addresses = new List<ActivationAddress>(grainInfoInstancesCount);
            for (var i = 0; i < grainInfoInstancesCount; i++)
            {
                var activationInfo = activationInfos[i];
                if (IsValidSilo(activationInfo.SiloAddress))
                {
                    result.Addresses.Add(ActivationAddress.GetAddress(activationInfo.SiloAddress, grain, activationIds[i]));
                }

                activationInfos[i] = null;
                activationIds[i] = null;
            }

            return result;
        }
Esempio n. 12
0
 public bool RemoveActivation(ActivationId act, UnregistrationCause cause, TimeSpan lazyDeregistrationDelay, out IActivationInfo info, out bool wasRemoved)
 {
     wasRemoved = false;
     if (Instances.TryGetValue(act, out info) && info.OkToRemove(cause, lazyDeregistrationDelay))
     {
         Instances.Remove(act);
         wasRemoved = true;
         VersionTag = ThreadSafeRandom.Next();
     }
     return(Instances.Count == 0);
 }