Esempio n. 1
0
        public void IfScaleOutBackendSocketSendMessageThrowsHostUnreachableException_UnreachableNodeIsUnregistered()
        {
            messageRouter = CreateMessageRouter(null, externalRoutingTable.Object);
            var message   = Message.Create(new SimpleMessage()).As <Message>();
            var otherNode = new ReceiverIdentifier(Guid.NewGuid().ToByteArray());

            message.SetReceiverNode(otherNode);
            var peerConnection = new PeerConnection {
                Node = new Node("tcp://127.0.0.1:9009", otherNode.Identity)
            };

            externalRoutingTable.Setup(m => m.FindRoutes(It.IsAny <ExternalRouteLookupRequest>())).Returns(new[] { peerConnection });
            localRouterSocket.SetupMessageReceived(message, ReceiveMessageDelay);
            scaleOutSocket.Setup(m => m.SendMessage(It.IsAny <IMessage>())).Throws <HostUnreachableException>();
            var unregPayload = new UnregisterUnreachableNodeMessage {
                ReceiverNodeIdentity = peerConnection.Node.SocketIdentity
            };
            var unregMessage          = Message.Create(unregPayload);
            var serviceMessageHandler = new Mock <IServiceMessageHandler>();

            serviceMessageHandlerRegistry.Setup(m => m.GetMessageHandler(It.Is <MessageIdentifier>(msg => msg.Equals(unregMessage)))).Returns(serviceMessageHandler.Object);
            //
            messageRouter.Start();
            ReceiveMessageCompletionDelay.Sleep();
            messageRouter.Stop();
            //
            serviceMessageHandlerRegistry.Verify(m => m.GetMessageHandler(It.Is <MessageIdentifier>(msg => msg.Equals(unregMessage))), Times.Once);
            serviceMessageHandler.Verify(m => m.Handle(unregMessage, scaleOutSocket.Object));
        }
Esempio n. 2
0
        private bool ForwardMessageAway(ExternalRouteLookupRequest lookupRequest, Message message, ISocket scaleOutBackend)
        {
            var routes = message.Distribution == DistributionPattern.Broadcast && !MessageCameFromLocalActor(message)
                             ? Enumerable.Empty <PeerConnection>()
                             : externalRoutingTable.FindRoutes(lookupRequest);

            foreach (var route in routes)
            {
                try
                {
                    if (!route.Connected)
                    {
                        scaleOutBackend.Connect(route.Node.Uri, waitUntilConnected: true);
                        route.Connected = true;
                        clusterServices.GetClusterHealthMonitor()
                        .StartPeerMonitoring(new Node(route.Node.Uri, route.Node.SocketIdentity), route.Health);
                    }

                    message.SetSocketIdentity(route.Node.SocketIdentity);
                    message.AddHop();
                    message.PushRouterAddress(scaleOutConfigurationProvider.GetScaleOutAddress());

                    message.SignMessage(securityProvider);

                    scaleOutBackend.SendMessage(message);

                    ForwardedToOtherNode(message);
                }
                catch (TimeoutException err)
                {
                    clusterServices.GetClusterHealthMonitor()
                    .ScheduleConnectivityCheck(new ReceiverIdentifier(route.Node.SocketIdentity));
                    logger.Error(err);
                }
                catch (HostUnreachableException err)
                {
                    var unregMessage = new UnregisterUnreachableNodeMessage {
                        ReceiverNodeIdentity = route.Node.SocketIdentity
                    };
                    TryHandleServiceMessage(Message.Create(unregMessage).As <Message>(), scaleOutBackend);
                    logger.Error(err);
                }
            }

            return(routes.Any());
        }
Esempio n. 3
0
        private bool SendMessageAway(IEnumerable <PeerConnection> routes, Message message, ISocket scaleOutBackend)
        {
            foreach (var route in routes)
            {
                try
                {
                    if (!route.Connected)
                    {
                        scaleOutBackend.Connect(route.Node.Uri, waitUntilConnected: true);
                        route.Connected = true;
                        clusterServices.GetClusterHealthMonitor()
                        .StartPeerMonitoring(new Node(route.Node.Uri, route.Node.SocketIdentity), route.Health);
                    }

                    message.SetSocketIdentity(route.Node.SocketIdentity);
                    message.AddHop();
                    message.PushRouterAddress(scaleOutConfigurationProvider.GetScaleOutAddress());

                    message.SignMessage(securityProvider);

                    scaleOutBackend.SendMessage(message);

                    ForwardedToOtherNode(message);
                }
                catch (TimeoutException err)
                {
                    clusterServices.GetClusterHealthMonitor()
                    .ScheduleConnectivityCheck(new ReceiverIdentifier(route.Node.SocketIdentity));
                    logger.Error(err);
                }
                catch (HostUnreachableException err)
                {
                    var unregMessage = new UnregisterUnreachableNodeMessage {
                        ReceiverNodeIdentity = route.Node.SocketIdentity
                    };
                    TryHandleServiceMessage(Message.Create(unregMessage).As <Message>(), scaleOutBackend);
                    logger.Error(err);
                }
            }

            return(routes.Any());
        }
Esempio n. 4
0
        public void PeerIsDisconnected_OnlyIfPeerConnectionActionIsDisconnect(PeerConnectionAction peerConnectionAction)
        {
            var receiverNodeIdentifier = new ReceiverIdentifier(Guid.NewGuid().ToByteArray());
            var payload = new UnregisterUnreachableNodeMessage {
                ReceiverNodeIdentity = receiverNodeIdentifier.Identity
            };
            var message          = Message.Create(payload);
            var peerRemoveResult = new PeerRemoveResult
            {
                ConnectionAction = peerConnectionAction,
                Uri = new Uri("tcp://127.0.0.1:9009")
            };

            externalRoutingTable.Setup(m => m.RemoveNodeRoute(receiverNodeIdentifier)).Returns(peerRemoveResult);
            //
            handler.Handle(message, backendSocket.Object);
            //
            externalRoutingTable.Verify(m => m.RemoveNodeRoute(receiverNodeIdentifier), Times.Once);
            backendSocket.Verify(m => m.Disconnect(peerRemoveResult.Uri), Times.Exactly(peerConnectionAction == PeerConnectionAction.Disconnect ? 1 : 0));
            clusterHealthMonitor.Verify(m => m.DeletePeer(receiverNodeIdentifier), Times.Exactly(peerConnectionAction != PeerConnectionAction.KeepConnection ? 1 : 0));
        }