Exemplo n.º 1
0
        private Guid AddSubscription(Guid replicaId, bool isPromotable, out TcpConnectionManager manager)
        {
            var tcpConn = new DummyTcpConnection()
            {
                ConnectionId = replicaId
            };

            manager = new TcpConnectionManager(
                "Test Subscription Connection manager", TcpServiceType.External, new ClientTcpDispatcher(),
                InMemoryBus.CreateTest(), tcpConn, InMemoryBus.CreateTest(),
                new InternalAuthenticationProvider(
                    new Core.Helpers.IODispatcher(InMemoryBus.CreateTest(), new NoopEnvelope()),
                    new StubPasswordHashAlgorithm(), 1, false),
                new AuthorizationGateway(new TestAuthorizationProvider()),
                TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10), (man, err) => { },
                _connectionPendingSendBytesThreshold, _connectionQueueSizeThreshold);
            var subRequest = new ReplicationMessage.ReplicaSubscriptionRequest(
                Guid.NewGuid(),
                new NoopEnvelope(),
                manager,
                0,
                Guid.NewGuid(),
                new Epoch[0],
                PortsHelper.GetLoopback(),
                LeaderId,
                replicaId,
                isPromotable);

            Service.Handle(subRequest);
            return(tcpConn.ConnectionId);
        }
Exemplo n.º 2
0
        public void Handle(ReplicationMessage.ReplicaSubscriptionRequest message)
        {
            _publisher.Publish(new SystemMessage.VNodeConnectionEstablished(message.ReplicaEndPoint,
                                                                            message.Connection.ConnectionId));

            if (!CanAcceptSubscription(message))
            {
                message.Envelope.ReplyWith(
                    new ReplicationMessage.ReplicaSubscriptionRetry(_instanceId, message.SubscriptionId));
                return;
            }

            var subscription = new ReplicaSubscription(_tcpSendPublisher,
                                                       message.Connection,
                                                       message.SubscriptionId,
                                                       message.ReplicaEndPoint,
                                                       message.IsPromotable);

            foreach (var subscr in _subscriptions.Values)
            {
                if (subscr != subscription && subscr.ConnectionId == subscription.ConnectionId)
                {
                    subscr.ShouldDispose = true;
                }
            }

            if (SubscribeReplica(subscription, message.LastEpochs, message.CorrelationId, message.LogPosition,
                                 message.ChunkId))
            {
                _newSubscriptions = true;
                if (!_subscriptions.TryAdd(subscription.SubscriptionId, subscription))
                {
                    ReplicaSubscription existingSubscr;
                    _subscriptions.TryGetValue(subscription.SubscriptionId, out existingSubscr);
                    Log.Error(
                        "There is already a subscription with SubscriptionID {subscriptionId:B}: {existingSubscription}.",
                        subscription.SubscriptionId, existingSubscr);
                    Log.Error("Subscription we tried to add: {existingSubscription}.", existingSubscr);
                    subscription.SendBadRequestAndClose(message.CorrelationId, string.Format(
                                                            "There is already a subscription with SubscriptionID {0:B}: {1}.\nSubscription we tried to add: {2}",
                                                            subscription.SubscriptionId, existingSubscr, subscription));
                    subscription.Dispose();
                }
                else
                {
                    var replicationCheckpoint = _db.Config.ReplicationCheckpoint.Read();
                    subscription.SendMessage(new ReplicationTrackingMessage.ReplicatedTo(replicationCheckpoint));
                }
            }
        }
Exemplo n.º 3
0
        public void Handle(ReplicationMessage.ReplicaSubscriptionRequest message)
        {
            _publisher.Publish(new SystemMessage.VNodeConnectionEstablished(message.ReplicaEndPoint, message.Connection.ConnectionId));

            if (_state != VNodeState.Master || message.MasterId != _instanceId)
            {
                message.Envelope.ReplyWith(new ReplicationMessage.ReplicaSubscriptionRetry(_instanceId, message.SubscriptionId));
                return;
            }

            var subscription = new ReplicaSubscription(_tcpSendPublisher,
                                                       message.Connection,
                                                       message.SubscriptionId,
                                                       message.ReplicaEndPoint,
                                                       message.IsPromotable);

            foreach (var subscr in _subscriptions.Values)
            {
                if (subscr != subscription && subscr.ConnectionId == subscription.ConnectionId)
                {
                    subscr.ShouldDispose = true;
                }
            }

            if (SubscribeReplica(subscription, message.LastEpochs, message.CorrelationId, message.LogPosition, message.ChunkId))
            {
                _newSubscriptions = true;
                if (!_subscriptions.TryAdd(subscription.SubscriptionId, subscription))
                {
                    ReplicaSubscription existingSubscr;
                    _subscriptions.TryGetValue(subscription.SubscriptionId, out existingSubscr);
                    var msg = string.Format("There is already subscription with SubscriptionID {0:B}: {1}.\nSubscription we tried to add: {2}",
                                            subscription.SubscriptionId, existingSubscr, subscription);
                    Log.Error(msg);
                    subscription.SendBadRequestAndClose(message.CorrelationId, msg);
                    subscription.Dispose();
                }
            }
        }
Exemplo n.º 4
0
 private bool CanAcceptSubscription(ReplicationMessage.ReplicaSubscriptionRequest message)
 {
     return(CanAcceptSubscriptions() && message.LeaderId == _instanceId);
 }