Example #1
0
 public void OnJoinLog(
     long leadershipTermId,
     int commitPositionId,
     int logSessionId,
     int logStreamId,
     bool ackBeforeImage,
     string logChannel)
 {
     newActiveLogEvent = new NewActiveLogEvent(
         leadershipTermId, commitPositionId, logSessionId, logStreamId, ackBeforeImage, logChannel);
 }
Example #2
0
        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();
        }
Example #3
0
        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();
                }
            }
        }