Exemple #1
0
        void IHandle <ReplicationMessage.WritePrepares> .Handle(ReplicationMessage.WritePrepares message)
        {
            if (_state != VNodeState.Master)
            {
                throw new InvalidOperationException("Write request not in working state.");
            }
            CheckExpectedVersionAndWrite(message, (msg, toCreateStream) =>
            {
                Debug.Assert(msg.Events.Length > 0);
                var logPosition         = _writer.Checkpoint.ReadNonFlushed();
                var transactionPosition = logPosition;

                if (toCreateStream)
                {
                    var res = WritePrepareWithRetry(LogRecord.StreamCreated(logPosition,
                                                                            msg.CorrelationId,
                                                                            transactionPosition,
                                                                            msg.EventStreamId,
                                                                            LogRecord.NoData));
                    transactionPosition = res.WrittenPos;
                    logPosition         = res.NewPos;
                }

                for (int i = 0; i < msg.Events.Length; ++i)
                {
                    var evnt  = msg.Events[i];
                    var flags = PrepareFlags.Data;
                    if (i == 0 && !toCreateStream)
                    {
                        flags |= PrepareFlags.TransactionBegin;
                    }
                    if (i == msg.Events.Length - 1)
                    {
                        flags |= PrepareFlags.TransactionEnd;
                    }
                    if (evnt.IsJson)
                    {
                        flags |= PrepareFlags.IsJson;
                    }

                    var expectedVersion = toCreateStream
                                              ? ExpectedVersion.Any
                                              : (i == 0 ? msg.ExpectedVersion : ExpectedVersion.Any);
                    var res = WritePrepareWithRetry(LogRecord.Prepare(logPosition,
                                                                      msg.CorrelationId,
                                                                      evnt.EventId,
                                                                      transactionPosition,
                                                                      msg.EventStreamId,
                                                                      expectedVersion,
                                                                      flags,
                                                                      evnt.EventType,
                                                                      evnt.Data,
                                                                      evnt.Metadata));
                    logPosition = res.NewPos;
                }
            });
        }
Exemple #2
0
        void IHandle <ReplicationMessage.WritePrepares> .Handle(ReplicationMessage.WritePrepares message)
        {
            Interlocked.Decrement(ref _flushMessagesInQueue);

            try
            {
                if (message.LiveUntil < DateTime.UtcNow)
                {
                    return;
                }

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

                var logPosition         = _writer.Checkpoint.ReadNonFlushed();
                var transactionPosition = logPosition;

                var shouldCreateStream = ShouldCreateStreamFor(message);
                if (shouldCreateStream)
                {
                    var res = WritePrepareWithRetry(LogRecord.StreamCreated(logPosition,
                                                                            message.CorrelationId,
                                                                            transactionPosition,
                                                                            message.EventStreamId,
                                                                            LogRecord.NoData));
                    transactionPosition = res.WrittenPos; // transaction position could be changed due to switching to new chunk
                    logPosition         = res.NewPos;
                }

                for (int i = 0; i < message.Events.Length; ++i)
                {
                    var evnt  = message.Events[i];
                    var flags = PrepareFlags.Data;
                    if (i == 0 && !shouldCreateStream)
                    {
                        flags |= PrepareFlags.TransactionBegin;
                    }
                    if (i == message.Events.Length - 1)
                    {
                        flags |= PrepareFlags.TransactionEnd;
                    }
                    if (evnt.IsJson)
                    {
                        flags |= PrepareFlags.IsJson;
                    }

                    var expectedVersion = shouldCreateStream
                                              ? ExpectedVersion.Any
                                              : (i == 0 ? message.ExpectedVersion : ExpectedVersion.Any);
                    var res = WritePrepareWithRetry(LogRecord.Prepare(logPosition,
                                                                      message.CorrelationId,
                                                                      evnt.EventId,
                                                                      transactionPosition,
                                                                      shouldCreateStream ? i + 1 : i,
                                                                      message.EventStreamId,
                                                                      expectedVersion,
                                                                      flags,
                                                                      evnt.EventType,
                                                                      evnt.Data,
                                                                      evnt.Metadata));
                    logPosition = res.NewPos;
                    if (i == 0 && !shouldCreateStream)
                    {
                        transactionPosition = res.WrittenPos; // transaction position could be changed due to switching to new chunk
                    }
                }
            }
            finally
            {
                Flush();
            }
        }