public void OnJoinLog( long leadershipTermId, int commitPositionId, int logSessionId, int logStreamId, bool ackBeforeImage, string logChannel) { newActiveLogEvent = new NewActiveLogEvent( leadershipTermId, commitPositionId, logSessionId, logStreamId, ackBeforeImage, logChannel); }
private void CheckForReplay(CountersReader counters, int recoveryCounterId) { long replayTermCount = RecoveryState.GetReplayTermCount(counters, recoveryCounterId); if (0 == replayTermCount) { return; } service.OnReplayBegin(); for (int i = 0; i < replayTermCount; i++) { AwaitActiveLog(); int counterId = newActiveLogEvent.commitPositionId; leadershipTermId = CommitPos.GetLeadershipTermId(counters, counterId); termBaseLogPosition = CommitPos.GetTermBaseLogPosition(counters, counterId); // TODO MARK if (CommitPos.GetLeadershipTermLength(counters, counterId) > 0) { using (Subscription subscription = aeron.AddSubscription(newActiveLogEvent.channel, newActiveLogEvent.streamId)) { serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); Image image = AwaitImage(newActiveLogEvent.sessionId, subscription); ReadableCounter limit = new ReadableCounter(counters, counterId); BoundedLogAdapter adapter = new BoundedLogAdapter(image, limit, this); ConsumeImage(image, adapter); termBaseLogPosition += image.Position(); } } newActiveLogEvent = null; serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.REPLAY); } service.OnReplayEnd(); }
private void JoinActiveLog() { if (null != logAdapter) { if (!logAdapter.IsCaughtUp()) { return; } logAdapter.Dispose(); logAdapter = null; } CountersReader counters = aeron.CountersReader(); int commitPositionId = newActiveLogEvent.commitPositionId; if (!CommitPos.IsActive(counters, commitPositionId)) { throw new System.InvalidOperationException("CommitPos counter not active: " + commitPositionId); } int logSessionId = newActiveLogEvent.sessionId; leadershipTermId = newActiveLogEvent.leadershipTermId; termBaseLogPosition = CommitPos.GetTermBaseLogPosition(counters, commitPositionId); Subscription logSubscription = aeron.AddSubscription(newActiveLogEvent.channel, newActiveLogEvent.streamId); if (newActiveLogEvent.ackBeforeImage) { serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); } Image image = AwaitImage(logSessionId, logSubscription); heartbeatCounter.SetOrdered(epochClock.Time()); if (!newActiveLogEvent.ackBeforeImage) { serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); } newActiveLogEvent = null; logAdapter = new BoundedLogAdapter(image, new ReadableCounter(counters, commitPositionId), this); Role((ClusterRole)roleCounter.Get()); foreach (ClientSession session in sessionByIdMap.Values) { if (ClusterRole.Leader == role) { session.Connect(aeron); } else { session.Disconnect(); } } }