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