diff --git a/ReleaseNotes.md b/ReleaseNotes.md index e3df12c17..460241423 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,33 +1,20 @@ -## October 2023 (version {0}) aka [Swiss Locomotive](https://en.wikipedia.org/wiki/SBB-CFF-FFS_Ae_6/6) release -> Codenamed as **[Swiss Locomotive](https://www.google.com/search?q=swiss+locomotive)** +## Hotfix release (version {0}) +> Default timeout vs the [Quality of Service](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html) feature -### Focused On -
- Logging feature. Performance review, redesign and improvements with new best practices to log +Special thanks to **Alvin Huang**, @huanguolin! - - Proposing a centralized `WriteLog` method for the `OcelotLogger` - - Factory methods for computed strings such as `string.Format` or interpolated strings - - Using `ILogger.IsEnabled` before calling the native `WriteLog` implementation and invoking string factory method -
-
- Quality of Service feature. Redesign and stabilization, and it produces less log records now. - - - Fixing issue with [Polly](https://www.thepollyproject.org/) Circuit Breaker not opening after max number of retries reached - - Removing useless log calls that could have an impact on performance - - Polly [lib](https://www.nuget.org/packages/Polly#versions-body-tab) reference updating to latest `8.2.0` with some code improvements -
-
- Documentation for Logging, Request ID, Routing and Websockets - - - [Logging](https://ocelot.readthedocs.io/en/latest/features/logging.html) - - [Request ID](https://ocelot.readthedocs.io/en/latest/features/requestid.html) - - [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html) - - [Websockets](https://ocelot.readthedocs.io/en/latest/features/websockets.html) -
-
- Testing improvements and stabilization aka bug fixing +### About +The bug is related to the **Quality of Service** feature (aka **QoS**) and the [HttpClient.Timeout](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout) property. +- If JSON `QoSOptions` section is defined in the route config, then the bug is masked rather than active, and the timeout value is assigned from the [QoS TimeoutValue](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html#quality-of-service:~:text=%22TimeoutValue%22%3A%205000) property. +- If the `QoSOptions` section **is not** defined in the route config or the [TimeoutValue](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html#quality-of-service:~:text=%22TimeoutValue%22%3A%205000) property is missing, then the bug is **active** and affects downstream requests that **never time out**. - - [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html) bug fixing: query string placeholders including **CatchAll** one aka `{{everything}}` and query string duplicates removal - - [QoS](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html) bug fixing: Polly circuit breaker exceptions - - Testing bug fixing: rare failed builds because of unstable Polly tests. Acceptance common logic for ports -
+### Technical info +In version [22.0](https://github.com/ThreeMammals/Ocelot/releases/tag/22.0.0), the bug was found in the explicit default constructor of the [FileQoSOptions](https://github.com/ThreeMammals/Ocelot/blob/main/src/Ocelot/Configuration/File/FileQoSOptions.cs) class with a maximum [TimeoutValue](https://github.com/ThreeMammals/Ocelot/blob/main/src/Ocelot/Configuration/File/FileQoSOptions.cs#L9). Previously, the default constructor was implicit with the default assignment of zero `0` to all `int` properties. + +The new explicit default constructor breaks the old implementation of [QoS TimeoutValue](https://github.com/ThreeMammals/Ocelot/blob/main/src/Ocelot/Requester/HttpClientBuilder.cs#L53-L55) logic, as our [QoS documentation](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html#quality-of-service:~:text=If%20you%20do%20not%20add%20a%20QoS%20section%2C%20QoS%20will%20not%20be%20used%2C%20however%20Ocelot%20will%20default%20to%20a%2090%20seconds%20timeout%20on%20all%20downstream%20requests.) states: +![image](https://github.com/ThreeMammals/Ocelot/assets/12430413/2c6b2cd3-e1c6-4510-9e46-883468c140ec)
+**Finally**, the "default 90 second" logic for `HttpClient` breaks down when there are no **QoS** options and all requests on those routes are infinite, if, for example, downstream services are down or stuck. + +#### The Bug Artifacts +- Reported bug issue: [1833](https://github.com/ThreeMammals/Ocelot/issues/1833) by @huanguolin +- Hotfix PR: [1834](https://github.com/ThreeMammals/Ocelot/pull/1834) by @huanguolin diff --git a/build.cake b/build.cake index 1e8f4a032..2b1c99828 100644 --- a/build.cake +++ b/build.cake @@ -512,10 +512,10 @@ Task("PublishToNuget") .Does(() => { Information("Skipping of publishing to NuGet..."); - // if (IsRunningOnCircleCI()) - // { - // PublishPackages(packagesDir, artifactsFile, nugetFeedStableKey, nugetFeedStableUploadUrl, nugetFeedStableSymbolsUploadUrl); - // } + if (IsRunningOnCircleCI()) + { + PublishPackages(packagesDir, artifactsFile, nugetFeedStableKey, nugetFeedStableUploadUrl, nugetFeedStableSymbolsUploadUrl); + } }); RunTarget(target);