示例#1
0
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata, int lastEventNumber)
 {
     Result          = result;
     Record          = record;
     Metadata        = metadata;
     LastEventNumber = lastEventNumber;
 }
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata, int lastEventNumber)
 {
     Result = result;
     Record = record;
     Metadata = metadata;
     LastEventNumber = lastEventNumber;
 }
        public IndexReadEventResult(ReadEventResult result)
        {
            if (result == ReadEventResult.Success)
                throw new ArgumentException(string.Format("Wrong ReadEventResult provided for failure constructor: {0}.", result), "result");

            Result = result;
            Record = null;
        }
示例#4
0
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata, long lastEventNumber, bool originalStreamExists)
 {
     Result               = result;
     Record               = record;
     Metadata             = metadata;
     LastEventNumber      = lastEventNumber;
     OriginalStreamExists = originalStreamExists;
 }
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata, int lastEventNumber, bool originalStreamExists)
 {
     Result = result;
     Record = record;
     Metadata = metadata;
     LastEventNumber = lastEventNumber;
     OriginalStreamExists = originalStreamExists;
 }
        public IndexReadEventResult(ReadEventResult result, StreamMetadata metadata, int lastEventNumber)
        {
            if (result == ReadEventResult.Success)
                throw new ArgumentException(string.Format("Wrong ReadEventResult provided for failure constructor: {0}.", result), "result");

            Result = result;
            Record = null;
            Metadata = metadata;
            LastEventNumber = lastEventNumber;
        }
示例#7
0
        public IndexReadEventResult(ReadEventResult result, StreamMetadata metadata)
        {
            if (result == ReadEventResult.Success)
            {
                throw new ArgumentException(string.Format("Wrong ReadEventResult provided for failure constructor: {0}.", result), "result");
            }

            Result   = result;
            Record   = null;
            Metadata = metadata;
        }
示例#8
0
        public IndexReadEventResult(ReadEventResult result, StreamMetadata metadata, long lastEventNumber, bool originalStreamExists)
        {
            if (result == ReadEventResult.Success)
            {
                throw new ArgumentException(string.Format("Wrong ReadEventResult provided for failure constructor: {0}.", result), "result");
            }

            Result               = result;
            Record               = null;
            Metadata             = metadata;
            LastEventNumber      = lastEventNumber;
            OriginalStreamExists = originalStreamExists;
        }
示例#9
0
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata)
 {
     Result   = result;
     Record   = record;
     Metadata = metadata;
 }
 public IndexReadEventResult(ReadEventResult result, EventRecord record, StreamMetadata metadata)
 {
     Result = result;
     Record = record;
     Metadata = metadata;
 }
            public ReadEventCompleted(Guid correlationId, string eventStreamId, ReadEventResult result, ResolvedEvent record)
            {
                Ensure.NotNullOrEmpty(eventStreamId, "eventStreamId");
                if (result == ReadEventResult.Success)
                    Ensure.NotNull(record.Event, "record.Event");

                CorrelationId = correlationId;
                EventStreamId = eventStreamId;
                Result = result;
                Record = record;
            }
 public IndexReadEventResult(ReadEventResult result, EventRecord record)
 {
     Result = result;
     Record = record;
 }
示例#13
0
        public void Commit(CommitLogRecord commit)
        {
            var lastCommitPosition = Interlocked.Read(ref _lastCommitPosition);

            if (commit.LogPosition < lastCommitPosition || (commit.LogPosition == lastCommitPosition && !_indexRebuild))
            {
                return;  // already committed
            }
            bool   first       = true;
            int    eventNumber = -1;
            uint   streamHash  = 0;
            string streamId    = null;

            foreach (var prepare in GetTransactionPrepares(commit.TransactionPosition))
            {
                if (first)
                {
                    streamHash = _hasher.Hash(prepare.EventStreamId);
                    streamId   = prepare.EventStreamId;
                    first      = false;
                }
                else
                {
                    Debug.Assert(prepare.EventStreamId == streamId);
                }

                bool addToIndex = false;
                if ((prepare.Flags & PrepareFlags.StreamDelete) != 0)
                {
                    eventNumber = EventNumber.DeletedStream;
                    _committedEvents.PutRecord(prepare.EventId, Tuple.Create(streamId, eventNumber), throwOnDuplicate: false);
                    addToIndex = commit.LogPosition > _persistedCommitCheckpoint ||
                                 commit.LogPosition == _persistedCommitCheckpoint && prepare.LogPosition > _persistedPrepareCheckpoint;
                }
                else if ((prepare.Flags & PrepareFlags.Data) != 0)
                {
                    eventNumber = commit.EventNumber + prepare.TransactionOffset;
                    _committedEvents.PutRecord(prepare.EventId, Tuple.Create(streamId, eventNumber), throwOnDuplicate: false);
                    addToIndex = commit.LogPosition > _persistedCommitCheckpoint ||
                                 commit.LogPosition == _persistedCommitCheckpoint && prepare.LogPosition > _persistedPrepareCheckpoint;
                }

                // could be just empty prepares for TransactionBegin and TransactionEnd, for instance
                // or records which are rebuilt but are already in PTables
                if (addToIndex)
                {
#if CHECK_COMMIT_DUPLICATES
                    long pos;
                    if (_tableIndex.TryGetOneValue(streamHash, eventNumber, out pos))
                    {
                        ReadEventResult res = ((IReadIndex)this).ReadEvent(eventStreamId, eventNumber);
                        if (res.Result == SingleReadResult.Success)
                        {
                            Debugger.Break();
                            throw new Exception(
                                      string.Format(
                                          "Trying to add duplicate event #{0} for stream {1}(hash {2})\nCommit: {3}\nPrepare: {4}.",
                                          eventNumber,
                                          eventStreamId,
                                          streamHash,
                                          commit,
                                          prepare));
                        }
                    }
#endif
                    _tableIndex.Add(commit.LogPosition, streamHash, eventNumber, prepare.LogPosition);
                    _bus.Publish(new StorageMessage.EventCommited(commit.LogPosition, eventNumber, prepare));
                }
            }

            if (first)
            {
                throw new Exception("No prepares for commit found!");
            }

            var newLastCommitPosition = commit.LogPosition > lastCommitPosition ? commit.LogPosition : lastCommitPosition;
            if (Interlocked.CompareExchange(ref _lastCommitPosition, newLastCommitPosition, lastCommitPosition) != lastCommitPosition)
            {
                throw new Exception("Concurrency error in ReadIndex.Commit: _lastCommitPosition was modified during Commit execution!");
            }

            _streamInfoCache.Put(streamId,
                                 key => new StreamCacheInfo(eventNumber, null),
                                 (key, old) => new StreamCacheInfo(eventNumber, old.Metadata));
        }