예제 #1
0
        public void Handle(StorageMessage.PrepareAck message)
        {
            if (Interlocked.Read(ref _complete) == 1 || _allPreparesWritten)
            {
                return;
            }
            NextTimeoutTime = DateTime.UtcNow + Timeout;
            if (message.Flags.HasAnyOf(PrepareFlags.TransactionBegin))
            {
                TransactionId = message.LogPosition;
            }
            if (message.LogPosition > LastEventPosition)
            {
                LastEventPosition = message.LogPosition;
            }

            lock (_prepareLogPositions) {
                _prepareLogPositions.Add(message.LogPosition);
                _allPreparesWritten = _prepareLogPositions.Count == _prepareCount;
            }
            if (_allPreparesWritten)
            {
                AllPreparesWritten();
            }
            _allEventsWritten = _commitReceived && _allPreparesWritten;
            if (_allEventsWritten)
            {
                AllEventsWritten();
            }
        }
        public void Handle(StorageMessage.PrepareAck message)
        {
            if (_completed)
            {
                return;
            }

            if ((message.Flags & PrepareFlags.TransactionBegin) != 0)
            {
                _transactionPos = message.LogPosition;
            }

            if ((message.Flags & PrepareFlags.TransactionEnd) != 0)
            {
                _awaitingPrepare -= 1;
                if (_awaitingPrepare == 0)
                {
                    if (_transactionPos < 0)
                    {
                        throw new Exception("PreparePos is not assigned.");
                    }
                    Publisher.Publish(new StorageMessage.WriteCommit(message.CorrelationId, _publishEnvelope, _transactionPos));
                    _nextTimeoutTime = DateTime.UtcNow + CommitTimeout;
                }
            }
        }
예제 #3
0
 public void Handle(StorageMessage.PrepareAck message)
 {
     if (_state == VNodeState.Slave)
     {
         Debug.Assert(_connection != null, "_connection == null");
         SendTcpMessage(_connection, message);
     }
 }
예제 #4
0
 public void Handle(StorageMessage.PrepareAck message)
 {
     if (_completed)
     {
         return;
     }
     _transactionId = message.LogPosition;
     CompleteSuccessRequest();
 }
예제 #5
0
 public void Handle(StorageMessage.PrepareAck message)
 {
     if (_completed)
     {
         return;
     }
     if (message.Flags.HasNoneOf(PrepareFlags.TransactionBegin))
     {
         throw new Exception(string.Format("Unexpected PrepareAck with flags [{0}] arrived (LogPosition: {1}, InternalCorrId: {2:B}, ClientCorrId: {3:B}).",
                                           message.Flags, message.LogPosition, message.CorrelationId, _clientCorrId));
     }
     _transactionId = message.LogPosition;
     CompleteSuccessRequest();
 }
예제 #6
0
        public void Handle(StorageMessage.PrepareAck message)
        {
            if (_completed)
            {
                return;
            }

            if (_transactionId == -1)
            {
                throw new Exception("TransactionId was not set, transactionId = -1.");
            }

            if (message.Flags.HasAnyOf(PrepareFlags.TransactionEnd))
            {
                _awaitingPrepare -= 1;
                if (_awaitingPrepare == 0)
                {
                    Publisher.Publish(new StorageMessage.WriteCommit(message.CorrelationId, PublishEnvelope, _transactionId));
                    _nextTimeoutTime = DateTime.UtcNow + CommitTimeout;
                }
            }
        }
예제 #7
0
        public void Handle(StorageMessage.PrepareAck message)
        {
            if (_completed)
            {
                return;
            }

            if ((message.Flags & PrepareFlags.TransactionBegin) != 0)
            {
                _preparePos = message.LogPosition;
            }

            if ((message.Flags & PrepareFlags.TransactionEnd) != 0)
            {
                _awaitingPrepare -= 1;
                if (_awaitingPrepare == 0)
                {
                    Publisher.Publish(new StorageMessage.WriteCommit(message.CorrelationId, _publishEnvelope, _preparePos));
                    Publisher.Publish(TimerMessage.Schedule.Create(Timeouts.CommitTimeout,
                                                                   _publishEnvelope,
                                                                   new StorageMessage.CommitPhaseTimeout(_correlationId)));
                }
            }
        }
        private TcpPackage WrapPrepareAck(StorageMessage.PrepareAck msg)
        {
            var dto = new ReplicationMessageDto.PrepareAck(msg.LogPosition, (byte)msg.Flags);

            return(new TcpPackage(TcpCommand.PrepareAck, msg.CorrelationId, dto.Serialize()));
        }
예제 #9
0
 public void Handle(StorageMessage.PrepareAck message)
 {
     DispatchInternal(message.CorrelationId, message);
 }