public async Task <ActivationAddress> Register(ActivationAddress address) { if (address.Grain.IsClient) { return(await this.inClusterGrainLocator.Register(address)); } var grainAddress = address.ToGrainAddress(); var result = await this.grainDirectory.Register(grainAddress); var activationAddress = result.ToActivationAddress(); // Check if the entry point to a dead silo if (this.knownDeadSilos.Contains(activationAddress.Silo)) { // Remove outdated entry and retry to register await this.grainDirectory.Unregister(result); result = await this.grainDirectory.Register(grainAddress); activationAddress = result.ToActivationAddress(); } // Cache update this.cache.AddOrUpdate( activationAddress.Grain, new List <Tuple <SiloAddress, ActivationId> >() { Tuple.Create(activationAddress.Silo, activationAddress.Activation) }, 0); return(activationAddress); }
public async Task <ActivationAddress> Register(ActivationAddress address) { var grainType = address.Grain.Type; if (grainType.IsClient() || grainType.IsSystemTarget()) { ThrowUnsupportedGrainType(address.Grain); } var grainAddress = address.ToGrainAddress(); grainAddress.MembershipVersion = this.clusterMembershipService.CurrentSnapshot.Version; var result = await GetGrainDirectory(grainType).Register(grainAddress); var activationAddress = result.ToActivationAddress(); // Check if the entry point to a dead silo if (IsKnownDeadSilo(result)) { // Remove outdated entry and retry to register await GetGrainDirectory(grainType).Unregister(result); result = await GetGrainDirectory(grainType).Register(grainAddress); activationAddress = result.ToActivationAddress(); } // Cache update this.cache.AddOrUpdate(activationAddress, (int)result.MembershipVersion.Value); return(activationAddress); }
public async Task <ActivationAddress> Register(ActivationAddress address) { var grainType = address.Grain.Type; if (grainType.IsClient() || grainType.IsSystemTarget()) { ThrowUnsupportedGrainType(address.Grain); } var grainAddress = address.ToGrainAddress(); var result = await GetGrainDirectory(grainType).Register(grainAddress); var activationAddress = result.ToActivationAddress(); // Check if the entry point to a dead silo if (this.knownDeadSilos.Contains(activationAddress.Silo)) { // Remove outdated entry and retry to register await GetGrainDirectory(grainType).Unregister(result); result = await GetGrainDirectory(grainType).Register(grainAddress); activationAddress = result.ToActivationAddress(); } // Cache update this.cache.AddOrUpdate(activationAddress, 0); return(activationAddress); }
public async Task Unregister(ActivationAddress address, UnregistrationCause cause) { try { await this.grainDirectory.Unregister(address.ToGrainAddress()); } finally { this.cache.Remove(address.Grain); } }