internal void GetTypeInfo(int typeCode, out string grainClass, out PlacementStrategy placement, string genericArguments = null) { if (!ClusterGrainInterfaceMap.TryGetTypeInfo(typeCode, out grainClass, out placement, genericArguments)) { throw new OrleansException(string.Format("Unexpected: Cannot find an implementation class for grain interface {0}", typeCode)); } }
private void RebuildFullGrainInterfaceMap() { var newClusterGrainInterfaceMap = new GrainInterfaceMap(false, this.defaultPlacementStrategy); var newSupportedSilosByTypeCode = new Dictionary <int, List <SiloAddress> >(); var newSupportedSilosByInterface = new Dictionary <int, Dictionary <ushort, List <SiloAddress> > >(); foreach (var kvp in grainInterfaceMapsBySilo) { newClusterGrainInterfaceMap.AddMap(kvp.Value); foreach (var supportedInterface in kvp.Value.SupportedInterfaces) { var ifaceId = supportedInterface.InterfaceId; var version = supportedInterface.InterfaceVersion; var supportedSilosByVersion = newSupportedSilosByInterface.GetValueOrAddNew(ifaceId); var supportedSilosForVersion = supportedSilosByVersion.GetValueOrAddNew(version); supportedSilosForVersion.Add(kvp.Key); } foreach (var grainClassData in kvp.Value.SupportedGrainClassData) { var grainType = grainClassData.GrainTypeCode; var supportedSilos = newSupportedSilosByTypeCode.GetValueOrAddNew(grainType); supportedSilos.Add(kvp.Key); } } foreach (var silos in newSupportedSilosByTypeCode.Values) { // We need to sort this so the list of silos returned will // be the same accross all silos in the cluster silos.Sort(); } ClusterGrainInterfaceMap = newClusterGrainInterfaceMap; GrainTypeResolver = ClusterGrainInterfaceMap.GetGrainTypeResolver(); supportedSilosByTypeCode = newSupportedSilosByTypeCode; supportedSilosByInterface = newSupportedSilosByInterface; }