private void JoinActiveLog(CountersReader counters) { AwaitActiveLog(); int commitPositionId = activeLog.commitPositionId; if (!CommitPos.IsActive(counters, commitPositionId)) { throw new InvalidOperationException("CommitPos counter not active: " + commitPositionId); } int logSessionId = activeLog.sessionId; leadershipTermId = activeLog.leadershipTermId; termBaseLogPosition = CommitPos.GetTermBaseLogPosition(counters, commitPositionId); Subscription logSubscription = aeron.AddSubscription(activeLog.channel, activeLog.streamId); if (activeLog.ackBeforeImage) { serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); } Image image = AwaitImage(logSessionId, logSubscription); heartbeatCounter.SetOrdered(epochClock.Time()); if (!activeLog.ackBeforeImage) { serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); } logAdapter = new BoundedLogAdapter(image, new ReadableCounter(counters, commitPositionId), this); activeLog = null; }
public int DoWork() { long nowMs = epochClock.Time(); if (cachedEpochClock.Time() != nowMs) { markFile.UpdateActivityTimestamp(nowMs); cachedEpochClock.Update(nowMs); } int workCount = logAdapter.Poll(); if (0 == workCount) { if (logAdapter.Image().Closed) { throw new AgentTerminationException("Image closed unexpectedly"); } if (!CommitPos.IsActive(aeron.CountersReader(), logAdapter.UpperBoundCounterId())) { throw new AgentTerminationException("Commit position is not active"); } } workCount += serviceControlAdapter.Poll(); if (activeLog != null) { // TODO: handle new log case activeLog = null; } return(workCount); }
private void JoinActiveLog() { CountersReader counters = aeron.CountersReader(); int commitPositionId = _activeLogEvent.commitPositionId; if (!CommitPos.IsActive(counters, commitPositionId)) { throw new ClusterException("CommitPos counter not active: " + commitPositionId); } Subscription logSubscription = aeron.AddSubscription(_activeLogEvent.channel, _activeLogEvent.streamId); _consensusModuleProxy.Ack(CommitPos.GetLogPosition(counters, commitPositionId), ackId++, serviceId); Image image = AwaitImage(_activeLogEvent.sessionId, logSubscription); heartbeatCounter.SetOrdered(epochClock.Time()); _activeLogEvent = null; logAdapter = new BoundedLogAdapter(image, new ReadableCounter(counters, commitPositionId), this); Role((ClusterRole)roleCounter.Get()); foreach (ClientSession session in sessionByIdMap.Values) { if (ClusterRole.Leader == role) { if (ctx.IsRespondingService()) { session.Connect(aeron); } session.ResetClosing(); } else { session.Disconnect(); } } }
private void JoinActiveLog(CountersReader counters) { AwaitActiveLog(); int commitPositionId = activeLog.commitPositionId; if (!CommitPos.IsActive(counters, commitPositionId)) { throw new System.InvalidOperationException("CommitPos counter not active: " + commitPositionId); } int logSessionId = activeLog.sessionId; leadershipTermId = activeLog.leadershipTermId; baseLogPosition = CommitPos.GetBaseLogPosition(counters, commitPositionId); Subscription logSubscription = aeron.AddSubscription(activeLog.channel, activeLog.streamId); Image image = AwaitImage(logSessionId, logSubscription); serviceControlPublisher.AckAction(baseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); logAdapter = new BoundedLogAdapter(image, new ReadableCounter(counters, commitPositionId), this); activeLog = null; }
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(); } } }