{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":147747963,"defaultBranch":"main","name":"servicetalk","ownerLogin":"apple","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-09-07T00:14:48.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/10639145?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1724737482.0","currentOid":""},"activityList":{"items":[{"before":"57f84545fac54c7b3d565fbf3a6c3e64ad6e578c","after":"004983e93918e249ba19153f9a593218032c224b","ref":"refs/heads/main","pushedAt":"2024-09-19T15:06:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Scottmitch","name":"Scott Mitchell","path":"/Scottmitch","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7562868?s=80&v=4"},"commit":{"message":"HttpRequestMetaData#hasQueryParameter(String) implementaiton fix (#3058)\n\nMotivation:\r\nHttpRequestMetaData#hasQueryParameter(String) returns false when there is\r\na query parameter with no value. This is incorrect and it should return true.","shortMessageHtmlLink":"HttpRequestMetaData#hasQueryParameter(String) implementaiton fix (#3058)"}},{"before":"f269b08f095dc8935cba4bd3990fcadfd3aaee2e","after":"57f84545fac54c7b3d565fbf3a6c3e64ad6e578c","ref":"refs/heads/main","pushedAt":"2024-09-17T16:33:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"loadbalancer-experimental: don't always pay for EWMA with noop detector (#3057)\n\nMotivation:\r\n\r\nThere is a perf regression in the DefaultLB in compatibility mode compared to\r\nthe round-robin LB when under very high request rate and that is at least in part\r\nattributable to lock contention for the health indicator EWMA.\r\n\r\nModifications:\r\n\r\nDon't create a health indicator if the EWMA half life is 0.","shortMessageHtmlLink":"loadbalancer-experimental: don't always pay for EWMA with noop detect…"}},{"before":"9e310ccd5bd5d8207340ef302b8ab08a4e9ee299","after":"f269b08f095dc8935cba4bd3990fcadfd3aaee2e","ref":"refs/heads/main","pushedAt":"2024-09-10T15:52:07.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Make jsr305 api dependency for `servicetalk-annotations` (#3056)\n\nMotivation:\r\n\r\nIt's exposed on `@ElementsAreNonnullByDefault` and therefore should be\r\nan `api` dependency instead of `implementation`. It will also help us\r\nto avoid adding `com.google.code.findbugs:jsr305` dependency for every\r\nmodule that already adds `servicetalk-annotations`.\r\n\r\nModifications:\r\n\r\n- Change `api` to `implementation` for `com.google.code.findbugs:jsr305`\r\nin `servicetalk-annotations`;\r\n- Remove `com.google.code.findbugs:jsr305` from every module that\r\nalready adds `servicetalk-annotations`;\r\n- Regenerate lock files;","shortMessageHtmlLink":"Make jsr305 api dependency for servicetalk-annotations (#3056)"}},{"before":"249efc7776dcf99d00b131add2f2c3eddfb62c7e","after":"9e310ccd5bd5d8207340ef302b8ab08a4e9ee299","ref":"refs/heads/main","pushedAt":"2024-09-09T19:09:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Stop using `servicetalk-dependencies` internally (#3055)\n\nMotivation:\r\n\r\nGradle interprets `*.module` files differently than the `pom.xml`.\r\nBecause every module currently depends on `servicetalk-dependencies`,\r\nusers pulled its `dependencyConstraints` in their build configurations\r\nwith any servicetalk module as transitive dependency and got unintended\r\nchanges for other dependencies.\r\n\r\nFor example, `servicetalk-annotations` that has only jsr305 as a 3-party\r\ndependency still forces upgrade of jackson, protobuf, log4j, netty, and\r\njersey for users because it depends on `servicetalk-dependencies`.\r\n\r\nModifications:\r\n\r\n- Remove `servicetalk-dependencies` from every module, instead define\r\nevery necessary dependency by its version number or import only\r\nrequired boms;\r\n- Update `servicetalk-dependencies` to include missed dependencies:\r\nopentelemetry, instrumentation, resilience4j;\r\n- Correct dependencies for all `-jersery3` modules to keep only what\r\nthey use;\r\n- Move all `platform` dependencies from the top to their corresponding\r\nscope;\r\n- Regenerate lock files;\r\n\r\nResult:\r\n\r\nUsers don't get unintended dependency upgrades because of the `*.module`\r\nfile handling.","shortMessageHtmlLink":"Stop using servicetalk-dependencies internally (#3055)"}},{"before":"338e52e4c5c112ba611c0e849a3b159c993d28ea","after":"249efc7776dcf99d00b131add2f2c3eddfb62c7e","ref":"refs/heads/main","pushedAt":"2024-09-04T23:00:28.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"concurrent-api: save the timestamp of the SingleToFuture.get() calls (#3051)\n\nMotivation:\r\n\r\nIt can be very difficult to know if a thread is slow or completely\r\nstuck without taking multiple thread dumps and comparing them.\r\n\r\nModifications:\r\n\r\nTry to mitigate this by saving the time stamp of the last blocking\r\n`.get()` call. This should then show up in heap dumps and we can\r\nat least compare them to see if they've all started blocking at\r\nabout the same time or if there is a big spread. The latter would\r\nsuggest they are truly stuck.","shortMessageHtmlLink":"concurrent-api: save the timestamp of the SingleToFuture.get() calls (#…"}},{"before":"253d14fd897323471c9e1f8aa0c6faf14766ffcb","after":"338e52e4c5c112ba611c0e849a3b159c993d28ea","ref":"refs/heads/main","pushedAt":"2024-09-04T20:46:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Update Netty 4.1.112 -> 4.1.113 (#3054)","shortMessageHtmlLink":"Update Netty 4.1.112 -> 4.1.113 (#3054)"}},{"before":"f40d432707395d4248d1144de322de3a8a5c1052","after":"253d14fd897323471c9e1f8aa0c6faf14766ffcb","ref":"refs/heads/main","pushedAt":"2024-09-04T04:22:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"gardening: parameterize HttpObjectDecoderTest and subclasses (#3053)","shortMessageHtmlLink":"gardening: parameterize HttpObjectDecoderTest and subclasses (#3053)"}},{"before":"d7c17dfeea0d9de6f0a49f15cfa69de80f1d2e16","after":"2fd26c88351eb902b69e34fad2002e385947c089","ref":"refs/heads/gh-pages","pushedAt":"2024-08-27T05:44:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"Publish docs website 0.42","shortMessageHtmlLink":"Publish docs website 0.42"}},{"before":"b77cd148ec48c4a535c67785f4a555a63f5bb5f8","after":"f40d432707395d4248d1144de322de3a8a5c1052","ref":"refs/heads/main","pushedAt":"2024-08-27T05:44:39.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"Preparing for 0.42.49-SNAPSHOT development","shortMessageHtmlLink":"Preparing for 0.42.49-SNAPSHOT development"}},{"before":"372f108e7f5763aa5fe39b8f7b19b3ce163b924e","after":"b77cd148ec48c4a535c67785f4a555a63f5bb5f8","ref":"refs/heads/main","pushedAt":"2024-08-22T18:14:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Add Gradle Lock files (#2983)\n\nMotivation:\r\n\r\nLock files will help us see what dependencies are used by every module. When we bump any dependency, it will also show what transitive dependencies are upgraded automatically.\r\nSee: https://docs.gradle.org/current/userguide/dependency_locking.html \r\n\r\nModifications:\r\n\r\n- Update main `build.gradle` to activate dependency locking;\r\n- Add `check-lockfiles.sh` script for PRQ validation;\r\n- Add `ci-prq.yml` step to run `check-lockfiles.sh`;\r\n- Generate initial lockfiles;\r\n\r\nResult:\r\n\r\nWe will be able to observe how dependency updates change all transitive dependencies.","shortMessageHtmlLink":"Add Gradle Lock files (#2983)"}},{"before":"44a5b800704a8ea538c7323bbd9ac78104c3e71d","after":"372f108e7f5763aa5fe39b8f7b19b3ce163b924e","ref":"refs/heads/main","pushedAt":"2024-08-22T15:58:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"http-utils: cleanup the BeforeFinallyHttpOperator state (#3042)\n\nMotivation:\r\n\r\nThe BeforeFinallyHttpOperator has a few shortcomings\r\n\r\n- It doesn't honor the contract of calling the callbacks only once in the case of multiple subscribes.\r\n- It won't honor a cancel if in the PROCESSING_PAYLOAD state, which has some weird callback lifetime questions.\r\n\r\nModifications:\r\n\r\n- If we receive a cancellation on the Single before the message body has been subscribed, that counts as a cancel. Once the message body is subscribed ownership of the callbacks are fully transferred to that subscription.\r\n- Only the first body subscribe gets ownership of the callbacks.\r\n\r\nCo-authored-by: Idel Pivnitskiy ","shortMessageHtmlLink":"http-utils: cleanup the BeforeFinallyHttpOperator state (#3042)"}},{"before":"ed0265c389c6cf71d609c6d75a7fc244b820234a","after":"44a5b800704a8ea538c7323bbd9ac78104c3e71d","ref":"refs/heads/main","pushedAt":"2024-08-22T15:18:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"http-netty: fix JavaNetSoTimeoutHttpConnectionFilter leak (#3043)\n\nMotivation:\r\n\r\nThere is a resource leak in the JavaNetSoTimeoutHttpConnectionFilter\r\nrooted in the use of the `ambWith(..)` operator: if the response channel\r\nloses the race with the timer the resulting response will be dropped on\r\nthe floor along with it's hot `payloadBody()`.\r\n\r\nModifications:\r\n\r\nReplace the `ambWith(..)` with a custom operator that gives us the ability\r\nto cleanup a losing response while also giving us the correct latching\r\nbehavior between cancellation, timeout, and response pathways.","shortMessageHtmlLink":"http-netty: fix JavaNetSoTimeoutHttpConnectionFilter leak (#3043)"}},{"before":"80749306efd6d50e25c066c4328acf2ebb326e72","after":"ed0265c389c6cf71d609c6d75a7fc244b820234a","ref":"refs/heads/main","pushedAt":"2024-08-21T22:45:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"`ConnectablePayloadWriter`: avoid static exception that may leak memory (#3047)\n\nMotivation:\r\n\r\n`ConnectablePayloadWriter` uses a static `IOException` instance as a\r\nstate and can propagate it to `Subscriber`. This opens a possibility for\r\na memory leak if `Subscriber` or intermediate operators attach a\r\nsuppressed exception to this static instance.\r\n\r\nModifications:\r\n- Create `StacklessCancelledIOException` and always use a new instance\r\nin case of cancellation;\r\n- Keep `cancel()` noop if `outer.closed != null`;\r\n\r\nResult:\r\n\r\n`ConnectablePayloadWriter` can not leak memory via static exception\r\ninstance.","shortMessageHtmlLink":"ConnectablePayloadWriter: avoid static exception that may leak memo…"}},{"before":"edb05b56fc3c5773c549e4fba5bfdee5413db123","after":"80749306efd6d50e25c066c4328acf2ebb326e72","ref":"refs/heads/main","pushedAt":"2024-08-21T16:50:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Subscribable sources: try-catch `onSubscribe` and cleanup state if any (#3046)\n\nMotivation:\r\n\r\nAll original sources that implement `handleSubscribe` method should protect from a buggy `Subscriber` that may unexpectedly throw from `onSubscribe`. If they have any state or resource, it should be cleaned up.\r\n\r\nModifications:\r\n- Find all `Publisher`/`Single`/`Completable` that implement `handleSubscribe` and use `handleExceptionFromOnSubscribe` utility;\r\n\r\nThe following sources clean up their state on exception:\r\n- `FromInputStreamPublisher` closes `InputStream`;\r\n- `SpliceFlatStreamToMetaSingle` cancels upstream `Subscription`;\r\n- `TcpConnector` signals `ConnectionObserver.connectionClosed(t)`;\r\n- `TcpServerBinder` cancels bind `Future` and closes `Channel` if necessary;\r\n- `NettyChannelPublisher` registers `fatalError` and closes `Channel`;\r\n- `DefaultNettyConnection`, `ChannelInitSingle`, `H2ClientParentConnectionContext`, `H2ServerParentConnectionContext` close `Channel`;\r\n\r\nResults:\r\n\r\n1. Best effort to propagate exception via reactive flow.\r\n2. Cleaning up resources.","shortMessageHtmlLink":"Subscribable sources: try-catch onSubscribe and cleanup state if any ("}},{"before":"977ac05b43f552a62bac9a57877ae97e3c968da4","after":"edb05b56fc3c5773c549e4fba5bfdee5413db123","ref":"refs/heads/main","pushedAt":"2024-08-21T15:49:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"`Single.repeat`: use `TerminateRepeatException` as a terminal marker (#3045)\n\nMotivation:\r\n\r\nCurrently, `RepeatWhenSingle` uses its own static `END_REPEAT_EXCEPTION`\r\nobject as an end marker. That static exception does not discard\r\nsuppressed exceptions. If under any circumcises it unintentionally\r\nleaks, it may cause a memory leak if some path adds suppressed\r\nexceptions to it. Also, it's inconsistent with `RepeatStrategies`.\r\n\r\nModifications:\r\n\r\n- Use `RepeatStrategies.TerminateRepeatException` instead that discards\r\nsuppressed exceptions and doesn't write stacktrace.\r\n- Cache failed `Completable` with `TerminateRepeatException` instance\r\ninstead of allocating a new one on every repeat check.\r\n\r\nResult:\r\n\r\n1. Avoids static exception instance that may attach suppressed\r\nexceptions.\r\n2. Consistency between all repeat operators and strategies.","shortMessageHtmlLink":"Single.repeat: use TerminateRepeatException as a terminal marker (#…"}},{"before":"4d9ab772cff76ac905819dfe9d799ff9d95f3ba2","after":"977ac05b43f552a62bac9a57877ae97e3c968da4","ref":"refs/heads/main","pushedAt":"2024-08-16T15:02:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"Improve Single (+Completable) amb* documentation (#3044)","shortMessageHtmlLink":"Improve Single (+Completable) amb* documentation (#3044)"}},{"before":"f345761e64391ff3086634520ba07adf237fc877","after":"4d9ab772cff76ac905819dfe9d799ff9d95f3ba2","ref":"refs/heads/main","pushedAt":"2024-08-14T22:56:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Add `TransportConfig` to control low level transport settings (#3041)\n\nMotivation:\r\n\r\nUsers need a way to change low-level Netty settings, like\r\n`AdaptiveRecvByteBufAllocator` parameters. In the future, we can use\r\nthis interface for more similar settings without the need to change\r\nclient/server builder.\r\n\r\nModifications:\r\n\r\n- Add `TransportConfig` and `TransportConfigBuilder` in `transport-api`\r\nmodule;\r\n- Add methods on `SingleAddressHttpClientBuilder` and\r\n`HttpServerBuilder` to let users pass `TransportConfig`;\r\n- Wire it up to propagate to `Tcp[Client|Server]ChannelInitializer` as\r\n`TransportConfigInitializer`;\r\n\r\nResult:\r\n\r\nUsers can control `AdaptiveRecvByteBufAllocator` settings.","shortMessageHtmlLink":"Add TransportConfig to control low level transport settings (#3041)"}},{"before":"2316f7c7ee550c14ca1df03a82c9a1dd17d9f10c","after":"f345761e64391ff3086634520ba07adf237fc877","ref":"refs/heads/main","pushedAt":"2024-08-14T15:43:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"`SpliceFlatStreamToMetaSingle`: propagate cancel when races with data (#3036)\n\nMotivation:\r\n\r\nCancellation of the single may race with delivering the first element. If `cancel` wins, we already deliver `CancellationException` if someone subscribes to the payload publisher. However, if `cancel` arrives after `dataSubscriber.onSuccess(...)` and before someone subscribes to the payload publisher, it's a strong indicator that there was a race and `dataSubscriber` is not interested in it anymore. Therefore, we should pessimistically assume that nobody will ever subscribe to the payload publisher, cancel upstream subscription, and deliver `CancellationException` is someone still subscribes.\r\n\r\nModifications:\r\n- Cancel upstream subscription for both `null` and `PENDING` states if received data cancel;\r\n- Upwrap code around `parent.packer.apply` to assert that this path happens only if `CANCELED`;\r\n- Deliver `CancellationException` is someone still subscribes to the payload publisher after `CANCELED`;\r\n- Fix another bug: do not deliver `dataSubscriber.onError` if `metaSeenInOnNext == true` because it's already terminated (`CANCELED` does not play any role here);\r\n- Log more appropriate message if upstream delivers a terminal event after `payloadSubscriber` is already terminated (`EMPTY_COMPLETED_DELIVERED`);\r\n- Remove duplication around \"Duplicate Subscribers are not allowed\";\r\n\r\nResult:\r\n\r\nNetwork resources receive `cancel` signal and clean up connection state.","shortMessageHtmlLink":"SpliceFlatStreamToMetaSingle: propagate cancel when races with data ("}},{"before":"d09421ad812bf53da4e10b6cce01d968d72f1bb2","after":"2316f7c7ee550c14ca1df03a82c9a1dd17d9f10c","ref":"refs/heads/main","pushedAt":"2024-08-14T04:48:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"`Amb` operators for `Single` and `Completable` should respect reactive contract 2.3 (#3040)\n\nMotivation\r\n==========\r\nReactive Streams rule 2.3 mandates, that Subscriber.onComplete() and\r\nSubscriber.onError(Throwable t) MUST NOT call any methods on the\r\nSubscription or the Publisher.\r\n\r\nOur current amb operator implementation also performs a cancellation\r\non the Single that just completed, which violates the rule.\r\n\r\nModifications\r\n=============\r\nThis changeset modifies the amb operator in a way that all but the\r\none Single which got a termination signal (through onNext or onError)\r\nwill get the cancellation propagated.\r\n\r\nThe test suite is enhanced to cover this scenario, both for ambWith\r\nas well as the static amb factory methods.\r\n\r\nResult\r\n======\r\nThe amb* operator variants adhere to reactive streams 2.3 rule.\r\n\r\nCo-authored-by: Idel Pivnitskiy \r\nCo-authored-by: Bryce Anderson ","shortMessageHtmlLink":"Amb operators for Single and Completable should respect reactiv…"}},{"before":"2f2bf8594e69431354889232c36808a8c7c8eaff","after":"d09421ad812bf53da4e10b6cce01d968d72f1bb2","ref":"refs/heads/main","pushedAt":"2024-08-13T22:19:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"http-utils: fix leak in AbstractTimeoutHttpFilter (#3038)\n\nMotivation:\r\n\r\nThe Single.timeout(..) family of operations are part of a class of operations\r\nwill short-circuit the response based on the cancellation pathway, specifically\r\nthey will return a TimeoutException down the error path. Because cancellation\r\nand the result are intrinsically racy there is currently the possibility that\r\nthe result will be generated but we cannot return it to the subscriber having\r\nalready given them an Exception in the error pathway. For values that are\r\nstateful this can result in a resource leak. One such leak occurs in the\r\nAbstractTimeoutHttpFilter.\r\n\r\nModifications:\r\n\r\nModify the AbstractTimeoutHttpFilter to keep a handle on the resource and make\r\nsure we close it if we receive a cancellation. This is a localized fix but\r\nappears to be effective.\r\n\r\nResult:\r\n\r\nOne less leak.","shortMessageHtmlLink":"http-utils: fix leak in AbstractTimeoutHttpFilter (#3038)"}},{"before":"05371385da7aed36ea1ccb6d20665358f0895bc8","after":"2f2bf8594e69431354889232c36808a8c7c8eaff","ref":"refs/heads/main","pushedAt":"2024-08-13T18:03:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Improve `CancellationException` (#3039)\n\nMotivation:\r\n\r\n1. `H2ClientParentConnectionContext.StacklessCancellationException` was reused by `SpliceFlatStreamToMetaSingle`, which created a false impression in logs that this exception is related to HTTP/2.\r\n2. We should capture the Subscriber's stack-trace for `CancellationException` in `BeforeFinallyHttpOperator` instead of a netty stack-trace, it will help to debug paths that subscribe to the payload post cancel.\r\n\r\nModifications:\r\n\r\n1. Make `H2ClientParentConnectionContext.StacklessCancellationException` a top-level class.\r\n2. Wrap `CancellationException` with `Publisher.defer(...)` in `BeforeFinallyHttpOperator`.\r\n3. Add an exception message in `DefaultBlockingIterableProcessor`.\r\n\r\nResult:\r\n\r\nEasier for users to reason about received `CancellationException`.","shortMessageHtmlLink":"Improve CancellationException (#3039)"}},{"before":"565a278d4b2c800108acf8752824b7748ea513d3","after":"05371385da7aed36ea1ccb6d20665358f0895bc8","ref":"refs/heads/main","pushedAt":"2024-08-08T22:18:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"http-utils: fix leak in BeforeFinallyHttpOperator (#3034)\n\nMotivation:\r\n\r\nBeforeFinallyHttpOperator has the option to short-circuit and not\r\nemit a response if it has been cancelled. However, the response has\r\na (potentially) stateful body that needs to be cleaned up and this\r\nisn't done if we happen to get an onSuccess after cancellation (which\r\nis an intrinsic race in RS).\r\n\r\nModifications:\r\n\r\n- Always cleanup the response body if we receive it after a\r\ncancellation.\r\n\r\nResult:\r\n\r\nOne less response body leak.","shortMessageHtmlLink":"http-utils: fix leak in BeforeFinallyHttpOperator (#3034)"}},{"before":"45fc8f4b9af788b99adf4e3823961fac59944686","after":"565a278d4b2c800108acf8752824b7748ea513d3","ref":"refs/heads/main","pushedAt":"2024-08-06T16:05:07.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Disable `fail-fast` on GitHub Actions for snapshot and release pipelines (#3018)\n\nMotivation:\r\n\r\nWe always use 2 pipelines for snapshots and releases (JDK8 and JDK11)\r\nbecause those build and publish different set of modules. Because they\r\nare independent, we should not fail another one if any of them fail.","shortMessageHtmlLink":"Disable fail-fast on GitHub Actions for snapshot and release pipeli…"}},{"before":"52d68b08b369b64c8f7cbbe4fa7b1a48b9b5ca61","after":"45fc8f4b9af788b99adf4e3823961fac59944686","ref":"refs/heads/main","pushedAt":"2024-08-06T08:27:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"capacity-limiter-api: add GradientCapacityLimiterTest (#3032)\n\nMotivation:\r\n\r\nWe have have any specific tests for the gradient capacity limiter.\r\n\r\nModifications:\r\n\r\nAdd a test class with a few starter tests. We can add more tests\r\nfrom there.","shortMessageHtmlLink":"capacity-limiter-api: add GradientCapacityLimiterTest (#3032)"}},{"before":"893a15637ac85945963eaaf3b0b9c41bf0f83f5b","after":"52d68b08b369b64c8f7cbbe4fa7b1a48b9b5ca61","ref":"refs/heads/main","pushedAt":"2024-08-06T08:12:40.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"capacity-limiter-api: polish javadocs and minor code modifications (#3031)","shortMessageHtmlLink":"capacity-limiter-api: polish javadocs and minor code modifications (#…"}},{"before":"9f68119dcdf120509108376c4eb41a85eec1ad57","after":"893a15637ac85945963eaaf3b0b9c41bf0f83f5b","ref":"refs/heads/main","pushedAt":"2024-08-05T15:10:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"capacity-limiter-api: avoid division in EMA (#3030)\n\nMotivation:\r\n\r\nDivision is much more expensive than multiplication, certainly when\r\nthe compliler doesn't know the denominator and can do tricks to mitigate.\r\n\r\nModifications:\r\n\r\nIn the capacity limiter EMA we have a division operation where the\r\ndenominator is always the same which is a good candidate for inverting\r\nonce and turning into a multiplication operation.","shortMessageHtmlLink":"capacity-limiter-api: avoid division in EMA (#3030)"}},{"before":"4e7d64e0df08d591d7b677aec89b9912616c7796","after":"9f68119dcdf120509108376c4eb41a85eec1ad57","ref":"refs/heads/main","pushedAt":"2024-08-02T08:32:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daschl","name":"Michael Nitschinger","path":"/daschl","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/29086?s=80&v=4"},"commit":{"message":"Encode/Decode grpc-message status per spec (#3023)\n\nMotivation\r\n----------\r\nAt the moment a grpc status message is not percent-encoded which\r\nthe spec mandates. This is not a problem as long as regular printable\r\nASCII characters are used, but other ranges mandate a percent encoding\r\non the wire.\r\n\r\nModifications\r\n-------------\r\nThis changeset implements the percent encoding/decoding for the\r\ngrpc status message and transparently applies it in the places\r\nwhere the ServiceTalk codebase would access the header previously.\r\n\r\nThe implementation is strongly aligned on the io.grpc equivalent\r\nin order to ensure maximum compatibility across systems.\r\n\r\nResult\r\n------\r\nProperly percent-encoded/decoded grpc-message payload when non\r\nASCII-printable characters are sent.","shortMessageHtmlLink":"Encode/Decode grpc-message status per spec (#3023)"}},{"before":"21c0a74be852e290727f9517e96b5e802443a44e","after":"4e7d64e0df08d591d7b677aec89b9912616c7796","ref":"refs/heads/main","pushedAt":"2024-07-31T17:07:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bryce-anderson","name":"Bryce Anderson","path":"/bryce-anderson","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2948506?s=80&v=4"},"commit":{"message":"capacity-limiter-api: make AimdCapacityLimiter use ReentrantLock (#3025)\n\nMotivation:\r\n\r\nRight now AimdCapacityLimiter uses a custom spin-lock whereas\r\nmost everywhere else we use a ReentrantLock if locking is necessary.\r\n\r\nModifications:\r\n\r\nConvert it to a ReentrantLock.\r\n\r\nResult:\r\n\r\nMore uniformity.","shortMessageHtmlLink":"capacity-limiter-api: make AimdCapacityLimiter use ReentrantLock (#3025)"}},{"before":"b3f8d5614d4c84da17145cbdb15d80ec774ef2dd","after":"21c0a74be852e290727f9517e96b5e802443a44e","ref":"refs/heads/main","pushedAt":"2024-07-31T16:27:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"Properly drain failed responses in http-service-composition example (#3026)\n\nMotivation:\r\n\r\nExisting `ResponseCheckingClientFilter` demonstrated in\r\n`servicetalk-http-service-composition` maps the response to an\r\nexception, but does not drain the response payload body, leaking the\r\nconnection.\r\n\r\nModifications:\r\n\r\n- Replace `ResponseCheckingClientFilter` with\r\n`RetryingHttpRequesterFilter.Builder.requestMapper` feature;\r\n- Rename `BadResponseHandlingServiceFilter` to\r\n`HttpResponseExceptionHandlingServiceFilter` and update it to target\r\n`HttpResponseException` instead of `BadResponseStatusException`;\r\n\r\nResult:\r\n\r\nWe don't show users how to leak a connection :)","shortMessageHtmlLink":"Properly drain failed responses in http-service-composition example (#…"}},{"before":"1c2afec09b6e41410827061cc468b64eb4571ade","after":"b3f8d5614d4c84da17145cbdb15d80ec774ef2dd","ref":"refs/heads/main","pushedAt":"2024-07-31T01:00:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"idelpivnitskiy","name":"Idel Pivnitskiy","path":"/idelpivnitskiy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3968288?s=80&v=4"},"commit":{"message":"`ci-netty-snapshot.yml`: remove Alpha number (#3027)\n\nWithout the number we will always take the latest AlphaN version.","shortMessageHtmlLink":"ci-netty-snapshot.yml: remove Alpha number (#3027)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEuwLmXgA","startCursor":null,"endCursor":null}},"title":"Activity · apple/servicetalk"}