Пример #1
0
        private int GetLastStreamEventNumberInternal(ITransactionFileReader reader, string streamId)
        {
            Ensure.NotNull(streamId, "streamId");

            var        streamHash = _hasher.Hash(streamId);
            IndexEntry latestEntry;

            if (!_tableIndex.TryGetLatestEntry(streamHash, out latestEntry))
            {
                return(ExpectedVersion.NoStream);
            }

            var prepare = ReadPrepareInternal(reader, latestEntry.Position);

            if (prepare.EventStreamId == streamId) // LUCKY!!!
            {
                return(latestEntry.Version);
            }

            // TODO AN here lie the problem of out of memory if the stream have A LOT of events in them
            foreach (var indexEntry in _tableIndex.GetRange(streamHash, 0, int.MaxValue))
            {
                var p = ReadPrepareInternal(reader, indexEntry.Position);
                if (p.EventStreamId == streamId)
                {
                    return(indexEntry.Version); // AT LAST!!!
                }
            }
            return(ExpectedVersion.NoStream); // no such event stream
        }
Пример #2
0
        private int GetStreamLastEventNumberUncached(TFReaderLease reader, string streamId)
        {
            var        streamHash = _hasher.Hash(streamId);
            IndexEntry latestEntry;

            if (!_tableIndex.TryGetLatestEntry(streamHash, out latestEntry))
            {
                return(ExpectedVersion.NoStream);
            }

            var rec = ReadPrepareInternal(reader, latestEntry.Position);

            if (rec == null)
            {
                throw new Exception("Couldn't read latest stream's prepare! That shouldn't happen EVER!");
            }
            if (rec.EventStreamId == streamId) // LUCKY!!!
            {
                return(latestEntry.Version);
            }

            // TODO AN here lies the problem of out of memory if the stream has A LOT of events in them
            foreach (var indexEntry in _tableIndex.GetRange(streamHash, 0, int.MaxValue))
            {
                var r = ReadPrepareInternal(reader, indexEntry.Position);
                if (r != null && r.EventStreamId == streamId)
                {
                    return(indexEntry.Version); // AT LAST!!!
                }
                Interlocked.Increment(ref _hashCollisions);
            }
            return(ExpectedVersion.NoStream); // no such event stream
        }
Пример #3
0
        private int GetLastStreamEventNumberInternal(ITransactionFileReader reader, string eventStreamId)
        {
            Ensure.NotNull(eventStreamId, "eventStreamId");

            var        streamHash = _hasher.Hash(eventStreamId);
            IndexEntry latestEntry;

            if (!_tableIndex.TryGetLatestEntry(streamHash, out latestEntry))
            {
                return(ExpectedVersion.NoStream);
            }

            var prepare = GetPrepareInternal(reader, latestEntry.Position);

            if (prepare.EventStreamId == eventStreamId) // LUCKY!!!
            {
                return(latestEntry.Version);
            }

            foreach (var indexEntry in _tableIndex.GetRange(streamHash, 0, int.MaxValue))
            {
                var p = GetPrepareInternal(reader, indexEntry.Position);
                if (p.EventStreamId == eventStreamId)
                {
                    return(indexEntry.Version); // AT LAST!!!
                }
            }
            return(ExpectedVersion.NoStream); // no such event stream
        }
Пример #4
0
        private long GetStreamLastEventNumberUncached(TFReaderLease reader, string streamId)
        {
            IndexEntry latestEntry;

            if (!_tableIndex.TryGetLatestEntry(streamId, out latestEntry))
            {
                return(ExpectedVersion.NoStream);
            }

            var rec = ReadPrepareInternal(reader, latestEntry.Position);

            if (rec == null)
            {
                throw new Exception(
                          $"Could not read latest stream's prepare for stream '{streamId}' at position {latestEntry.Position}");
            }

            int  count         = 0;
            long startVersion  = 0;
            long latestVersion = long.MinValue;

            if (rec.EventStreamId == streamId)
            {
                startVersion  = Math.Max(latestEntry.Version, latestEntry.Version + 1);
                latestVersion = latestEntry.Version;
            }

            foreach (var indexEntry in _tableIndex.GetRange(streamId, startVersion, long.MaxValue,
                                                            limit: _hashCollisionReadLimit + 1))
            {
                var r = ReadPrepareInternal(reader, indexEntry.Position);
                if (r != null && r.EventStreamId == streamId)
                {
                    if (latestVersion == long.MinValue)
                    {
                        latestVersion = indexEntry.Version;
                        continue;
                    }

                    return(latestVersion < indexEntry.Version ? indexEntry.Version : latestVersion);
                }

                count++;
                Interlocked.Increment(ref _hashCollisions);
                if (count > _hashCollisionReadLimit)
                {
                    Log.Error("A hash collision resulted in not finding the last event number for the stream {stream}.",
                              streamId);
                    return(EventNumber.Invalid);
                }
            }

            return(latestVersion == long.MinValue ? ExpectedVersion.NoStream : latestVersion);
        }
Пример #5
0
        private int GetStreamLastEventNumberUncached(TFReaderLease reader, string streamId)
        {
            IndexEntry latestEntry;

            if (!_tableIndex.TryGetLatestEntry(streamId, out latestEntry))
            {
                return(ExpectedVersion.NoStream);
            }

            var rec = ReadPrepareInternal(reader, latestEntry.Position);

            if (rec == null)
            {
                throw new Exception("Could not read latest stream's prepare. That should never happen.");
            }
            if (rec.EventStreamId == streamId) // LUCKY!!!
            {
                return(latestEntry.Version);
            }

            int count = 0;

            foreach (var indexEntry in _tableIndex.GetRange(streamId, 0, int.MaxValue, limit: _hashCollisionReadLimit))
            {
                var r = ReadPrepareInternal(reader, indexEntry.Position);
                if (r != null && r.EventStreamId == streamId)
                {
                    return(indexEntry.Version); // AT LAST!!!
                }
                count++;
                Interlocked.Increment(ref _hashCollisions);
                if (count > _hashCollisionReadLimit)
                {
                    Log.Error("A hash collision resulted in not finding the last event number for the stream {0}", streamId);
                    return(ExpectedVersion.NoStream);
                }
            }
            return(ExpectedVersion.NoStream); // no such event stream
        }