示例#1
0
 private ClientMessage.ReadAllEventsBackwardCompleted NoData(ClientMessage.ReadAllEventsBackward msg,
                                                             ReadAllResult result, TFPos pos, long lastCommitPosition, string error = null)
 {
     return(new ClientMessage.ReadAllEventsBackwardCompleted(
                msg.CorrelationId, result, error, ResolvedEvent.EmptyArray, null, false,
                msg.MaxCount, pos, TFPos.Invalid, TFPos.Invalid, lastCommitPosition));
 }
        public static ClientMessage.ReadAllEventsBackwardCompleted ReadAllEventsBackward(MiniClusterNode node,
                                                                                         long position)
        {
            ClientMessage.ReadAllEventsBackwardCompleted readResult = null;
            var resetEvent = new ManualResetEventSlim();
            var done       = false;

            while (!done)
            {
                resetEvent.Reset();
                var read = new ClientMessage.ReadAllEventsBackward(Guid.NewGuid(), Guid.NewGuid(), new CallbackEnvelope(
                                                                       msg => {
                    readResult = (ClientMessage.ReadAllEventsBackwardCompleted)msg;
                    resetEvent.Set();
                }),
                                                                   -1, -1, 100, false, false, null, SystemAccount.Principal);
                node.Node.MainQueue.Publish(read);

                if (!resetEvent.Wait(_timeout))
                {
                    Assert.Fail("Timed out waiting for events to be read backward");
                    return(null);
                }

                if (readResult.Result == ReadAllResult.Error)
                {
                    Assert.Fail("Failed to read backwards. Read result error: {0}", readResult.Error);
                    return(null);
                }

                done = readResult.NextPos.CommitPosition < position;
            }

            return(readResult);
        }
示例#3
0
 void IHandle <ClientMessage.ReadAllEventsBackward> .Handle(ClientMessage.ReadAllEventsBackward msg)
 {
     if (msg.Expires < DateTime.Now)
     {
         return;
     }
     msg.Envelope.ReplyWith(ReadAllEventsBackward(msg));
 }
 void IHandle <ClientMessage.ReadAllEventsBackward> .Handle(ClientMessage.ReadAllEventsBackward msg)
 {
     if (msg.Expires < DateTime.UtcNow)
     {
         Log.Debug("Read All Stream Events Backward operation has expired for C:{0}/P:{1}. Operation Expired at {2}", msg.CommitPosition, msg.PreparePosition, msg.Expires);
         return;
     }
     msg.Envelope.ReplyWith(ReadAllEventsBackward(msg));
 }
示例#5
0
 public TcpPackage CreateNetworkPackage()
 {
     lock (_corrIdLock)
     {
         var dto = new ClientMessage.ReadAllEventsBackward(_position.CommitPosition,
                                                           _position.PreparePosition,
                                                           _maxCount,
                                                           _resolveLinkTos);
         return(new TcpPackage(TcpCommand.ReadAllEventsBackward, _corrId, dto.Serialize()));
     }
 }
示例#6
0
        private ClientMessage.ReadAllEventsBackwardCompleted ReadAllEventsBackward(ClientMessage.ReadAllEventsBackward msg)
        {
            using (HistogramService.Measure(_readerAllRangeHistogram))
            {
                var pos = new TFPos(msg.CommitPosition, msg.PreparePosition);
                var lastCommitPosition = _readIndex.LastReplicatedPosition;
                try
                {
                    if (msg.MaxCount > MaxPageSize)
                    {
                        throw new ArgumentException(string.Format("Read size too big, should be less than {0} items",
                                                                  MaxPageSize));
                    }

                    if (pos == TFPos.HeadOfTf)
                    {
                        var checkpoint = _writerCheckpoint.Read();
                        pos = new TFPos(checkpoint, checkpoint);
                    }
                    if (pos.CommitPosition < 0 || pos.PreparePosition < 0)
                    {
                        return(NoData(msg, ReadAllResult.Error, pos, lastCommitPosition, "Invalid position."));
                    }
                    if (msg.ValidationTfLastCommitPosition == lastCommitPosition)
                    {
                        return(NoData(msg, ReadAllResult.NotModified, pos, lastCommitPosition));
                    }

                    var access = _readIndex.CheckStreamAccess(SystemStreams.AllStream, StreamAccessType.Read, msg.User);
                    if (!access.Granted)
                    {
                        return(NoData(msg, ReadAllResult.AccessDenied, pos, lastCommitPosition));
                    }

                    var res      = _readIndex.ReadAllEventsBackward(pos, msg.MaxCount);
                    var resolved = ResolveReadAllResult(res.Records, msg.ResolveLinkTos, msg.User);
                    if (resolved == null)
                    {
                        return(NoData(msg, ReadAllResult.AccessDenied, pos, lastCommitPosition));
                    }

                    var metadata = _readIndex.GetStreamMetadata(SystemStreams.AllStream);
                    return(new ClientMessage.ReadAllEventsBackwardCompleted(
                               msg.CorrelationId, ReadAllResult.Success, null, resolved, metadata, access.Public, msg.MaxCount,
                               res.CurrentPos, res.NextPos, res.PrevPos, lastCommitPosition));
                }
                catch (Exception exc)
                {
                    Log.ErrorException(exc, "Error during processing ReadAllEventsBackward request.");
                    return(NoData(msg, ReadAllResult.Error, pos, lastCommitPosition, exc.Message));
                }
            }
        }
