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; } }
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); }
/// <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); }
public ActivationInfo(IActivationInfo iActivationInfo) { SiloAddress = iActivationInfo.SiloAddress; TimeCreated = iActivationInfo.TimeCreated; RegistrationStatus = iActivationInfo.RegistrationStatus; }
public ActivationInfo(SiloAddress siloAddress, GrainDirectoryEntryStatus registrationStatus) { SiloAddress = siloAddress; TimeCreated = DateTime.UtcNow; RegistrationStatus = registrationStatus; }
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)); } }
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; } }
/// <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); }
public ActivationInfo(IActivationInfo iActivationInfo) { SiloAddress = iActivationInfo.SiloAddress; TimeCreated = iActivationInfo.TimeCreated; RegistrationStatus = iActivationInfo.RegistrationStatus; }
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; }
public ActivationInfo(SiloAddress siloAddress, GrainDirectoryEntryStatus registrationStatus) { SiloAddress = siloAddress; TimeCreated = DateTime.UtcNow; RegistrationStatus = registrationStatus; }
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); } }
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; }
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); }
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); } }
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); } } }
/// <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; }