Пример #1
0
        private static void HandleCoordinatorMessage <TShard>(this TShard shard, PersistentShardCoordinator.ICoordinatorMessage message) where TShard : IShard
        {
            switch (message)
            {
            case PersistentShardCoordinator.HandOff handOff when handOff.Shard == shard.ShardId:
                shard.HandOff(shard.Sender);
                break;

            case PersistentShardCoordinator.HandOff handOff:
                shard.Log.Warning("Shard [{0}] can not hand off for another Shard [{1}]", shard.ShardId, handOff.Shard);
                break;

            default:
                shard.Unhandled(message);
                break;
            }
        }
Пример #2
0
        private void HandleCoordinatorMessage(PersistentShardCoordinator.ICoordinatorMessage message)
        {
            switch (message)
            {
            case PersistentShardCoordinator.HandOff handOff when handOff.Shard == ShardId:
                HandOff(_context.Sender);
                break;

            case PersistentShardCoordinator.HandOff handOff:
                Log.Warning("Shard [{0}] can not hand off for another Shard [{1}]", ShardId, handOff.Shard);
                break;

            default:
                _unhandled(message);
                break;
            }
        }
Пример #3
0
        private void HandleCoordinatorMessage(PersistentShardCoordinator.ICoordinatorMessage message)
        {
            var handOff = message as PersistentShardCoordinator.HandOff;

            if (handOff != null)
            {
                if (handOff.Shard == ShardId)
                {
                    HandOff(Sender);
                }
                else
                {
                    Log.Warning("Shard [{0}] can not hand off for another Shard [{1}]", ShardId, handOff.Shard);
                }
            }
            else
            {
                Unhandled(message);
            }
        }
Пример #4
0
        private void HandleCoordinatorMessage(PersistentShardCoordinator.ICoordinatorMessage message)
        {
            if (message is PersistentShardCoordinator.HostShard)
            {
                var shard = ((PersistentShardCoordinator.HostShard)message).Shard;
                Log.Debug("Host shard [{0}]", shard);
                RegionByShard = RegionByShard.SetItem(shard, Self);
                UpdateRegionShards(Self, shard);

                // Start the shard, if already started this does nothing
                GetShard(shard);

                Sender.Tell(new PersistentShardCoordinator.ShardStarted(shard));
            }
            else if (message is PersistentShardCoordinator.ShardHome)
            {
                var home = (PersistentShardCoordinator.ShardHome)message;
                Log.Debug("Shard [{0}] located at [{1}]", home.Shard, home.Ref);
                IActorRef region;

                if (RegionByShard.TryGetValue(home.Shard, out region))
                {
                    if (region.Equals(Self) && !home.Ref.Equals(Self))
                    {
                        // should not happen, inconsistency between ShardRegion and PersistentShardCoordinator
                        throw new IllegalStateException(string.Format("Unexpected change of shard [{0}] from self to [{1}]", home.Shard, home.Ref));
                    }
                }

                RegionByShard = RegionByShard.SetItem(home.Shard, home.Ref);
                UpdateRegionShards(home.Ref, home.Shard);

                if (!home.Ref.Equals(Self))
                {
                    Context.Watch(home.Ref);
                }

                if (home.Ref.Equals(Self))
                {
                    var shardRef = GetShard(home.Shard);
                    if (!Equals(shardRef, ActorRefs.Nobody))
                    {
                        DeliverBufferedMessage(home.Shard, shardRef);
                    }
                }
                else
                {
                    DeliverBufferedMessage(home.Shard, home.Ref);
                }
            }
            else if (message is PersistentShardCoordinator.RegisterAck)
            {
                _coordinator = ((PersistentShardCoordinator.RegisterAck)message).Coordinator;
                Context.Watch(_coordinator);
                RequestShardBufferHomes();
            }
            else if (message is PersistentShardCoordinator.BeginHandOff)
            {
                var shard = ((PersistentShardCoordinator.BeginHandOff)message).Shard;
                Log.Debug("Begin hand off shard [{0}]", shard);
                IActorRef regionRef;
                if (RegionByShard.TryGetValue(shard, out regionRef))
                {
                    IImmutableSet <ShardId> updatedShards;
                    if (!Regions.TryGetValue(regionRef, out updatedShards))
                    {
                        updatedShards = ImmutableHashSet <ShardId> .Empty;
                    }

                    updatedShards = updatedShards.Remove(shard);
                    if (updatedShards.Count == 0)
                    {
                        Regions = Regions.Remove(regionRef);
                    }
                    else
                    {
                        Regions = Regions.SetItem(regionRef, updatedShards);
                    }

                    RegionByShard = RegionByShard.Remove(shard);
                }

                Sender.Tell(new PersistentShardCoordinator.BeginHandOffAck(shard));
            }
            else if (message is PersistentShardCoordinator.HandOff)
            {
                var shard = ((PersistentShardCoordinator.HandOff)message).Shard;
                Log.Debug("Hand off shard [{0}]", shard);

                // must drop requests that came in between the BeginHandOff and now,
                // because they might be forwarded from other regions and there
                // is a risk or message re-ordering otherwise
                if (ShardBuffers.ContainsKey(shard))
                {
                    ShardBuffers             = ShardBuffers.Remove(shard);
                    _loggedFullBufferWarning = false;
                }

                IActorRef actorRef;
                if (Shards.TryGetValue(shard, out actorRef))
                {
                    HandingOff = HandingOff.Add(actorRef);
                    actorRef.Forward(message);
                }
                else
                {
                    Sender.Tell(new PersistentShardCoordinator.ShardStopped(shard));
                }
            }
            else
            {
                Unhandled(message);
            }
        }