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); }
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); }
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; }
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); }