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)}"); } } }
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); }
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)}"); } } }
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(); }
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(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(); } }
static async Task TryExecuteActionAsync(SendMessageState sendState, Func <Task> action) { sendState.Iteration++; try { await action(); } catch (IotHubClientTransientException ex) { sendState.OriginalError = ExceptionDispatchInfo.Capture(ex); throw; } }
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); }
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(); } }
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(); } }
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); }
private static void SendMessageBase(SendMessageState data) { NetworkIo.Send(data.Socket, data.Buffer, data.Offset, data.Count, data, EndSendCallback); }
private static void SendMessageBase(SendMessageState data) { NetworkIO.Send(data.Socket, data.Buffer, data.Offset, data.Count, data, EndSendCallback); }