Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 public async Task Unregister(ActivationAddress address, UnregistrationCause cause)
 {
     try
     {
         await this.grainDirectory.Unregister(address.ToGrainAddress());
     }
     finally
     {
         this.cache.Remove(address.Grain);
     }
 }