Ejemplo n.º 1
0
        private void ReadAllFromDisk()
        {
            file.Position = ReadOffsets(Path.GetFileName(streamSource.GetLatestName(dataPath)));
            while (true)
            {
                using (var reader = new BinaryReader(file, Encoding.UTF8, leaveOpen: true))
                {
                    var            itemPos = file.Position;
                    PersistedEvent persistedEvent;
                    try
                    {
                        persistedEvent = ReadPersistedEvent(reader);
                        eventsCount++;
                    }
                    catch (EndOfStreamException)
                    {
                        lastWriteSnapshotCount = eventsCount;
                        lastWriteSnapshotTime  = DateTime.UtcNow;
                        return;
                    }
                    catch (Exception e)
                    {
                        log.WarnException("Error during initial events read, file corrupted", e);
                        if (options.AllowRecovery == false)
                        {
                            throw;
                        }
                        file.SetLength(itemPos);
                        log.Warn("Recovered from corrupted file by truncating file to last known good position: " + itemPos);
                        return;
                    }
                    switch (persistedEvent.State)
                    {
                    case EventState.Event:
                    case EventState.Snapshot:
                        idToPos.AddOrUpdate(persistedEvent.Id, s => new StreamInformation
                        {
                            LastPosition = itemPos,
                            StreamLength = 1
                        }, (s, information) => new StreamInformation
                        {
                            LastPosition = itemPos,
                            StreamLength = information.StreamLength + 1
                        });
                        break;

                    case EventState.Delete:
                        deleteCount++;
                        var streamInformation = new StreamInformation
                        {
                            LastPosition = Deleted,
                            StreamLength = 0
                        };
                        idToPos.AddOrUpdate(persistedEvent.Id, s => streamInformation, (s, information) =>
                        {
                            deleteCount += information.StreamLength;
                            return(streamInformation);
                        });
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(persistedEvent.State.ToString());
                    }
                }
            }
        }