コード例 #1
0
 public static IEnumerable<KeyValuePair<GrainId, IGrainInfo>> FilterByMultiClusterStatus(Dictionary<GrainId, IGrainInfo> collection, GrainDirectoryEntryStatus status)
 {
     foreach (var kvp in collection)
     {
         if (!kvp.Value.SingleInstance)
             continue;
         var act = kvp.Value.Instances.FirstOrDefault();
         if (act.Key == null)
             continue;
         if (act.Value.RegistrationStatus == status)
             yield return kvp;
     }
 }
コード例 #2
0
        public bool UpdateClusterRegistrationStatus(ActivationId activationId, GrainDirectoryEntryStatus status, GrainDirectoryEntryStatus?compareWith = null)
        {
            IActivationInfo activationInfo;

            if (!Instances.TryGetValue(activationId, out activationInfo))
            {
                return(false);
            }
            if (compareWith.HasValue && compareWith.Value != activationInfo.RegistrationStatus)
            {
                return(false);
            }
            activationInfo.RegistrationStatus = status;
            return(true);
        }
コード例 #3
0
        /// <summary>
        /// Adds a new activation to the directory partition
        /// </summary>
        /// <param name="grain"></param>
        /// <param name="activation"></param>
        /// <param name="silo"></param>
        /// <param name="registrationStatus"></param>
        /// <returns>The registered ActivationAddress and version associated with this directory mapping</returns>
        internal virtual AddressAndTag AddSingleActivation(GrainId grain, ActivationId activation, SiloAddress silo, GrainDirectoryEntryStatus registrationStatus)
        {
            if (log.IsEnabled(LogLevel.Trace))
            {
                log.Trace("Adding single activation for grain {0}{1}{2}", silo, grain, activation);
            }

            AddressAndTag result = new AddressAndTag();

            if (!IsValidSilo(silo))
            {
                return(result);
            }

            IGrainInfo grainInfo;

            lock (lockable)
            {
                if (!partitionData.TryGetValue(grain, out grainInfo))
                {
                    partitionData[grain] = grainInfo = new GrainInfo();
                }

                result.Address    = grainInfo.AddSingleActivation(grain, activation, silo, registrationStatus);
                result.VersionTag = grainInfo.VersionTag;
            }

            return(result);
        }
コード例 #4
0
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress        = iActivationInfo.SiloAddress;
     TimeCreated        = iActivationInfo.TimeCreated;
     RegistrationStatus = iActivationInfo.RegistrationStatus;
 }
コード例 #5
0
 public ActivationInfo(SiloAddress siloAddress, GrainDirectoryEntryStatus registrationStatus)
 {
     SiloAddress        = siloAddress;
     TimeCreated        = DateTime.UtcNow;
     RegistrationStatus = registrationStatus;
 }
コード例 #6
0
 public ActivationAddress AddSingleActivation(GrainId grain, ActivationId act, SiloAddress silo, GrainDirectoryEntryStatus registrationStatus)
 {
     SingleInstance = true;
     if (Instances.Count > 0)
     {
         var item = Instances.First();
         return(ActivationAddress.GetAddress(item.Value.SiloAddress, grain, item.Key));
     }
     else
     {
         Instances.Add(act, new ActivationInfo(silo, registrationStatus));
         VersionTag = rand.Next();
         return(ActivationAddress.GetAddress(silo, grain, act));
     }
 }
コード例 #7
0
 public bool UpdateClusterRegistrationStatus(GrainId grain, ActivationId activationId, GrainDirectoryEntryStatus registrationStatus, GrainDirectoryEntryStatus? compareWith = null)
 {
     lock (lockable)
     {
         IGrainInfo graininfo;
         if (partitionData.TryGetValue(grain, out graininfo))
         {
             return graininfo.UpdateClusterRegistrationStatus(activationId, registrationStatus, compareWith);
         }
         return false;
     }
 }
