private static void GetRecordingExtent(AeronArchive archive, RecordingExtent recordingExtent, Entry entry) { if (archive.ListRecording(entry.recordingId, recordingExtent) == 0) { throw new InvalidOperationException("Unknown recording id: " + entry.recordingId); } }
private void LoadSnapshot(long recordingId) { using (AeronArchive archive = AeronArchive.Connect(archiveCtx)) { RecordingExtent recordingExtent = new RecordingExtent(); if (0 == archive.ListRecording(recordingId, recordingExtent)) { throw new System.InvalidOperationException("Could not find recordingId: " + recordingId); } string channel = ctx.ReplayChannel(); int streamId = ctx.ReplayStreamId(); long length = recordingExtent.stopPosition - recordingExtent.startPosition; int sessionId = (int)archive.StartReplay(recordingId, 0, length, channel, streamId); string replaySessionChannel = ChannelUri.AddSessionId(channel, sessionId); using (Subscription subscription = aeron.AddSubscription(replaySessionChannel, streamId)) { Image image = AwaitImage(sessionId, subscription); LoadState(image); service.OnLoadSnapshot(image); } } }
internal static ReplayStep PlanRecovery(List <ReplayStep> steps, List <Entry> entries, AeronArchive archive) { if (entries.Count == 0) { return(null); } int snapshotIndex = -1; for (int i = entries.Count - 1; i >= 0; i--) { Entry entry = entries[i]; if (ENTRY_TYPE_SNAPSHOT == entry.type) { snapshotIndex = i; } } ReplayStep snapshotStep; RecordingExtent recordingExtent = new RecordingExtent(); if (-1 != snapshotIndex) { Entry snapshot = entries[snapshotIndex]; GetRecordingExtent(archive, recordingExtent, snapshot); snapshotStep = new ReplayStep(recordingExtent.startPosition, recordingExtent.stopPosition, snapshot); if (snapshotIndex - 1 >= 0) { for (int i = snapshotIndex - 1; i >= 0; i--) { Entry entry = entries[i]; if (ENTRY_TYPE_TERM == entry.type) { GetRecordingExtent(archive, recordingExtent, snapshot); long snapshotPosition = snapshot.logPosition + snapshot.termPosition; if (recordingExtent.stopPosition == AeronArchive.NULL_POSITION || (entry.logPosition + recordingExtent.stopPosition) > snapshotPosition) { steps.Add(new ReplayStep(snapshot.termPosition, recordingExtent.stopPosition, entry)); } break; } } } } else { snapshotStep = null; } for (int i = snapshotIndex + 1, length = entries.Count; i < length; i++) { Entry entry = entries[i]; GetRecordingExtent(archive, recordingExtent, entry); steps.Add(new ReplayStep(recordingExtent.startPosition, recordingExtent.stopPosition, entry)); } return(snapshotStep); }