static void EnsureStreamsAreInOriginalState(SendMessageState sendState, IEnumerable <Message> messages)
        {
            IEnumerable <Message> messageList = messages as IList <Message> ?? messages.ToList();

            //We do not retry if:
            //1. any message was attempted to read the body stream and the stream is not seekable;
            //2. any message has initial stream position different from zero.

            if (sendState.InitialStreamPosition != 0)
            {
                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }

            foreach (Message message in messageList)
            {
                if (!message.IsBodyCalled || message.TryResetBody(0))
                {
                    continue;
                }

                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }
        }
        public override async Task SendEventAsync(IEnumerable <Message> messages, CancellationToken cancellationToken)
        {
            try
            {
                if (Logging.IsEnabled)
                {
                    Logging.Enter(this, messages, cancellationToken, $"{nameof(RetryDelegatingHandler)}.{nameof(SendEventAsync)}");
                }

                var sendState = new SendMessageState();
                IEnumerable <Message> messageList = messages as IList <Message> ?? messages.ToList();
                await this.internalRetryPolicy.ExecuteAsync(() =>
                {
                    return(this.SendMessageWithRetryAsync(
                               sendState,
                               messageList,
                               () => base.SendEventAsync(messageList, cancellationToken)));
                }, cancellationToken).ConfigureAwait(false);
            }
            catch (IotHubClientTransientException ex)
            {
                GetNormalizedIotHubException(ex).Throw();
            }
            finally
            {
                if (Logging.IsEnabled)
                {
                    Logging.Exit(this, messages, cancellationToken, $"{nameof(RetryDelegatingHandler)}.{nameof(SendEventAsync)}");
                }
            }
        }
Esempio n. 3
0
        public static void SendMessage(Socket socket, PeerMessage message, object state, MessageSentCallback callback)
        {
            byte[]           buffer = message.ToBytes();
            SendMessageState data   = SendCache.Get().Init(socket, buffer, 0, buffer.Length, state, callback);

            SendMessageBase(data);
        }
Esempio n. 4
0
        static void EnsureStreamsAreInOriginalState(SendMessageState sendState, IEnumerable <Message> messages)
        {
            if (sendState.InitialStreamPosition != 0)
            {
                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }

            foreach (Message message in messages)
            {
                if (!message.BodyStream.CanRead)
                {
                    sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                    sendState.OriginalError.Throw();
                }

                if (message.BodyStream.Position == 0)
                {
                    message.ResetGetBodyCalled();
                }

                //Initial stream position can be not 0 intentionally, i.e. users may want to send the message starting from offset.
                //However, we don't want to store initial positions of each message, so we just leave this rare scenario to the user.
                else if (message.BodyStream.CanSeek)
                {
                    message.BodyStream.Position = 0;
                    message.ResetGetBodyCalled();
                }
                else
                {
                    sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                    sendState.OriginalError.Throw();
                }
            }
        }
        public override async Task SendMethodResponseAsync(MethodResponseInternal method, CancellationToken cancellationToken)
        {
            try
            {
                if (Logging.IsEnabled)
                {
                    Logging.Enter(this, method, cancellationToken, $"{nameof(RetryDelegatingHandler)}.{nameof(SendMethodResponseAsync)}");
                }

                var sendState = new SendMessageState();
                await this.internalRetryPolicy.ExecuteAsync(() =>
                {
                    return(base.SendMethodResponseAsync(method, cancellationToken));
                }, cancellationToken).ConfigureAwait(false);
            }
            catch (IotHubClientTransientException ex)
            {
                GetNormalizedIotHubException(ex).Throw();
            }
            finally
            {
                if (Logging.IsEnabled)
                {
                    Logging.Exit(this, method, cancellationToken, $"{nameof(RetryDelegatingHandler)}.{nameof(SendMethodResponseAsync)}");
                }
            }
        }
