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 }
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 }
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 }
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); }
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 }