示例#7
0
        void IHandle <ClientMessage.ReadAllEventsBackward> .Handle(ClientMessage.ReadAllEventsBackward message)
        {
            var pos = new TFPos(message.CommitPosition, message.PreparePosition);

            if (pos == new TFPos(-1, -1))
            {
                var checkpoint = _writerCheckpoint.Read();
                pos = new TFPos(checkpoint, checkpoint);
            }
            var result = _readIndex.ReadAllEventsBackward(pos, message.MaxCount, message.ResolveLinks);

            message.Envelope.ReplyWith(new ClientMessage.ReadAllEventsBackwardCompleted(message.CorrelationId, result));
        }
示例#8
0
        public Task <AllEventsSlice> ReadAllEventsBackwardAsync(Position position, int maxCount, bool resolveLinkTos, UserCredentials userCredentials = null)
        {
            Ensure.Positive(maxCount, "maxCount");

            var source = new TaskCompletionSource <AllEventsSlice>();

            var envelope = new EmbeddedResponseEnvelope(new EmbeddedResponders.ReadAllEventsBackward(source));

            Guid corrId = Guid.NewGuid();

            var message = new ClientMessage.ReadAllEventsBackward(corrId, corrId, envelope,
                                                                  position.CommitPosition,
                                                                  position.PreparePosition, maxCount, resolveLinkTos, false, null, SystemAccount.Principal);

            _publisher.Publish(message);

            return(source.Task);
        }
 private void HandleAsNonMaster(ClientMessage.ReadAllEventsBackward message)
 {
     if (message.RequireMaster)
     {
         if (_master == null)
         {
             DenyRequestBecauseNotReady(message.Envelope, message.CorrelationId);
         }
         else
         {
             DenyRequestBecauseNotMaster(message.CorrelationId, message.Envelope);
         }
     }
     else
     {
         _outputBus.Publish(message);
     }
 }
示例#10
0
        private ClientMessage.ReadAllEventsBackwardCompleted ReadAllEventsBackward(ClientMessage.ReadAllEventsBackward msg)
        {
            var pos = new TFPos(msg.CommitPosition, msg.PreparePosition);

            try
            {
                if (pos == TFPos.HeadOfTf)
                {
                    var checkpoint = _writerCheckpoint.Read();
                    pos = new TFPos(checkpoint, checkpoint);
                }
                if (pos.CommitPosition < 0 || pos.PreparePosition < 0)
                {
                    return(NoData(msg, ReadAllResult.Error, pos, "Invalid position."));
                }
                if (msg.ValidationTfEofPosition.HasValue && _readIndex.LastCommitPosition == msg.ValidationTfEofPosition.Value)
                {
                    return(NoData(msg, ReadAllResult.NotModified, pos));
                }
                var access = _readIndex.CheckStreamAccess(SystemStreams.AllStream, StreamAccessType.Read, msg.User);
                if (!access.Granted)
                {
                    return(NoData(msg, ReadAllResult.AccessDenied, pos));
                }

                var res      = _readIndex.ReadAllEventsBackward(pos, msg.MaxCount);
                var resolved = ResolveReadAllResult(res.Records, msg.ResolveLinkTos, msg.User);
                if (resolved == null)
                {
                    return(NoData(msg, ReadAllResult.AccessDenied, pos));
                }

                return(new ClientMessage.ReadAllEventsBackwardCompleted(
                           msg.CorrelationId, ReadAllResult.Success, null, resolved, res.Metadata, access.Public, msg.MaxCount,
                           res.CurrentPos, res.NextPos, res.PrevPos, res.TfEofPosition));
            }
            catch (Exception exc)
            {
                Log.ErrorException(exc, "Error during processing ReadAllEventsBackward request.");
                return(NoData(msg, ReadAllResult.Error, pos, exc.Message));
            }
        }
示例#11
0
 void IHandle <ClientMessage.ReadAllEventsBackward> .Handle(ClientMessage.ReadAllEventsBackward msg)
 {
     msg.Envelope.ReplyWith(ReadAllEventsBackward(msg));
 }