From 1fbdb02798788df7b538c738ea66f0229bf2b96a Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Mon, 29 Jan 2024 10:50:57 -0800 Subject: [PATCH 1/3] retry policy updates --- .../api/System.ClientModel.net6.0.cs | 5 ----- .../api/System.ClientModel.netstandard2.0.cs | 5 ----- .../src/Pipeline/ClientRetryPolicy.cs | 10 +++++----- .../tests/Pipeline/ClientRetryPolicyTests.cs | 4 ++-- .../tests/TestFramework/Mocks/MockRetryPolicy.cs | 7 +++++++ .../TestFramework/Mocks/MockSyncAsyncExtensions.cs | 2 +- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs index 19ea53a04a07..65a33b562cd7 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs @@ -79,7 +79,6 @@ public partial class ClientRetryPolicy : System.ClientModel.Primitives.PipelineP { public static readonly System.ClientModel.Primitives.ClientRetryPolicy Default; public ClientRetryPolicy(int maxRetries = 3) { } - public System.TimeSpan GetNextDelay(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual System.TimeSpan GetNextDelayCore(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual void OnRequestSent(System.ClientModel.Primitives.PipelineMessage message) { } protected virtual System.Threading.Tasks.ValueTask OnRequestSentAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; } @@ -88,12 +87,8 @@ protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMe protected virtual void OnTryComplete(System.ClientModel.Primitives.PipelineMessage message) { } public sealed override void Process(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { } public sealed override System.Threading.Tasks.ValueTask ProcessAsync(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { throw null; } - public bool ShouldRetry(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - public System.Threading.Tasks.ValueTask ShouldRetryAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } protected virtual bool ShouldRetryCore(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } protected virtual System.Threading.Tasks.ValueTask ShouldRetryCoreAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - public void Wait(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } - public System.Threading.Tasks.Task WaitAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } protected virtual void WaitCore(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } protected virtual System.Threading.Tasks.Task WaitCoreAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } } diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs index 1d5b1cb1f78b..2ddde4b07039 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs @@ -79,7 +79,6 @@ public partial class ClientRetryPolicy : System.ClientModel.Primitives.PipelineP { public static readonly System.ClientModel.Primitives.ClientRetryPolicy Default; public ClientRetryPolicy(int maxRetries = 3) { } - public System.TimeSpan GetNextDelay(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual System.TimeSpan GetNextDelayCore(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual void OnRequestSent(System.ClientModel.Primitives.PipelineMessage message) { } protected virtual System.Threading.Tasks.ValueTask OnRequestSentAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; } @@ -88,12 +87,8 @@ protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMe protected virtual void OnTryComplete(System.ClientModel.Primitives.PipelineMessage message) { } public sealed override void Process(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { } public sealed override System.Threading.Tasks.ValueTask ProcessAsync(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { throw null; } - public bool ShouldRetry(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - public System.Threading.Tasks.ValueTask ShouldRetryAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } protected virtual bool ShouldRetryCore(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } protected virtual System.Threading.Tasks.ValueTask ShouldRetryCoreAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - public void Wait(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } - public System.Threading.Tasks.Task WaitAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } protected virtual void WaitCore(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } protected virtual System.Threading.Tasks.Task WaitCoreAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } } diff --git a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs index 2a8cd155c9bd..2eb96a6af451 100644 --- a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs +++ b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs @@ -133,10 +133,10 @@ protected virtual void OnRequestSent(PipelineMessage message) { } protected virtual void OnTryComplete(PipelineMessage message) { } - public bool ShouldRetry(PipelineMessage message, Exception? exception) + internal bool ShouldRetry(PipelineMessage message, Exception? exception) => ShouldRetrySyncOrAsync(message, exception, async: false).EnsureCompleted(); - public async ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) + internal async ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) => await ShouldRetrySyncOrAsync(message, exception, async: true).ConfigureAwait(false); private async ValueTask ShouldRetrySyncOrAsync(PipelineMessage message, Exception? exception, bool async) @@ -178,7 +178,7 @@ protected virtual bool ShouldRetryCore(PipelineMessage message, Exception? excep protected virtual ValueTask ShouldRetryCoreAsync(PipelineMessage message, Exception? exception) => new(ShouldRetryCore(message, exception)); - public TimeSpan GetNextDelay(PipelineMessage message, int tryCount) + internal TimeSpan GetNextDelay(PipelineMessage message, int tryCount) => GetNextDelayCore(message, tryCount); protected virtual TimeSpan GetNextDelayCore(PipelineMessage message, int tryCount) @@ -187,7 +187,7 @@ protected virtual TimeSpan GetNextDelayCore(PipelineMessage message, int tryCoun return TimeSpan.FromMilliseconds((1 << (tryCount - 1)) * _initialDelay.TotalMilliseconds); } - public async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) + internal async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) => await WaitCoreAsync(time, cancellationToken).ConfigureAwait(false); protected virtual async Task WaitCoreAsync(TimeSpan time, CancellationToken cancellationToken) @@ -195,7 +195,7 @@ protected virtual async Task WaitCoreAsync(TimeSpan time, CancellationToken canc await Task.Delay(time, cancellationToken).ConfigureAwait(false); } - public void Wait(TimeSpan time, CancellationToken cancellationToken) + internal void Wait(TimeSpan time, CancellationToken cancellationToken) => WaitCore(time, cancellationToken); protected virtual void WaitCore(TimeSpan time, CancellationToken cancellationToken) diff --git a/sdk/core/System.ClientModel/tests/Pipeline/ClientRetryPolicyTests.cs b/sdk/core/System.ClientModel/tests/Pipeline/ClientRetryPolicyTests.cs index e96fc0391ad4..6237dd911c60 100644 --- a/sdk/core/System.ClientModel/tests/Pipeline/ClientRetryPolicyTests.cs +++ b/sdk/core/System.ClientModel/tests/Pipeline/ClientRetryPolicyTests.cs @@ -345,7 +345,7 @@ int responseFactory(int i) [Test] public void WaitThrowsOnCancellation() { - ClientRetryPolicy retryPolicy = new(); + MockRetryPolicy retryPolicy = new(); CancellationTokenSource cts = new CancellationTokenSource(); @@ -356,4 +356,4 @@ public void WaitThrowsOnCancellation() Assert.ThrowsAsync(async () => await retryPolicy.WaitSyncOrAsync(delay, cts.Token, IsAsync)); } -} \ No newline at end of file +} diff --git a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs index 9f3a1a425c28..81f783983065 100644 --- a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs +++ b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs @@ -3,6 +3,7 @@ using System; using System.ClientModel.Primitives; +using System.Threading; using System.Threading.Tasks; namespace ClientModel.Tests.Mocks; @@ -94,4 +95,10 @@ protected override TimeSpan GetNextDelayCore(PipelineMessage message, int tryCou return base.GetNextDelayCore(message, tryCount); } + + public async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) + => await WaitCoreAsync(time, cancellationToken).ConfigureAwait(false); + + public void Wait(TimeSpan time, CancellationToken cancellationToken) + => WaitCore(time, cancellationToken); } diff --git a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs index b50e4cd890fc..62abd37ace9a 100644 --- a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs +++ b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs @@ -73,7 +73,7 @@ public static async Task ProcessSyncOrAsync(this HttpClientPipelineTransport tra } } - public static async Task WaitSyncOrAsync(this ClientRetryPolicy policy, TimeSpan delay, CancellationToken cancellationToken, bool isAsync) + public static async Task WaitSyncOrAsync(this MockRetryPolicy policy, TimeSpan delay, CancellationToken cancellationToken, bool isAsync) { if (isAsync) { From 47519c3c929332e80e0fe4148e1c8d1e5d95a001 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Mon, 29 Jan 2024 11:10:39 -0800 Subject: [PATCH 2/3] update MessageClassifier property on message to ResponseClassifier --- sdk/core/Azure.Core/api/Azure.Core.net461.cs | 2 +- sdk/core/Azure.Core/api/Azure.Core.net472.cs | 2 +- sdk/core/Azure.Core/api/Azure.Core.net6.0.cs | 2 +- .../Azure.Core/api/Azure.Core.netstandard2.0.cs | 2 +- sdk/core/Azure.Core/src/HttpMessage.cs | 15 +++------------ .../common/TestClients/MapsClient/MapsClient.cs | 2 +- .../api/System.ClientModel.net6.0.cs | 2 +- .../api/System.ClientModel.netstandard2.0.cs | 2 +- .../src/Message/PipelineMessage.cs | 4 ++-- .../src/Pipeline/ClientRetryPolicy.cs | 2 +- .../src/Pipeline/PipelineTransport.cs | 2 +- .../tests/client/MapsClient/MapsClient.cs | 2 +- .../tests/client/OpenAIClient/OpenAIClient.cs | 2 +- .../MapsClient/MapsClient.cs | 2 +- 14 files changed, 17 insertions(+), 26 deletions(-) diff --git a/sdk/core/Azure.Core/api/Azure.Core.net461.cs b/sdk/core/Azure.Core/api/Azure.Core.net461.cs index 4a36fc58ad10..d5df397dda3d 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net461.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net461.cs @@ -488,7 +488,7 @@ public HttpMessage(Azure.Core.Request request, Azure.Core.ResponseClassifier res public Azure.Core.MessageProcessingContext ProcessingContext { get { throw null; } } public new Azure.Core.Request Request { get { throw null; } } public new Azure.Response Response { get { throw null; } set { } } - public Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } + public new Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } public System.IO.Stream? ExtractResponseContent() { throw null; } public void SetProperty(string name, object value) { } public bool TryGetProperty(string name, out object? value) { throw null; } diff --git a/sdk/core/Azure.Core/api/Azure.Core.net472.cs b/sdk/core/Azure.Core/api/Azure.Core.net472.cs index 4a36fc58ad10..d5df397dda3d 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net472.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net472.cs @@ -488,7 +488,7 @@ public HttpMessage(Azure.Core.Request request, Azure.Core.ResponseClassifier res public Azure.Core.MessageProcessingContext ProcessingContext { get { throw null; } } public new Azure.Core.Request Request { get { throw null; } } public new Azure.Response Response { get { throw null; } set { } } - public Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } + public new Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } public System.IO.Stream? ExtractResponseContent() { throw null; } public void SetProperty(string name, object value) { } public bool TryGetProperty(string name, out object? value) { throw null; } diff --git a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs index b1d3e8dac712..b5a657f013dc 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs @@ -488,7 +488,7 @@ public HttpMessage(Azure.Core.Request request, Azure.Core.ResponseClassifier res public Azure.Core.MessageProcessingContext ProcessingContext { get { throw null; } } public new Azure.Core.Request Request { get { throw null; } } public new Azure.Response Response { get { throw null; } set { } } - public Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } + public new Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } public System.IO.Stream? ExtractResponseContent() { throw null; } public void SetProperty(string name, object value) { } public bool TryGetProperty(string name, out object? value) { throw null; } diff --git a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs index 4a36fc58ad10..d5df397dda3d 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs @@ -488,7 +488,7 @@ public HttpMessage(Azure.Core.Request request, Azure.Core.ResponseClassifier res public Azure.Core.MessageProcessingContext ProcessingContext { get { throw null; } } public new Azure.Core.Request Request { get { throw null; } } public new Azure.Response Response { get { throw null; } set { } } - public Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } + public new Azure.Core.ResponseClassifier ResponseClassifier { get { throw null; } set { } } public System.IO.Stream? ExtractResponseContent() { throw null; } public void SetProperty(string name, object value) { } public bool TryGetProperty(string name, out object? value) { throw null; } diff --git a/sdk/core/Azure.Core/src/HttpMessage.cs b/sdk/core/Azure.Core/src/HttpMessage.cs index 58243be82dab..467b5dafa317 100644 --- a/sdk/core/Azure.Core/src/HttpMessage.cs +++ b/sdk/core/Azure.Core/src/HttpMessage.cs @@ -63,19 +63,10 @@ public HttpMessage(Request request, ResponseClassifier responseClassifier) /// /// The instance to use for response classification during pipeline invocation. /// - public ResponseClassifier ResponseClassifier + public new ResponseClassifier ResponseClassifier { - get - { - if (MessageClassifier is not ResponseClassifier classifier) - { - throw new InvalidOperationException($"Invalid ResponseClassifier set on message: '{base.MessageClassifier}'."); - } - - return classifier; - } - - set => MessageClassifier = value; + get => (ResponseClassifier)base.ResponseClassifier; + set => base.ResponseClassifier = value; } internal int RetryNumber { get; set; } diff --git a/sdk/core/Azure.Core/tests/common/TestClients/MapsClient/MapsClient.cs b/sdk/core/Azure.Core/tests/common/TestClients/MapsClient/MapsClient.cs index 7c3e88a230f1..493d6f113516 100644 --- a/sdk/core/Azure.Core/tests/common/TestClients/MapsClient/MapsClient.cs +++ b/sdk/core/Azure.Core/tests/common/TestClients/MapsClient/MapsClient.cs @@ -71,7 +71,7 @@ private HttpMessage CreateGetLocationRequest(string ipAddress, RequestContext co { HttpMessage message = _pipeline.CreateMessage(); message.Apply(context); - message.MessageClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); + message.ResponseClassifier = new StatusCodeClassifier(stackalloc ushort[] { 200 }); Request request = message.Request; request.Method = RequestMethod.Get; diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs index 65a33b562cd7..ed1e7554a44e 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs @@ -142,10 +142,10 @@ public partial class PipelineMessage : System.IDisposable protected internal PipelineMessage(System.ClientModel.Primitives.PipelineRequest request) { } public bool BufferResponse { get { throw null; } set { } } public System.Threading.CancellationToken CancellationToken { get { throw null; } protected internal set { } } - public System.ClientModel.Primitives.PipelineMessageClassifier MessageClassifier { get { throw null; } set { } } public System.TimeSpan? NetworkTimeout { get { throw null; } set { } } public System.ClientModel.Primitives.PipelineRequest Request { get { throw null; } } public System.ClientModel.Primitives.PipelineResponse? Response { get { throw null; } protected internal set { } } + public System.ClientModel.Primitives.PipelineMessageClassifier ResponseClassifier { get { throw null; } set { } } public void Apply(System.ClientModel.Primitives.RequestOptions options) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs index 2ddde4b07039..c5ca3302f219 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs @@ -141,10 +141,10 @@ public partial class PipelineMessage : System.IDisposable protected internal PipelineMessage(System.ClientModel.Primitives.PipelineRequest request) { } public bool BufferResponse { get { throw null; } set { } } public System.Threading.CancellationToken CancellationToken { get { throw null; } protected internal set { } } - public System.ClientModel.Primitives.PipelineMessageClassifier MessageClassifier { get { throw null; } set { } } public System.TimeSpan? NetworkTimeout { get { throw null; } set { } } public System.ClientModel.Primitives.PipelineRequest Request { get { throw null; } } public System.ClientModel.Primitives.PipelineResponse? Response { get { throw null; } protected internal set { } } + public System.ClientModel.Primitives.PipelineMessageClassifier ResponseClassifier { get { throw null; } set { } } public void Apply(System.ClientModel.Primitives.RequestOptions options) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } diff --git a/sdk/core/System.ClientModel/src/Message/PipelineMessage.cs b/sdk/core/System.ClientModel/src/Message/PipelineMessage.cs index d2be344d7ca5..d955c268237b 100644 --- a/sdk/core/System.ClientModel/src/Message/PipelineMessage.cs +++ b/sdk/core/System.ClientModel/src/Message/PipelineMessage.cs @@ -19,7 +19,7 @@ protected internal PipelineMessage(PipelineRequest request) _propertyBag = new ArrayBackedPropertyBag(); BufferResponse = true; - MessageClassifier = PipelineMessageClassifier.Default; + ResponseClassifier = PipelineMessageClassifier.Default; } public PipelineRequest Request { get; } @@ -65,7 +65,7 @@ public CancellationToken CancellationToken // the client-provided classifier or compose a chain of classification // handlers that preserve the functionality of the client-provided classifier // at the end of the chain. - public PipelineMessageClassifier MessageClassifier { get; set; } + public PipelineMessageClassifier ResponseClassifier { get; set; } public void Apply(RequestOptions options) { diff --git a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs index 2eb96a6af451..a0e72e2e2db2 100644 --- a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs +++ b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs @@ -165,7 +165,7 @@ protected virtual bool ShouldRetryCore(PipelineMessage message, Exception? excep return false; } - if (!message.MessageClassifier.TryClassify(message, exception, out bool isRetriable)) + if (!message.ResponseClassifier.TryClassify(message, exception, out bool isRetriable)) { bool classified = PipelineMessageClassifier.Default.TryClassify(message, exception, out isRetriable); diff --git a/sdk/core/System.ClientModel/src/Pipeline/PipelineTransport.cs b/sdk/core/System.ClientModel/src/Pipeline/PipelineTransport.cs index a590c400d289..a516ed3a4cef 100644 --- a/sdk/core/System.ClientModel/src/Pipeline/PipelineTransport.cs +++ b/sdk/core/System.ClientModel/src/Pipeline/PipelineTransport.cs @@ -43,7 +43,7 @@ public async ValueTask ProcessAsync(PipelineMessage message) private static bool ClassifyResponse(PipelineMessage message) { - if (!message.MessageClassifier.TryClassify(message, out bool isError)) + if (!message.ResponseClassifier.TryClassify(message, out bool isError)) { bool classified = PipelineMessageClassifier.Default.TryClassify(message, out isError); diff --git a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs index c719650de6b6..a4c18222a771 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs @@ -69,7 +69,7 @@ public virtual ClientResult GetCountryCode(string ipAddress, RequestOptions opti private PipelineMessage CreateGetLocationRequest(string ipAddress, RequestOptions options) { PipelineMessage message = _pipeline.CreateMessage(); - message.MessageClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); + message.ResponseClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); PipelineRequest request = message.Request; request.Method = "GET"; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs index c6dee54e8df1..14601dae3fd1 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs @@ -71,7 +71,7 @@ public virtual ClientResult GetCompletions(string deploymentId, BinaryContent co internal PipelineMessage CreateGetCompletionsRequest(string deploymentId, BinaryContent content, RequestOptions options) { PipelineMessage message = _pipeline.CreateMessage(); - message.MessageClassifier = MessageClassifier200; + message.ResponseClassifier = MessageClassifier200; PipelineRequest request = message.Request; request.Method = "POST"; diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs index 8b7b2ee0a709..aaa2d23a75d8 100644 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs +++ b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs @@ -88,7 +88,7 @@ public virtual ClientResult GetCountryCode(string ipAddress, RequestOptions? opt private PipelineMessage CreateGetLocationRequest(string ipAddress, RequestOptions options) { PipelineMessage message = _pipeline.CreateMessage(); - message.MessageClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); + message.ResponseClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); PipelineRequest request = message.Request; request.Method = "GET"; From aba6dd963b8052886e3aaced545b42cfd61aac39 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Mon, 29 Jan 2024 16:30:09 -0800 Subject: [PATCH 3/3] API updates --- .../src/Pipeline/RetryPolicy.AzurePolicy.cs | 10 ++--- .../api/System.ClientModel.net6.0.cs | 10 ++--- .../api/System.ClientModel.netstandard2.0.cs | 10 ++--- .../src/Pipeline/ClientRetryPolicy.cs | 39 +++++++------------ .../TestFramework/Mocks/MockRetryPolicy.cs | 24 ++++++------ .../Mocks/MockSyncAsyncExtensions.cs | 4 +- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/sdk/core/Azure.Core/src/Pipeline/RetryPolicy.AzurePolicy.cs b/sdk/core/Azure.Core/src/Pipeline/RetryPolicy.AzurePolicy.cs index 69a83981636c..06b6a1ea95c5 100644 --- a/sdk/core/Azure.Core/src/Pipeline/RetryPolicy.AzurePolicy.cs +++ b/sdk/core/Azure.Core/src/Pipeline/RetryPolicy.AzurePolicy.cs @@ -58,10 +58,10 @@ protected override async ValueTask OnRequestSentAsync(PipelineMessage message) _elapsedTime = (_afterProcess - _beforeProcess) / (double)Stopwatch.Frequency; } - protected override bool ShouldRetryCore(PipelineMessage message, Exception? exception) + protected override bool ShouldRetry(PipelineMessage message, Exception? exception) => _pipelinePolicy.ShouldRetry(AssertHttpMessage(message), exception); - protected override async ValueTask ShouldRetryCoreAsync(PipelineMessage message, Exception? exception) + protected override async ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) => await _pipelinePolicy.ShouldRetryAsync(AssertHttpMessage(message), exception).ConfigureAwait(false); protected override void OnTryComplete(PipelineMessage message) @@ -77,7 +77,7 @@ protected override void OnTryComplete(PipelineMessage message) _elapsedTime = default; } - protected override TimeSpan GetNextDelayCore(PipelineMessage message, int tryCount) + protected override TimeSpan GetNextDelay(PipelineMessage message, int tryCount) { HttpMessage httpMessage = AssertHttpMessage(message); @@ -87,10 +87,10 @@ protected override TimeSpan GetNextDelayCore(PipelineMessage message, int tryCou return _delayStrategy.GetNextDelay(response, tryCount + 1); } - protected override async Task WaitCoreAsync(TimeSpan time, CancellationToken cancellationToken) + protected override async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) => await _pipelinePolicy.WaitAsync(time, cancellationToken).ConfigureAwait(false); - protected override void WaitCore(TimeSpan time, CancellationToken cancellationToken) + protected override void Wait(TimeSpan time, CancellationToken cancellationToken) => _pipelinePolicy.Wait(time, cancellationToken); private static HttpMessage AssertHttpMessage(PipelineMessage message) diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs index ed1e7554a44e..f155b44fc740 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs @@ -79,7 +79,7 @@ public partial class ClientRetryPolicy : System.ClientModel.Primitives.PipelineP { public static readonly System.ClientModel.Primitives.ClientRetryPolicy Default; public ClientRetryPolicy(int maxRetries = 3) { } - protected virtual System.TimeSpan GetNextDelayCore(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } + protected virtual System.TimeSpan GetNextDelay(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual void OnRequestSent(System.ClientModel.Primitives.PipelineMessage message) { } protected virtual System.Threading.Tasks.ValueTask OnRequestSentAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; } protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMessage message) { } @@ -87,10 +87,10 @@ protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMe protected virtual void OnTryComplete(System.ClientModel.Primitives.PipelineMessage message) { } public sealed override void Process(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { } public sealed override System.Threading.Tasks.ValueTask ProcessAsync(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { throw null; } - protected virtual bool ShouldRetryCore(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - protected virtual System.Threading.Tasks.ValueTask ShouldRetryCoreAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - protected virtual void WaitCore(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } - protected virtual System.Threading.Tasks.Task WaitCoreAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } + protected virtual bool ShouldRetry(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } + protected virtual System.Threading.Tasks.ValueTask ShouldRetryAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } + protected virtual void Wait(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } + protected virtual System.Threading.Tasks.Task WaitAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } } public partial class HttpClientPipelineTransport : System.ClientModel.Primitives.PipelineTransport, System.IDisposable { diff --git a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs index c5ca3302f219..eb673b8c3118 100644 --- a/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs +++ b/sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs @@ -79,7 +79,7 @@ public partial class ClientRetryPolicy : System.ClientModel.Primitives.PipelineP { public static readonly System.ClientModel.Primitives.ClientRetryPolicy Default; public ClientRetryPolicy(int maxRetries = 3) { } - protected virtual System.TimeSpan GetNextDelayCore(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } + protected virtual System.TimeSpan GetNextDelay(System.ClientModel.Primitives.PipelineMessage message, int tryCount) { throw null; } protected virtual void OnRequestSent(System.ClientModel.Primitives.PipelineMessage message) { } protected virtual System.Threading.Tasks.ValueTask OnRequestSentAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; } protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMessage message) { } @@ -87,10 +87,10 @@ protected virtual void OnSendingRequest(System.ClientModel.Primitives.PipelineMe protected virtual void OnTryComplete(System.ClientModel.Primitives.PipelineMessage message) { } public sealed override void Process(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { } public sealed override System.Threading.Tasks.ValueTask ProcessAsync(System.ClientModel.Primitives.PipelineMessage message, System.Collections.Generic.IReadOnlyList pipeline, int currentIndex) { throw null; } - protected virtual bool ShouldRetryCore(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - protected virtual System.Threading.Tasks.ValueTask ShouldRetryCoreAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } - protected virtual void WaitCore(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } - protected virtual System.Threading.Tasks.Task WaitCoreAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } + protected virtual bool ShouldRetry(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } + protected virtual System.Threading.Tasks.ValueTask ShouldRetryAsync(System.ClientModel.Primitives.PipelineMessage message, System.Exception? exception) { throw null; } + protected virtual void Wait(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { } + protected virtual System.Threading.Tasks.Task WaitAsync(System.TimeSpan time, System.Threading.CancellationToken cancellationToken) { throw null; } } public partial class HttpClientPipelineTransport : System.ClientModel.Primitives.PipelineTransport, System.IDisposable { diff --git a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs index a0e72e2e2db2..564f968b7273 100644 --- a/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs +++ b/sdk/core/System.ClientModel/src/Pipeline/ClientRetryPolicy.cs @@ -78,8 +78,8 @@ private async ValueTask ProcessSyncOrAsync(PipelineMessage message, IReadOnlyLis } bool shouldRetry = async ? - await ShouldRetryAsync(message, thisTryException).ConfigureAwait(false) : - ShouldRetry(message, thisTryException); + await ShouldRetryInternalAsync(message, thisTryException).ConfigureAwait(false) : + ShouldRetryInternal(message, thisTryException); if (shouldRetry) { @@ -133,13 +133,13 @@ protected virtual void OnRequestSent(PipelineMessage message) { } protected virtual void OnTryComplete(PipelineMessage message) { } - internal bool ShouldRetry(PipelineMessage message, Exception? exception) - => ShouldRetrySyncOrAsync(message, exception, async: false).EnsureCompleted(); + internal bool ShouldRetryInternal(PipelineMessage message, Exception? exception) + => ShouldRetryInternalSyncOrAsync(message, exception, async: false).EnsureCompleted(); - internal async ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) - => await ShouldRetrySyncOrAsync(message, exception, async: true).ConfigureAwait(false); + internal async ValueTask ShouldRetryInternalAsync(PipelineMessage message, Exception? exception) + => await ShouldRetryInternalSyncOrAsync(message, exception, async: true).ConfigureAwait(false); - private async ValueTask ShouldRetrySyncOrAsync(PipelineMessage message, Exception? exception, bool async) + private async ValueTask ShouldRetryInternalSyncOrAsync(PipelineMessage message, Exception? exception, bool async) { // If there was no exception and we got a success response, don't retry. if (exception is null && message.Response is not null && !message.Response.IsError) @@ -149,15 +149,15 @@ private async ValueTask ShouldRetrySyncOrAsync(PipelineMessage message, Ex if (async) { - return await ShouldRetryCoreAsync(message, exception).ConfigureAwait(false); + return await ShouldRetryAsync(message, exception).ConfigureAwait(false); } else { - return ShouldRetryCore(message, exception); + return ShouldRetry(message, exception); } } - protected virtual bool ShouldRetryCore(PipelineMessage message, Exception? exception) + protected virtual bool ShouldRetry(PipelineMessage message, Exception? exception) { if (message.RetryCount >= _maxRetries) { @@ -175,30 +175,21 @@ protected virtual bool ShouldRetryCore(PipelineMessage message, Exception? excep return isRetriable; } - protected virtual ValueTask ShouldRetryCoreAsync(PipelineMessage message, Exception? exception) - => new(ShouldRetryCore(message, exception)); + protected virtual ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) + => new(ShouldRetry(message, exception)); - internal TimeSpan GetNextDelay(PipelineMessage message, int tryCount) - => GetNextDelayCore(message, tryCount); - - protected virtual TimeSpan GetNextDelayCore(PipelineMessage message, int tryCount) + protected virtual TimeSpan GetNextDelay(PipelineMessage message, int tryCount) { // Default implementation is exponential backoff return TimeSpan.FromMilliseconds((1 << (tryCount - 1)) * _initialDelay.TotalMilliseconds); } - internal async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) - => await WaitCoreAsync(time, cancellationToken).ConfigureAwait(false); - - protected virtual async Task WaitCoreAsync(TimeSpan time, CancellationToken cancellationToken) + protected virtual async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) { await Task.Delay(time, cancellationToken).ConfigureAwait(false); } - internal void Wait(TimeSpan time, CancellationToken cancellationToken) - => WaitCore(time, cancellationToken); - - protected virtual void WaitCore(TimeSpan time, CancellationToken cancellationToken) + protected virtual void Wait(TimeSpan time, CancellationToken cancellationToken) { if (cancellationToken.WaitHandle.WaitOne(time)) { diff --git a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs index 81f783983065..2d2b2036be5d 100644 --- a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs +++ b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockRetryPolicy.cs @@ -25,11 +25,11 @@ public MockRetryPolicy(int maxRetries, Func? delayFactory) : base _delayFactory = delayFactory; } - public Exception? LastException { get; private set; } + public Exception? LastException { get; private set; } public bool ShouldRetryCalled { get; private set; } - public bool OnRequestSentCalled { get; private set; } + public bool OnRequestSentCalled { get; private set; } public bool OnSendingRequestCalled { get; private set; } @@ -42,20 +42,20 @@ public void Reset() OnRequestSentCalled = false; } - protected override bool ShouldRetryCore(PipelineMessage message, Exception? exception) + protected override bool ShouldRetry(PipelineMessage message, Exception? exception) { ShouldRetryCalled = true; LastException = exception; - return base.ShouldRetryCore(message, exception); + return base.ShouldRetry(message, exception); } - protected override ValueTask ShouldRetryCoreAsync(PipelineMessage message, Exception? exception) + protected override ValueTask ShouldRetryAsync(PipelineMessage message, Exception? exception) { ShouldRetryCalled = true; LastException = exception; - return base.ShouldRetryCoreAsync(message, exception); + return base.ShouldRetryAsync(message, exception); } protected override void OnRequestSent(PipelineMessage message) @@ -86,19 +86,19 @@ protected override ValueTask OnSendingRequestAsync(PipelineMessage message) return base.OnSendingRequestAsync(message); } - protected override TimeSpan GetNextDelayCore(PipelineMessage message, int tryCount) + protected override TimeSpan GetNextDelay(PipelineMessage message, int tryCount) { if (_delayFactory is not null) { return _delayFactory(tryCount); } - return base.GetNextDelayCore(message, tryCount); + return base.GetNextDelay(message, tryCount); } - public async Task WaitAsync(TimeSpan time, CancellationToken cancellationToken) - => await WaitCoreAsync(time, cancellationToken).ConfigureAwait(false); + public void DoWait(TimeSpan time, CancellationToken cancellationToken) + => Wait(time, cancellationToken); - public void Wait(TimeSpan time, CancellationToken cancellationToken) - => WaitCore(time, cancellationToken); + public async Task DoWaitAsync(TimeSpan time, CancellationToken cancellationToken) + => await WaitAsync(time, cancellationToken).ConfigureAwait(false); } diff --git a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs index 62abd37ace9a..e7bae2f7ac0d 100644 --- a/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs +++ b/sdk/core/System.ClientModel/tests/TestFramework/Mocks/MockSyncAsyncExtensions.cs @@ -77,11 +77,11 @@ public static async Task WaitSyncOrAsync(this MockRetryPolicy policy, TimeSpan d { if (isAsync) { - await policy.WaitAsync(delay, cancellationToken).ConfigureAwait(false); + await policy.DoWaitAsync(delay, cancellationToken).ConfigureAwait(false); } else { - policy.Wait(delay, cancellationToken); + policy.DoWait(delay, cancellationToken); } } }