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); }
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)); } } }
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(); } } }
private bool CanAcceptSubscription(ReplicationMessage.ReplicaSubscriptionRequest message) { return(CanAcceptSubscriptions() && message.LeaderId == _instanceId); }