private void OnTakeSnapshot(long termPosition) { long recordingId; string channel = ctx.SnapshotChannel(); int streamId = ctx.SnapshotStreamId(); using (AeronArchive archive = AeronArchive.Connect(archiveCtx)) using (Publication publication = archive.AddRecordedExclusivePublication(channel, streamId)) { try { CountersReader counters = aeron.CountersReader(); int counterId = AwaitRecordingCounter(publication, counters); recordingId = RecordingPos.GetRecordingId(counters, counterId); SnapshotState(publication, termBaseLogPosition + termPosition); service.OnTakeSnapshot(publication); AwaitRecordingComplete(recordingId, publication.Position, counters, counterId, archive); } finally { archive.StopRecording(publication); } } recordingLog.AppendSnapshot(recordingId, leadershipTermId, termBaseLogPosition, termPosition, timestampMs); }
private long OnTakeSnapshot(long logPosition, long leadershipTermId) { long recordingId; using (AeronArchive archive = AeronArchive.Connect(archiveCtx)) using (Publication publication = aeron.AddExclusivePublication(ctx.SnapshotChannel(), ctx.SnapshotStreamId())) { var channel = ChannelUri.AddSessionId(ctx.SnapshotChannel(), publication.SessionId); long subscriptionId = archive.StartRecording(channel, ctx.SnapshotStreamId(), SourceLocation.LOCAL); try { CountersReader counters = aeron.CountersReader(); int counterId = AwaitRecordingCounter(publication.SessionId, counters); recordingId = RecordingPos.GetRecordingId(counters, counterId); SnapshotState(publication, logPosition, leadershipTermId); service.OnTakeSnapshot(publication); AwaitRecordingComplete(recordingId, publication.Position, counters, counterId, archive); } finally { archive.StopRecording(subscriptionId); } } return(recordingId); }
private int AwaitRecordingCounter(Publication publication, CountersReader counters) { idleStrategy.Reset(); int counterId = RecordingPos.FindCounterIdBySession(counters, publication.SessionId); while (CountersReader.NULL_COUNTER_ID == counterId) { CheckInterruptedStatus(); idleStrategy.Idle(); counterId = RecordingPos.FindCounterIdBySession(counters, publication.SessionId); } return(counterId); }
private void AwaitRecordingComplete( long recordingId, long completePosition, CountersReader counters, int counterId, AeronArchive archive) { idleStrategy.Reset(); do { idleStrategy.Idle(); CheckInterruptedStatus(); if (!RecordingPos.IsActive(counters, counterId, recordingId)) { throw new InvalidOperationException("recording has stopped unexpectedly: " + recordingId); } archive.CheckForErrorResponse(); } while (counters.GetCounterValue(counterId) < completePosition); }