コード例 #8
0
        /// <summary>
        /// Adds a new activation to the directory partition
        /// </summary>
        /// <param name="grain"></param>
        /// <param name="activation"></param>
        /// <param name="silo"></param>
        /// <param name="registrationStatus"></param>
        /// <returns>The registered ActivationAddress and version associated with this directory mapping</returns>
        internal virtual AddressAndTag AddSingleActivation(GrainId grain, ActivationId activation, SiloAddress silo, GrainDirectoryEntryStatus registrationStatus)
        {
            if (log.IsVerbose3)
            {
                log.Verbose3("Adding single activation for grain {0}{1}{2}", silo, grain, activation);
            }

            AddressAndTag result = new AddressAndTag();

            if (!IsValidSilo(silo))
            {
                return(result);
            }

            lock (lockable)
            {
                if (!partitionData.ContainsKey(grain))
                {
                    partitionData[grain] = new GrainInfo();
                }
                var grainInfo = partitionData[grain];
                result.Address    = grainInfo.AddSingleActivation(grain, activation, silo, registrationStatus);
                result.VersionTag = grainInfo.VersionTag;
            }
            return(result);
        }
コード例 #9
0
 public ActivationInfo(IActivationInfo iActivationInfo)
 {
     SiloAddress = iActivationInfo.SiloAddress;
     TimeCreated = iActivationInfo.TimeCreated;
     RegistrationStatus = iActivationInfo.RegistrationStatus;
 }
コード例 #10
0
 public bool UpdateClusterRegistrationStatus(ActivationId activationId, GrainDirectoryEntryStatus status, GrainDirectoryEntryStatus? compareWith = null)
 {
     IActivationInfo activationInfo;
     if (!Instances.TryGetValue(activationId, out activationInfo))
         return false;
     if (compareWith.HasValue && compareWith.Value != activationInfo.RegistrationStatus)
         return false;
     activationInfo.RegistrationStatus = status;
     return true;
 }
コード例 #11
0
 public ActivationInfo(SiloAddress siloAddress, GrainDirectoryEntryStatus registrationStatus)
 {
     SiloAddress = siloAddress;
     TimeCreated = DateTime.UtcNow;
     RegistrationStatus = registrationStatus;
 }
コード例 #12
0
 public ActivationAddress AddSingleActivation(GrainId grain, ActivationId act, SiloAddress silo, GrainDirectoryEntryStatus registrationStatus)
 {
     SingleInstance = true;
     if (Instances.Count > 0)
     {
         var item = Instances.First();
         return ActivationAddress.GetAddress(item.Value.SiloAddress, grain, item.Key);
     }
     else
     {
         Instances.Add(act, new ActivationInfo(silo, registrationStatus));
         VersionTag = rand.Next();
         return ActivationAddress.GetAddress(silo, grain, act);
     }
 }
コード例 #13
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.TestHook.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;
        }
