示例#1
0
        void IHandle <ReplicationMessage.WriteTransactionData> .Handle(ReplicationMessage.WriteTransactionData message)
        {
            if (_state != VNodeState.Master)
            {
                throw new InvalidOperationException("Write request not in working state.");
            }
            Interlocked.Decrement(ref _flushMessagesInQueue);

            try
            {
                Debug.Assert(message.Events.Length > 0);

                var logPosition = _writer.Checkpoint.ReadNonFlushed();
                for (int i = 0; i < message.Events.Length; ++i)
                {
                    var evnt   = message.Events[i];
                    var record = LogRecord.TransactionWrite(logPosition,
                                                            message.CorrelationId,
                                                            evnt.EventId,
                                                            message.TransactionId,
                                                            message.EventStreamId,
                                                            evnt.EventType,
                                                            evnt.Data,
                                                            evnt.Metadata);
                    var res = WritePrepareWithRetry(record);
                    logPosition = res.NewPos;
                }
            }
            finally
            {
                Flush();
            }
        }
示例#2
0
        void IHandle <ReplicationMessage.WriteTransactionData> .Handle(ReplicationMessage.WriteTransactionData message)
        {
            Interlocked.Decrement(ref _flushMessagesInQueue);
            try
            {
                Debug.Assert(message.Events.Length > 0);

                var logPosition       = _writer.Checkpoint.ReadNonFlushed();
                var transactionOffset = _readIndex.GetLastTransactionOffset(logPosition, message.TransactionId);
                if (transactionOffset < -1)
                {
                    throw new Exception(
                              string.Format("Invalid transaction offset {0} found for transaction ID {1}. Possibly wrong transactionId provided.",
                                            transactionOffset,
                                            message.TransactionId));
                }
                for (int i = 0; i < message.Events.Length; ++i)
                {
                    var evnt   = message.Events[i];
                    var record = LogRecord.TransactionWrite(logPosition,
                                                            message.CorrelationId,
                                                            evnt.EventId,
                                                            message.TransactionId,
                                                            transactionOffset + i + 1,
                                                            message.EventStreamId,
                                                            evnt.EventType,
                                                            evnt.Data,
                                                            evnt.Metadata);
                    var res = WritePrepareWithRetry(record);
                    logPosition = res.NewPos;
                }
            }
            finally
            {
                Flush();
            }
        }