Esempio n. 6
0
        public override async Task SendEventAsync(IEnumerable <Message> messages, CancellationToken cancellationToken)
        {
            Debug.WriteLine(cancellationToken.GetHashCode() + " RetryDelegatingHandler.SendEventAsync() ENTER");

            try
            {
                var sendState = new SendMessageState();
                IEnumerable <Message> messageList = messages as IList <Message> ?? messages.ToList();
                await this.internalRetryPolicy.ExecuteAsync(() =>
                {
                    return(this.SendMessageWithRetryAsync(
                               sendState,
                               messageList,
                               () => base.SendEventAsync(messageList, cancellationToken)));
                }, cancellationToken).ConfigureAwait(false);
            }
            catch (IotHubClientTransientException ex)
            {
                GetNormalizedIotHubException(ex).Throw();
            }
            finally
            {
                Debug.WriteLine(cancellationToken.GetHashCode() + " RetryDelegatingHandler.SendEventAsync() EXIT");
            }
        }
        async Task SendMessageWithRetryAsync(SendMessageState sendState, IEnumerable <Message> messages, Func <Task> action)
        {
            if (sendState.Iteration == 0)
            {
                foreach (Message message in messages)
                {
                    long messageStreamPosition = message.BodyStream.CanSeek ? message.BodyStream.Position : UndeterminedPosition;
                    if (messageStreamPosition == UndeterminedPosition || sendState.InitialStreamPosition == UndeterminedPosition)
                    {
                        sendState.InitialStreamPosition = UndeterminedPosition;
                    }
                    else
                    {
                        sendState.InitialStreamPosition = messageStreamPosition > sendState.InitialStreamPosition ? messageStreamPosition : sendState.InitialStreamPosition;
                    }
                    message.TryResetBody(messageStreamPosition);
                }

                await TryExecuteActionAsync(sendState, action);

                return;
            }

            EnsureStreamsAreInOriginalState(sendState, messages);

            await TryExecuteActionAsync(sendState, action);
        }
        static void EnsureStreamIsInOriginalState(SendMessageState sendState, Message message)
        {
            //We do not retry if a message was attempted to read the body stream and the stream is not seekable;
            if (!message.IsBodyCalled || message.TryResetBody(sendState.InitialStreamPosition))
            {
                return;
            }

            sendState.OriginalError.SourceException.Data[StopRetrying] = true;
            sendState.OriginalError.Throw();
        }
