コード例 #1
0
        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)));
            }
        }
コード例 #2
0
        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();
            }
        }