Пример #1
0
 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);
     }
 }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
        }