Esempio n. 9
0
 public override async Task SendEventAsync(Message message)
 {
     try
     {
         var sendState = new SendMessageState();
         await this.retryPolicy.ExecuteAsync(() => this.SendMessageWithRetryAsync(sendState, message, () => base.SendEventAsync(message)));
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
 public override async Task SendEventAsync(Message message)
 {
     try
     {
         var sendState = new SendMessageState();
         await this.retryPolicy.ExecuteAsync(() => this.SendMessageWithRetryAsync(sendState, message, () => base.SendEventAsync(message)));
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
Esempio n. 11
0
 public override async Task SendEventAsync(IEnumerable <Message> messages)
 {
     try
     {
         var sendState = new SendMessageState();
         IEnumerable <Message> messageList = messages as IList <Message> ?? messages.ToList();
         await this.retryPolicy.ExecuteAsync(() => this.SendMessageWithRetryAsync(sendState, messageList, () => base.SendEventAsync(messageList)));
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
 public override async Task SendEventAsync(IEnumerable<Message> messages)
 {
     try
     {
         var sendState = new SendMessageState();
         IEnumerable<Message> messageList = messages as IList<Message> ?? messages.ToList();
         await this.retryPolicy.ExecuteAsync(() => this.SendMessageWithRetryAsync(sendState, messageList, () => base.SendEventAsync(messageList)));
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
Esempio n. 13
0
 static async Task TryExecuteActionAsync(SendMessageState sendState, Func <Task> action)
 {
     sendState.Iteration++;
     try
     {
         await action();
     }
     catch (IotHubClientTransientException ex)
     {
         sendState.OriginalError = ExceptionDispatchInfo.Capture(ex);
         throw;
     }
 }
Esempio n. 14
0
 public override async Task SendMethodResponseAsync(MethodResponseInternal method, CancellationToken cancellationToken)
 {
     try
     {
         var sendState = new SendMessageState();
         await this.internalRetryPolicy.ExecuteAsync(() =>
         {
             return(base.SendMethodResponseAsync(method, cancellationToken));
         }, cancellationToken).ConfigureAwait(false);
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
        async Task SendMessageWithRetryAsync(SendMessageState sendState, Message message, Func <Task> action)
        {
            if (sendState.Iteration == 0)
            {
                sendState.InitialStreamPosition = message.BodyStream.CanSeek ? message.BodyStream.Position : UndeterminedPosition;
                message.TryResetBody(sendState.InitialStreamPosition);

                await TryExecuteActionAsync(sendState, action).ConfigureAwait(false);

                return;
            }

            EnsureStreamIsInOriginalState(sendState, message);

            await TryExecuteActionAsync(sendState, action).ConfigureAwait(false);
        }
Esempio n. 16
0
        async Task SendMessageWithRetryAsync(SendMessageState sendState, Message message, Func <Task> action)
        {
            if (sendState.Iteration == 0)
            {
                sendState.InitialStreamPosition = message.BodyStream.Position;
                message.ResetGetBodyCalled();

                await TryExecuteActionAsync(sendState, action);

                return;
            }

            EnsureStreamIsInOriginalState(sendState, message);

            await TryExecuteActionAsync(sendState, action);
        }
 public override async Task SendEventAsync(Message message, CancellationToken cancellationToken)
 {
     try
     {
         var sendState = new SendMessageState();
         await this.retryPolicy.ExecuteAsync(() =>
         {
             if (cancellationToken.IsCancellationRequested)
             {
                 return(Common.TaskConstants.Completed);
             }
             return(this.SendMessageWithRetryAsync(sendState, message, () => base.SendEventAsync(message, cancellationToken)));
         }, cancellationToken);
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
 public override async Task SendMethodResponseAsync(MethodResponseInternal method, CancellationToken cancellationToken)
 {
     try
     {
         var sendState = new SendMessageState();
         await this.internalRetryPolicy.ExecuteAsync(() =>
         {
             if (cancellationToken.IsCancellationRequested)
             {
                 return(Common.TaskConstants.Completed);
             }
             return(base.SendMethodResponseAsync(method, cancellationToken));
         }, cancellationToken);
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
Esempio n. 19
0
        async Task SendMessageWithRetryAsync(SendMessageState sendState, IEnumerable <Message> messages, Func <Task> action)
        {
            if (sendState.Iteration == 0)
            {
                foreach (Message message in messages)
                {
                    sendState.InitialStreamPosition = message.BodyStream.Position > sendState.InitialStreamPosition ? message.BodyStream.Position : sendState.InitialStreamPosition;
                    message.ResetGetBodyCalled();
                }

                await TryExecuteActionAsync(sendState, action);

                return;
            }

            EnsureStreamsAreInOriginalState(sendState, messages);

            await TryExecuteActionAsync(sendState, action);
        }
 public override async Task SendEventAsync(IEnumerable <Message> messages, CancellationToken cancellationToken)
 {
     try
     {
         var sendState = new SendMessageState();
         IEnumerable <Message> messageList = messages as IList <Message> ?? messages.ToList();
         await this.internalRetryPolicy.ExecuteAsync(() =>
         {
             if (cancellationToken.IsCancellationRequested)
             {
                 return(Common.TaskConstants.Completed);
             }
             return(this.SendMessageWithRetryAsync(sendState, messageList, () => base.SendEventAsync(messageList, cancellationToken)));
         }, cancellationToken);
     }
     catch (IotHubClientTransientException ex)
     {
         GetNormalizedIotHubException(ex).Throw();
     }
 }
Esempio n. 21
0
        static void EnsureStreamIsInOriginalState(SendMessageState sendState, Message message)
        {
            if (!message.BodyStream.CanRead)
            {
                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }

            if (message.BodyStream.Position == sendState.InitialStreamPosition)
            {
                message.ResetGetBodyCalled();
            }
            else if (message.BodyStream.CanSeek)
            {
                message.BodyStream.Position = sendState.InitialStreamPosition;
                message.ResetGetBodyCalled();
            }
            else
            {
                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }
        }
        static void EnsureStreamsAreInOriginalState(SendMessageState sendState, IEnumerable<Message> messages)
        {
            IEnumerable<Message> messageList = messages as IList<Message> ?? messages.ToList();

            //We do not retry if:
            //1. any message was attempted to read the body stream and the stream is not seekable; 
            //2. any message has initial stream position different from zero.

            if (sendState.InitialStreamPosition != 0)
            {
                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }

            foreach (Message message in messageList)
            {               
                if (!message.IsBodyCalled || message.TryResetBody(0))
                {
                    continue;
                }

                sendState.OriginalError.SourceException.Data[StopRetrying] = true;
                sendState.OriginalError.Throw();
            }
        }
 static async Task TryExecuteActionAsync(SendMessageState sendState, Func<Task> action)
 {
     sendState.Iteration++;
     try
     {
         await action();
     }
     catch (IotHubClientTransientException ex)
     {
         sendState.OriginalError = ExceptionDispatchInfo.Capture(ex);
         throw;
     }
 }
        async Task SendMessageWithRetryAsync(SendMessageState sendState, Message message, Func<Task> action)
        {
            if (sendState.Iteration == 0)
            {
                sendState.InitialStreamPosition = message.BodyStream.CanSeek ? message.BodyStream.Position : UndeterminedPosition;
                message.TryResetBody(sendState.InitialStreamPosition);

                await TryExecuteActionAsync(sendState, action);
                return;
            }

            EnsureStreamIsInOriginalState(sendState, message);

            await TryExecuteActionAsync(sendState, action);
        }
        async Task SendMessageWithRetryAsync(SendMessageState sendState, IEnumerable<Message> messages, Func<Task> action)
        {
            if (sendState.Iteration == 0)
            {
                foreach (Message message in messages)
                {
                    long messageStreamPosition = message.BodyStream.CanSeek ? message.BodyStream.Position : UndeterminedPosition;
                    if (messageStreamPosition == UndeterminedPosition || sendState.InitialStreamPosition == UndeterminedPosition)
                    {
                        sendState.InitialStreamPosition = UndeterminedPosition;
                    }
                    else
                    {
                        sendState.InitialStreamPosition = messageStreamPosition > sendState.InitialStreamPosition ? messageStreamPosition : sendState.InitialStreamPosition;
                    }
                    message.TryResetBody(messageStreamPosition);
                }

                await TryExecuteActionAsync(sendState, action);
                return;
            }

            EnsureStreamsAreInOriginalState(sendState, messages);

            await TryExecuteActionAsync(sendState, action);
        }
Esempio n. 26
0
 private static void SendMessageBase(SendMessageState data)
 {
     NetworkIo.Send(data.Socket, data.Buffer, data.Offset, data.Count, data, EndSendCallback);
 }
        static void EnsureStreamIsInOriginalState(SendMessageState sendState, Message message)
        {
            //We do not retry if a message was attempted to read the body stream and the stream is not seekable;             
            if (!message.IsBodyCalled || message.TryResetBody(sendState.InitialStreamPosition))
            {
                return;
            }

            sendState.OriginalError.SourceException.Data[StopRetrying] = true;
            sendState.OriginalError.Throw();
        }
Esempio n. 28
0
 private static void SendMessageBase(SendMessageState data)
 {
     NetworkIO.Send(data.Socket, data.Buffer, data.Offset, data.Count, data, EndSendCallback);
 }