public int DoWork() { int workCount = 0; if (CheckForClockTick()) { PollServiceAdapter(); workCount += 1; } if (null != logAdapter) { int polled = logAdapter.Poll(); if (0 == polled) { if (logAdapter.IsConsumed(aeron.CountersReader())) { _consensusModuleProxy.Ack(logAdapter.Position(), ackId++, serviceId); logAdapter.Dispose(); logAdapter = null; } else if (logAdapter.IsImageClosed()) { logAdapter.Dispose(); logAdapter = null; } } workCount += polled; } return(workCount); }
public int DoWork() { int workCount = 0; if (CheckForClockTick()) { PollServiceAdapter(); workCount += 1; } if (null != logAdapter) { int polled = logAdapter.Poll(); if (0 == polled) { if (logAdapter.IsDone()) { logAdapter.Dispose(); logAdapter = null; } } workCount += polled; } return(workCount); }
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; }
private void SwitchActiveLog() { if (logAdapter.IsCaughtUp()) { logAdapter.Dispose(); var counters = aeron.CountersReader(); var counterId = activeLog.commitPositionId; leadershipTermId = activeLog.leadershipTermId; termBaseLogPosition = CommitPos.GetTermBaseLogPosition(counters, counterId); Subscription subscription = aeron.AddSubscription(activeLog.channel, activeLog.streamId); Image image = AwaitImage(activeLog.sessionId, subscription); serviceControlPublisher.AckAction(termBaseLogPosition, leadershipTermId, serviceId, ClusterAction.READY); logAdapter = new BoundedLogAdapter(image, new ReadableCounter(counters, counterId), this); activeLog = null; Role((ClusterRole)roleCounter.Get()); } }
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() { 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 ConsumeImage(Image image, BoundedLogAdapter adapter) { while (true) { int workCount = adapter.Poll(); if (workCount == 0) { if (adapter.IsConsumed(aeron.CountersReader())) { _consensusModuleProxy.Ack(image.Position(), ackId++, serviceId); break; } if (image.Closed) { throw new ClusterException("unexpected close of replay"); } } Idle(workCount); } }
private void ConsumeImage(Image image, BoundedLogAdapter adapter) { while (true) { int workCount = adapter.Poll(); if (workCount == 0) { if (image.Closed) { if (!image.IsEndOfStream()) { throw new InvalidOperationException("unexpected close of replay"); } break; } CheckInterruptedStatus(); } idleStrategy.Idle(workCount); } }
private void CheckForReplay(CountersReader counters, int recoveryCounterId) { if (RecoveryState.HasReplay(counters, recoveryCounterId)) { AwaitActiveLog(); int counterId = _activeLogEvent.commitPositionId; using (Subscription subscription = aeron.AddSubscription(_activeLogEvent.channel, _activeLogEvent.streamId)) { _consensusModuleProxy.Ack(CommitPos.GetLogPosition(counters, counterId), ackId++, serviceId); Image image = AwaitImage(_activeLogEvent.sessionId, subscription); ReadableCounter limit = new ReadableCounter(counters, counterId); BoundedLogAdapter adapter = new BoundedLogAdapter(image, limit, this); ConsumeImage(image, adapter); } _activeLogEvent = null; heartbeatCounter.SetOrdered(epochClock.Time()); } }
internal ClusteredServiceAgent(ClusteredServiceContainer.Context ctx) { headerVector = new DirectBufferVector(headerBuffer, 0, headerBuffer.Capacity); abortHandler = Abort; this.ctx = ctx; logAdapter = new BoundedLogAdapter(this); aeron = ctx.Aeron(); aeronAgentInvoker = ctx.Aeron().ConductorAgentInvoker; service = ctx.ClusteredService(); idleStrategy = ctx.IdleStrategy(); serviceId = ctx.ServiceId(); epochClock = ctx.EpochClock(); var channel = ctx.ControlChannel(); _consensusModuleProxy = new ConsensusModuleProxy(aeron.AddPublication(channel, ctx.ConsensusModuleStreamId())); _serviceAdapter = new ServiceAdapter(aeron.AddSubscription(channel, ctx.ServiceStreamId()), this); _sessionMessageHeaderEncoder.WrapAndApplyHeader(headerBuffer, 0, new MessageHeaderEncoder()); }
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(); } } }