コード例 #14
0
        private RemoteClusterActivationResponse ProcessRequestLocal(GrainId grain, string requestClusterId)
        {
            RemoteClusterActivationResponse response;

            //This function will be called only on the Owner silo.
            try
            {
                ActivationAddress address;
                int version;
                GrainDirectoryEntryStatus existingActivationStatus = router.DirectoryPartition.TryGetActivation(grain, out address, out version);


                //Return appropriate protocol response, given current mc status
                switch (existingActivationStatus)
                {
                case GrainDirectoryEntryStatus.Invalid:
                    response = RemoteClusterActivationResponse.Pass;
                    break;

                case GrainDirectoryEntryStatus.Owned:
                    response = new RemoteClusterActivationResponse(ActivationResponseStatus.Failed)
                    {
                        ExistingActivationAddress = new AddressAndTag()
                        {
                            Address    = address,
                            VersionTag = version
                        },
                        ClusterId = clusterId,
                        Owned     = true
                    };
                    break;

                case GrainDirectoryEntryStatus.Cached:
                case GrainDirectoryEntryStatus.RaceLoser:
                    response = RemoteClusterActivationResponse.Pass;
                    break;

                case GrainDirectoryEntryStatus.RequestedOwnership:
                case GrainDirectoryEntryStatus.Doubtful:
                    var iWin = MultiClusterUtils.ActivationPrecedenceFunc(grain, clusterId, requestClusterId);
                    if (iWin)
                    {
                        response = new RemoteClusterActivationResponse(ActivationResponseStatus.Failed)
                        {
                            ExistingActivationAddress = new AddressAndTag()
                            {
                                Address    = address,
                                VersionTag = version
                            },
                            ClusterId = clusterId,
                            Owned     = false
                        };
                    }
                    else
                    {
                        response = RemoteClusterActivationResponse.Pass;
                        //update own activation status to race loser.
                        if (existingActivationStatus == GrainDirectoryEntryStatus.RequestedOwnership)
                        {
                            logger.Trace("GSIP:Rsp {0} Origin={1} RaceLoser", grain.ToString(), requestClusterId);
                            var success = router.DirectoryPartition.UpdateClusterRegistrationStatus(grain, address.Activation, GrainDirectoryEntryStatus.RaceLoser, GrainDirectoryEntryStatus.RequestedOwnership);
                            if (!success)
                            {
                                // there was a race. retry.
                                logger.Trace("GSIP:Rsp {0} Origin={1} Retry", grain.ToString(), requestClusterId);
                                return(ProcessRequestLocal(grain, requestClusterId));
                            }
                        }
                    }
                    break;

                default:
                    throw new InvalidOperationException("Invalid MultiClusterStatus value");
                }
            }
            catch (Exception ex)
            {
                //LOG exception
                response = new RemoteClusterActivationResponse(ActivationResponseStatus.Faulted)
                {
                    ResponseException = ex
                };
            }

            if (logger.IsEnabled(LogLevel.Debug))
            {
                logger.Debug("GSIP:Rsp {0} Origin={1} Result={2}", grain.ToString(), requestClusterId, response);
            }

            return(response);
        }
コード例 #15
0
 public bool UpdateClusterRegistrationStatus(GrainId grain, ActivationId activationId, GrainDirectoryEntryStatus registrationStatus, GrainDirectoryEntryStatus?compareWith = null)
 {
     lock (lockable)
     {
         IGrainInfo graininfo;
         if (partitionData.TryGetValue(grain, out graininfo))
         {
             return(graininfo.UpdateClusterRegistrationStatus(activationId, registrationStatus, compareWith));
         }
         return(false);
     }
 }
コード例 #16
0
 public static IEnumerable <KeyValuePair <GrainId, IGrainInfo> > FilterByMultiClusterStatus(Dictionary <GrainId, IGrainInfo> collection, GrainDirectoryEntryStatus status)
 {
     foreach (var kvp in collection)
     {
         if (!kvp.Value.SingleInstance)
         {
             continue;
         }
         var act = kvp.Value.Instances.FirstOrDefault();
         if (act.Key == null)
         {
             continue;
         }
         if (act.Value.RegistrationStatus == status)
         {
             yield return(kvp);
         }
     }
 }
コード例 #17
0
        /// <summary>
        /// Adds a new activation to the directory partition
        /// </summary>
        /// <param name="grain"></param>
        /// <param name="activation"></param>
        /// <param name="silo"></param>
        /// <param name="registrationStatus"></param>
        /// <returns>The registered ActivationAddress and version associated with this directory mapping</returns>
        internal virtual AddressAndTag AddSingleActivation(GrainId grain, ActivationId activation, SiloAddress silo, GrainDirectoryEntryStatus registrationStatus)
        {
            if (log.IsVerbose3) log.Verbose3("Adding single activation for grain {0}{1}{2}", silo, grain, activation);

            AddressAndTag result = new AddressAndTag();

            if (!IsValidSilo(silo))
                return result;
            
            lock (lockable)
            {
                if (!partitionData.ContainsKey(grain))
                {
                    partitionData[grain] = new GrainInfo();
                }
                var grainInfo = partitionData[grain];
                result.Address = grainInfo.AddSingleActivation(grain, activation, silo, registrationStatus);
                result.VersionTag = grainInfo.VersionTag;
            }
            return result;
        }