private StorageMessage.CheckStreamAccessCompleted CheckStreamAccess(StorageMessage.CheckStreamAccess msg) { string streamId = msg.EventStreamId; try { if (msg.EventStreamId == null) { if (msg.TransactionId == null) { throw new Exception("No transaction ID specified."); } var transInfo = _readIndex.GetTransactionInfo(_writerCheckpoint.Read(), msg.TransactionId.Value); if (transInfo.TransactionOffset < -1 || transInfo.EventStreamId.IsEmptyString()) { throw new Exception( string.Format("Invalid transaction info found for transaction ID {0}. " + "Possibly wrong transaction ID provided. TransactionOffset: {1}, EventStreamId: {2}", msg.TransactionId, transInfo.TransactionOffset, transInfo.EventStreamId.IsEmptyString() ? "<null>" : transInfo.EventStreamId)); } streamId = transInfo.EventStreamId; } var result = _readIndex.CheckStreamAccess(streamId, msg.AccessType, msg.User); return(new StorageMessage.CheckStreamAccessCompleted(msg.CorrelationId, streamId, msg.TransactionId, msg.AccessType, result)); } catch (Exception exc) { Log.ErrorException(exc, "Error during processing CheckStreamAccess({0}, {1}) request.", msg.EventStreamId, msg.TransactionId); return(new StorageMessage.CheckStreamAccessCompleted(msg.CorrelationId, streamId, msg.TransactionId, msg.AccessType, new StreamAccess(false))); } }
void IHandle <StorageMessage.WriteTransactionData> .Handle(StorageMessage.WriteTransactionData message) { Interlocked.Decrement(ref FlushMessagesInQueue); try { var logPosition = Writer.Checkpoint.ReadNonFlushed(); var transactionInfo = ReadIndex.GetTransactionInfo(Writer.Checkpoint.Read(), message.TransactionId); if (!CheckTransactionInfo(message.TransactionId, transactionInfo)) { return; } if (message.Events.Length > 0) { 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, transactionInfo.TransactionOffset + i + 1, transactionInfo.EventStreamId, evnt.EventType, evnt.Data, evnt.Metadata, evnt.IsJson); var res = WritePrepareWithRetry(record); logPosition = res.NewPos; } ReadIndex.UpdateTransactionInfo(message.TransactionId, new TransactionInfo(transactionInfo.TransactionOffset + message.Events.Length, transactionInfo.EventStreamId)); } } catch (Exception exc) { Log.ErrorException(exc, "Exception in writer."); throw; } finally { Flush(); } }