All Versions
146
Latest Version
Avg Release Cycle
29 days
Latest Release
5 days ago

Changelog History
Page 3

  • v18.10.0

    🗄 Deprecations

    
    * 🚚 finagle-core: Deprecation warnings have been removed from the 'status', 'onClose',
      and 'close' methods on `c.t.f.t.Transport`, and added to the corresponding methods
      on `c.t.f.t.TransportContext`. ``PHAB_ID=D221528``
    
    ⚙ Runtime Behavior Changes
    
    • finagle-netty3: Implementations for 'status', 'onClose', and 'close' methods have been moved from c.t.f.n.t.ChannelTransportContext to c.t.f.n.t.ChannelTransport. PHAB_ID=D221528
  • v18.9.1

    💥 Breaking API Changes

    
    * 0️⃣ finagle-base-http: `DefaultHeaderMap` now validates HTTP Header names and
      values in `add` and `set`. `addUnsafe` and `setUnsafe` have been created to
      allow adding and setting headers without validation. ``PHAB_ID=D217035``
    
    * 🚚 finagle-core: Remove slow host detection from `ThresholdFailureDetector`.
      ``PHAB_ID=D210015``
    
    ⚙ Runtime Behavior Changes
    
    • 👻 finagle-core: When Finagle would exhaust a retry budget with an exception that was not a FailureFlags, previously it would wrap that exception with a non-retryable failure. This lead to surprising behavior for users. Those exceptions will no longer be wrapped. PHAB_ID=D216281

    • finagle-http: The finagle HTTP clients and servers now consider a Retry-After: 0 header to be a retryable nack. Servers will set this header when the response is a retryable failure, and clients will interpret responses with this header as a Failure.RetryableNackFailure. PHAB_ID=D216539

  • v18.9.0

    🆕 New Features

    
    * finagle-core: `c.t.f.FailureFlags` is now a public API. This is Finagle's
      API for attaching metadata to an exception. As an example this is used to
      check if an exception is known to be safe to retry. Java compatibility has
      also been added. ``PHAB_ID=D202374``
    
    * finagle-core: Introducing StackTransformer, a consistent mechanism for
      accessing and transforming the default ServerStack. ``PHAB_ID=D207980``
    
    * 🔧 finagle-netty4: Allow sockets to be configured with the [SO_REUSEPORT](https://lwn.net/Articles/542629/) option
      when using native epoll, which allows multiple processes to bind and accept connections
      from the same port. ``PHAB_ID=D205535``
    
    💥 Breaking API Changes
    
    • finagle: c.t.io.Reader and c.t.io.Writer are now abstracted over the type they produce/consume (Reader[A] and Writer[A]) and are no longer fixed to Buf. PHAB_ID=D195638

    • 👀 finagle-core: Address.hashOrdering now takes a seed parameter and PeerCoordinate.setCoordinate does not take a peerOffset any longer. PHAB_ID=D199545

    • 🚚 finagle-core: Removed deprecated members c.t.f.Failure.{Interrupted, Ignorable, DeadlineExceeded, Rejected, NonRetryable, flagsOf}. PHAB_ID=D199361

    • finagle-core: SingletonPool now takes an additional parameter which indicates if interrupts should propagate to the underlying resource. PHAB_ID=D205433

    • 🚚 finagle-core: Remove TimeoutFactory.Role in favor of passing a role to the module function. Since this module is a re-used within the client stack, it needs unique identifiers for each distinct module. PHAB_ID=D204647

    • finagle-core: the valid range for the argument to WindowedPercentileHistogram.percentile is now [0.0..1.0], e.g., 0.95 means 95th percentile. PHAB_ID=D198915

    • 🚚 finagle-mux: The old pull-based mux implementations have been removed. PHAB_ID=D208737

    • finagle-netty3: The type of context of a ChannelTransport has been changed from a LegacyContext to a ChannelTransportContext. PHAB_ID=D205473

    • finagle-netty4: The type of context of a ChannelTransport has been changed from a Netty4Context to a ChannelTransportContext. PHAB_ID=D205794

    • 🚚 finagle-netty4: c.t.f.netty4.param.useUnpoolledByteBufAllocator flag has been removed. There is no good reason to opt-out of a more efficient, pooled allocator. PHAB_ID=D212097

    • finagle-thrift: DeserializeCtx became ClientDeserializeCtx for client side response classification, add ServerDeserializeCtx to handle server side response classification. PHAB_ID=D196032

    • 📇 finagle-serversets: ZkMetadata.shardHashOrdering now takes a seed parameter. PHAB_ID=D199545

    🐛 Bug Fixes

    
    * finagle-thrift: Thrift clients created via `.servicePerEndpoint` now propagate exceptions
      appropriately when the method return type is void. ``PHAB_ID=D200690``
    
    * finagle-thrift, finagle-thriftmux: Response classification is enabled in server side.
      ``PHAB_ID=D196032``
    
    ⚙ Runtime Behavior Changes
    
    • finagle-memcached: A Memcached client (c.t.f.Memcached.Client) is now backed by a more efficient, push-based implementation. PHAB_ID=D208047

    • 🐧 finagle-netty4: Finagle's Netty 4 implementation now defaults to use Linux's native epoll transport, when available. Run with -com.twitter.finagle.netty4.useNativeEpoll=false to opt out. PHAB_ID=D208088

  • v18.8.0

    🆕 New Features

    
    * finagle-core: Introducing the new `c.t.f.tracing.Tracing` API for more efficient tracing
      (dramatically reduces the number of context lookups; see scaladoc for `c.t.f.tracing.Trace`).
      ``PHAB_ID=D190670``
    
    * finagle-core: `c.t.f.tracing.Trace` facade API now provides forwarding `record` methods for
      all kinds of annotations and is a preffered way of recording traces. ``PHAB_ID=D192598``
    
    * finagle-thriftmux: Promote the push-based ThriftMux implementation out of experimental
      status.``PHAB_ID=D189187``
    
    💥 Breaking API Changes
    
    • 🚚 finagle-base-http: c.t.f.http.cookie.exp.supportSameSiteCodec has been moved out of the exp package to c.t.f.http.cookie.supportSameSiteCodec. PHAB_ID=D196517

    • finagle-core: Parameter-less annotation classes (c.t.f.tracing.Annotation) have been promoted to objects for efficiency reasons. PHAB_ID=D192598

    • finagle-core: c.t.f.tracing.Trace.record(Record) now accepts the record argument by value (previously by name). PHAB_ID=D193300

    • finagle-core: c.t.f.Failure.{Restartable, Interrupted, Ignorable, DeadlineExceeded, Wrapped, Rejected, NonRetryable} are deprecated in favor of the c.t.f.FailureFlags analogs. PHAB_ID=D195647

    • finagle-core: c.t.f.Leaf and c.t.f.Node are now private; use Stack.leaf and Stack.node instead. PHAB_ID=D195924

    • finagle-core: Marked transform in com.twitter.finagle.Stack as protected. It is too powerful and unnecessary for users, and should be for implementor use only. PHAB_ID=D195938

    • finagle-mysql: c.t.f.mysql.CanBeParameter's implicit conversions timestampCanBeParameter, sqlDateCanBeParameter, and javaDateCanBeParameter have been consolidated into a single implicit, dateCanBeParameter. PHAB_ID=D195351

    🐛 Bug Fixes

    
    * 🛠 finagle-http2: Fixed a race condition caused by c.t.f.http.transport.StreamTransports being
      closed, but that status not being reflected right away, causing a second request to fail.
      ``PHAB_ID=D198198``
    
    ⚙ Runtime Behavior Changes
    
    • finagle-core: c.t.f.tracing.Trace API is no longer guarding Trace.record calls behind Trace.isActivelyTracing. Add Trace.isActivelyTracing guards on the call sites if materializing tracing annotations is a performance concern. PHAB_ID=D193300

    • ⏪ finagle-mysql: Clients will now issue a ROLLBACK each time a service is checked back into the connection pool. This can be disabled via Mysql.Client.withNoRollback. PHAB_ID=D196673

    • ✅ finagle-thriftmux: The push-based server muxer is now the default. In both synthetic tests and production it has shown signifcant performance benefits and is simpler to maintain. PHAB_ID=D193630

    • 🚚 finagle-mysql: Remove deprecated TimestampValue.apply(Timestamp) and TimestampValue.unapply(value) methods. Use TimestampValue.apply(TimeZone, TimeZone) instead. PHAB_ID=D182920

    🗄 Deprecations

    
    * 🗄 finagle-mux: The pull based mux implementation, c.t.f.Mux, has been deprecated in favor of
      the push-based mux implementation, c.t.f.pushsession.MuxPush. ``PHAB_ID=D193630``
    
  • v18.7.0

    🆕 New Features

    
    * finagle-core: Promote the push-based API's out of experimental. For protocols that
      have eager read paths, for example multiplexed protocols and non-streaming clients,
      a push-based protocol implementation can provide significant performance benefits
      by avoiding the impedance mismatch between the underlying Netty framework and the
      pull-based Transport model. ``PHAB_ID=D189187``
    
    * 0️⃣ finagle-core: There is now an implicit instance for Finagle's default timer:
      `DefaultTimer.Implicit`. ``PHAB_ID=D185896``
    
    * finagle-core: Introduce new command-line flag `c.t.f.tracing.enabled` to entirely
      disable/enable tracing for a given process (default: `true`).  ``PHAB_ID=D186557``
    
    * finagle-mux: Promote the push-based Mux implementation out of experimental status.
      ``PHAB_ID=D189187``
    
    * finagle-mysql: `com.twitter.util.Time` can now be used with
      `PreparedStatement`s without converting the `ctu.Time` to a `java.sql.Timestamp`.
      ``PHAB_ID=D182973``
    
    * 👕 finagle-stats: Adds a lint rule to detect when metrics with colliding names are used.
      ``PHAB_ID=D183494``
    
    * 🔧 finagle-core: Client side `NackAdmissionFilter` can now be configured more easily by
      calling `$client.withAdmissionControl.nackAdmissionControl(window, threshold)`.
      ``PHAB_ID=D188877``
    
    * finagle-thrift: Trait c.t.scrooge.ThriftService is now c.t.finagle.thrift.ThriftService.
      Scrooge generated service objects now all inherit from c.t.finagle.thrift.GeneratedThriftService.
      ``PHAB_ID=D180341``
    
    💥 Breaking API Changes
    
    • finagle-core: c.t.f.dispatch.ClientDispatcher.wrapWriteException has been turned from a partial function instance into a static total function. PHAB_ID=D189639

    • finagle-mux: ClientDiscardedRequestException now extends FailureFlags and is no longer a case class. PHAB_ID=D183456

    🐛 Bug Fixes

    
    * finagle-core: `c.t.f.filter.NackAdmissionFilter` is now aware of `FailureFlags` encoded
      failures. ``PHAB_ID=D193390``
    
    * finagle-mux: Mux's server dispatcher is now aware of `FailureFlags` encoded failures.
      ``PHAB_ID=D193456``
    
    ⚙ Runtime Behavior Changes
    
    • finagle-core: Server-side rejections from c.t.f.filter.RequestSempahoreFilter.module are now captured by c.t.f.service.StatsFilter. They will roll up under "/failures", "/failures/rejected", and "/failures/restartable" in stats. PHAB_ID=D187127

    • finagle-core: c.t.f.tracing.Trace.tracers now returns only distinct tracers stored in the local context (returned all tracers before). PHAB_ID=D188389

    • finagle-http: HTTP param decoding is no longer truncated to 1024 params. PHAB_ID=D190113

    • finagle-mux: When mux propagates an interrupt started by BackupRequestFilter over the network, the FailureFlags.Ignorable status is propagated with it. PHAB_ID=D183456

  • v18.6.0

    ⚙ Runtime Behavior Changes

    
    * 0️⃣ finagle-core: By default, the deterministic aperture load balancer doesn't expand
      based on the loadband. This is because the loadband is influenced by a degree of
      randomness, and this breaks the deterministic part of deterministic aperture and
      can lead to aggressive banding on backends. ``PHAB_ID=D180922``
    
    * finagle-http2: Unprocessed streams are retryable in case of GOAWAY.
      ``PHAB_ID=D174401``
    
    🆕 New Features
    
    • finagle-core: Add PropagateDeadlines Stack.Param to TimeoutFilter for disabling propagation of deadlines to outbound requests. PHAB_ID=D168405

    • finagle-core: Add toString implementations to c.t.finagle.Service and c.t.finagle.Filter. Update in Filter#andThen composition to expose a useful toString for composed Filters and a composed Service (a Filter chain with a terminal Service or ServiceFactory).

    The default implementation for Filter and Service is getClass.getName. When composing filters, the andThen composition method correctly tracks the composed parts to produce a useful toString, e.g.,

    .. code-block:: scala

    package com.foo

    import com.twitter.finagle.{Filter, Service} import com.twitter.util.Future

    class MyFilter1 extends Filter[Int, Int, Int, Int] { def apply(request: Int, service: Service[Int, Int]): Future[Int] = ??? }

    .. code-block:: scala

    package com.foo

    import com.twitter.finagle.{Filter, Service} import com.twitter.util.Future

    class MyFilter2 extends Filter[Int, Int, Int, Int] { def apply(request: Int, service: Service[Int, Int]): Future[Int] = ??? }

    .. code-block:: scala

    val filters = (new MyFilter1).andThen(new MyFilter2)

    filters.toString would emit the String "com.foo.MyFilter1.andThen(com.foo.MyFilter2)"

    If a Service (or ServiceFactory) were then added:

    .. code-block:: scala

    import com.twitter.finagle.{Filter, Service} import com.twitter.finagle.service.ConstantService import com.twitter.util.Future

    ...

    val svc: Service[Int, Int] = filters.andThen(new ConstantService[Int, Int](Future.value(2)))

    Then, svc.toString would thus return the String: "com.foo.MyFilter1.andThen(com.foo.MyFilter2).andThen(com.twitter.finagle.service.ConstantService(ConstFuture(2)))"

    Filter implementations are permitted to override their toString implementations which would 0️⃣ replace the default of getClass.getName. PHAB_ID=D172526

    • finagle-core: Make Filter.TypeAgnostic an abstract class for Java usability. PHAB_ID=D172716

    • finagle-core: c.t.f.filter.NackAdmissionFilter is now public. PHAB_ID=D177322

    • finagle-core: Extended c.t.f.ssl.KeyCredentials and c.t.f.ssl.TrustCredentials to work with javax.net.ssl.KeyManagerFactory and javax.net.ssl.TrustManagerFactory respectively. PHAB_ID=D177484

    💥 Breaking API Changes

    
    * finagle-core: Rename `DeadlineFilter.Param(maxRejectFraction)` to
      `DeadlineFilter.MaxRejectFraction(maxRejectFraction)` to reduce confusion
      when adding additional params.
      ``PHAB_ID=D172402``
    
    
    🐛 Bug Fixes
    
    • finagle-http2: StreamTransportFactory now marks itself as dead/closed when it runs out of HTTP/2 stream IDs instead of stalling. This allows the connection to be closed/reestablished in accordance with the spec PHAB_ID=D175898

    • finagle-netty4: SslServerSessionVerifier is now supplied with the proper peer address rather than Address.failing. PHAB_ID=D168334

    • 0️⃣ finagle-thrift/thriftmux: Disabled client side per-endpoint stats by default for client ServicePerEndpoint. It can be set via c.t.f.thrift.RichClientParam or a with-method as Thrift{Mux}.client.withPerEndpointStats. PHAB_ID=D169427

    • finagle-netty4: Avoid NoClassDefFoundError if netty-transport-native-epoll is not available on the classpath.

  • v18.5.0

    🆕 New Features

    
    * finagle-base-http: Added ability to add SameSite attribute to Cookies to
      comply with https://tools.ietf.org/html/draft-west-first-party-cookies-07.
      The attribute may be set in the constructor via the `c.t.f.http.Cookie`
      `sameSite` param or via the `c.t.f.http.Cookie.sameSite` method. ``PHAB_ID=D157942``
    
      - Pass `SameSite.Lax` to the `Cookie` to add the "Lax" attribute.
      - Pass `SameSite.Strict` to the `Cookie` to add the "Strict" attribute.
    
    * finagle-base-http: Introduced an API to extract query string params from a
      `c.t.f.http.Request`, `c.t.f.http.Uri.fromRequest` and `c.t.f.http.Uri#params`.
      ``PHAB_ID=D160298``
    
    * finagle-mysql: Added APIs to `Row` which simplify the common access pattern.
      For example, `Row.stringOrNull(columnName: String): String` and
      `Row.getString(columnName: String): Option[String]`.
      ``PHAB_ID=D156926``, ``PHAB_ID=D157360``
    
    * finagle-mysql: Added `read` and `modify` APIs to `c.t.f.mysql.Client` and
      `c.t.f.mysql.PreparedStatement` for that return the specific type of
      `Result` for those operations, `ResultSet` and `OK` respectively.
      ``PHAB_ID=D160215``
    
    * finagle-serversets: Zk2Session's AsyncSemaphore which controls the maximum
      concurrent Zk operations is configurable (GlobalFlag c.t.f.serverset2.zkConcurrentOperations).
      ```PHAB_ID=D157709```
    
    * finagle-mysql: Address `CursoredStatement` usability from Java via
      `CursoredStatement.asJava()`. Through this, you can use the API with
      varargs and Java 8 lambdas. ``PHAB_ID=D158399``
    
    * finagle-toggle: Improved Java compatibility for `ToggleMap` and `Toggle`. ``PHAB_ID=D164489``
    
    * finagle-toggle: `StandardToggleMap.apply` and `StandardToggleMap.registeredLibraries` now
      use `ToggleMap.Mutable` to better support mutating the underlying mutable `ToggleMap`.
      ``PHAB_ID=D167046``
    
    💥 Breaking API Changes
    
    • finagle-mux: With the introduction of the push-based mux client, we've removed the need for the optimized c.t.f.Mux.Netty4RefCountingControl MuxImpl, which has been removed. PHAB_ID=D141010

    • finagle-mysql: c.t.f.mysql.Client.ping now returns a Future[Unit] instead of the broad Future[Result] ADT. PHAB_ID=D160215

    • finagle-toggle: Changed ToggleMap.Mutable from a trait to an abstract class, and ToggleMap.Proxy no longer extends ToggleMap, but now has a self-type that conforms to ToggleMap instead. PHAB_ID=D164489

    ⚙ Runtime Behavior Changes

    
    * 👍 finagle-core: Add `c.t.f.SslException` to better model exceptions related to SSL/TLS.
      The `c.t.f.ChannelException.apply` method will now wrap `javax.net.ssl.SSLException`s in
      `c.t.f.SslException`. ``PHAB_ID=D158344``
    
    * finagle-core: MethodBuilder metrics now include failures.
      ``PHAB_ID=D167589``, ``PHAB_ID=D168095``
    
    * finagle-http: ServerAdmissionControl is circumvented for HTTP requests that have
      a body unless the request contains the header 'finagle-http-retryable-request' since
      it cannot be known whether the client can actually retry them, potentially resulting
      in depressed success rates during periods of throttling. ``PHAB_ID=D134209``
    
    * ⬆️ finagle-http2: Clients and servers no longer attempt a cleartext upgrade if the
      first request of the HTTP/1.1 session has a body. ``PHAB_ID=D153986``
    
    * 0️⃣ finagle-thriftmux: The push-based client muxer is now the default muxer implementation.
      The push-based muxer has better performance and a simpler architecture. ``PHAB_ID=D158134``
    
    * finagle-toggle: `ToggleMap.Proxy#underlying` is now public, and `ToggleMap.Proxy`
      participates in `ToggleMap.components`. ``PHAB_ID=D167046``
    
    🐛 Bug Fixes
    
    • 0️⃣ finagle-base-http: Concurrent modification of the c.t.f.http.DefaultHeaderMap could result in an infinite loop due to HashMap corruption. Access is now synchronized to avoid the infinite loop. PHAB_ID=D159250

    • finagle-core: FailureFlags that have their flags set modified will now retain the original stack trace, suppressed Throwables, and cause when possible. PHAB_ID=D160402

    • 👍 finagle-memcached: Added the missing support for partial success for the batch operations in the new PartitioningService based Memcached client. PHAB_ID=D161249

    • 🚚 finagle-thrift: Removed copied libthrift files. PHAB_ID=D165455

    • 0️⃣ finagle-thrift/thriftmux: Server side per-endpoint statsFilter by default is disabled now. It can be set via c.t.f.thrift.RichServerParam or a with-method as Thrift{Mux}.server.withPerEndpointStats. PHAB_ID=D167433

  • v18.4.0

    🆕 New Features

    
    * finagle-core: `c.t.f.filter.NackAdmissionFilter` can now be disabled via a `with`-method.
      `$Protocol.client.withAdmissionControl.noNackAdmissionControl` ``PHAB_ID=D146873``
    
    * finagle-mysql: Exceptions now include the SQL that was being executed when possible.
      ``PHAB_ID=D150503``
    
    * finagle-mysql: Address `PreparedStatement` usability from Java via
      `PreparedStatement.asJava()`. Through this, you can use the API with
      varargs and Java 8 lambdas. ``PHAB_ID=D156755``
    
    * 👍 finagle-mysql: Added support for `Option`\s to `Parameter` implicits. This
      allows for the natural representation of nullable columns with an `Option`
      where a `None` is treated as a `null`. ``PHAB_ID=D156186``
    
    * finagle-netty4: Add 'tls/connections' gauge for Finagle on Netty 4 which tracks the number
      of open SSL/TLS connections per Finagle client or server.
      ``PHAB_ID=D144184``
    
    * 👍 finagle-redis: Support has been added for a number of new cluster commands
      introduced in Redis 3.0.0. ``PHAB_ID=D152186``
    
    🐛 Bug Fixes
    
    • finagle-mysql: Fix handling of interrupts during transactions. PHAB_ID=D154441

    💥 Breaking API Changes

    
    * 🚚 finagle-core: `c.t.f.ssl.client.HostnameVerifier` has been removed since it was using
      `sun.security.util.HostnameChecker` which is no longer accessible in JDK 9.
      ``PHAB_ID=D144149``
    
    * ⬆️ finagle-thrift: Upgraded libthrift to 0.10.0, `c.t.f.thrift.Protocols.TFinagleBinaryProtocol`
      constructor now takes `stringLengthLimit` and `containerLengthLimit`, `NO_LENGTH_LIMIT` value
      changed from 0 to -1. ``PHAB_ID=D124620``
    
    * 🚚 finagle-thrift: Move "stateless" methods in `c.t.finagle.thrift.ThriftRichClient`
      to `c.t.finagle.thrift.ThriftClient`. Then mix the `ThriftClient` trait into the
      ThriftMux and Thrift Client companions to make it clearer that these stateless methods
      are not affected by the changing state of the configured client instance but are instead
      simply utility methods which convert or wrap the incoming argument. ``PHAB_ID=D143185``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.value_=`; use `c.t.f.Cookie.value`
      instead. ``PHAB_ID=D148266``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.domain_=`; use `c.t.f.Cookie.domain`
      instead. ``PHAB_ID=D148266``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.path_=`; use `c.t.f.Cookie.path`
      instead. ``PHAB_ID=D148266``
    
    ⚙ Runtime Behavior Changes
    
    • finagle-core: Add minimum request threshold for successRateWithinDuration failure accrual. PHAB_ID=D154129

    • finagle-core: c.t.f.filter.NackAdmissionFilter no longer takes effect when the client's request rate is too low to accurately update the EMA value or drop requests. PHAB_ID=D143996

    • finagle-core: SSL/TLS client hostname verification is no longer performed by c.t.f.ssl.client.HostnameVerifier. The same underlying library sun.security.util.HostnameChecker is used to perform the hostname verification. However it now occurs before the SSL/TLS handshake has been completed, and the exception on failure has changes from a c.t.f.SslHostVerificationException to a javax.net.ssl.CertificateException. PHAB_ID=D144149

    • finagle-core: Closing c.t.f.NullServer is now a no-op. PHAB_ID=D156098

    • 0️⃣ finagle-netty4: Netty ByteBuf leak tracking is enabled by default. PHAB_ID=D152828

    🗄 Deprecations

    
    * 🗄 finagle-thrift: System property "-Dorg.apache.thrift.readLength" is deprecated. Use
      constructors to set read length limit for TBinaryProtocol.Factory and TCompactProtocol.Factory.
      ``PHAB_ID=D124620``
    
  • v18.3.0

    🆕 New Features

    
    * finagle-core: `c.t.f.client.BackupRequestFilter.filterService` for wrapping raw services in a
      `c.t.f.client.BackupRequestFilter` is now public. ``PHAB_ID=D135484``
    
    * finagle-core: Introduce `c.t.f.Stacks.EMPTY_PARAMS` for getting an empty Param map from
      Java, and `c.t.f.Stack.Params.plus` for easily adding Params to a Param map from Java.
      ``PHAB_ID=D139660``
    
    🐛 Bug Fixes
    
    • finagle-core: c.t.f.liveness.FailureAccrualFactory takes no action on c.t.f.Failure.Ignorable responses. PHAB_ID=D135435

    • finagle-core: c.t.f.pool.WatermarkPool is resilient to multiple closes on a service instance. PHAB_ID=D137198

    • finagle-core: c.t.f.pool.CachingPool service wrapper instances are resilient to multiple closes. PHAB_ID=D136781

    • finagle-core: Requeue module now closes sessions it prevented from propagating up the stack. PHAB_ID=D142457

    • finagle-base-http: c.t.f.http.Netty4CookieCodec.encode now wraps Cookie values that would be wrapped in c.t.f.http.Netty3CookieCodec.encode. PHAB_ID=D134566

    • 0️⃣ finagle-base-http: c.t.f.http.Cookie.maxAge returns c.t.f.http.Cookie.DefaultMaxAge (instead of null) if maxAge has been set to null or None in the copy constructor PHAB_ID=D138393.

    • finagle-http: The HTTP client will not attempt to retry nacked requests with streaming bodies since it is likely that at least part of the body was already consumed and therefore it isn't safe to retry. PHAB_ID=D136053

    💥 Breaking API Changes

    
    * finagle-base-http: Removed `c.t.f.http.Cookie.comment_`, `c.t.f.http.Cookie.comment_=`,
      `c.t.f.http.Cookie.commentUrl_`, and `c.t.f.http.Cookie.commentUrl_=`. `comment` and `commentUrl`
      per RFC-6265. ``PHAB_ID=D137538``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.http.Cookie.isDiscard` and
      `c.t.f.http.Cookie.isDiscard_=`, per RFC-6265. ``PHAB_ID=D138109``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.http.Cookie.ports` and
      `c.t.f.http.Cookie.ports_=`, per RFC-6265. ``PHAB_ID=D139243``
    
    * 🚚 finagle-base-http: `c.t.f.http.RequestBuilder` has been moved to the finagle-http target
      and the implicit evidence, `RequestConfig.Yes` has been renamed to `RequestBuilder.Valid`.
      ``PHAB_ID=D122227``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.isSecure`; use `c.t.f.Cookie.secure`
      instead. Removed deprecated `c.t.f.Cookie.isSecure_=`. ``PHAB_ID=D140435``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.http.Cookie.version` and
      `c.t.f.http.Cookie.version_=`, per RFC-6265. ``PHAB_ID=D142672``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.httpOnly_=`; use `c.t.f.Cookie.httpOnly`
      instead. ``PHAB_ID=D143177``
    
    * 🚚 finagle-base-http: Removed deprecated `c.t.f.Cookie.maxAge_=`; use `c.t.f.Cookie.maxAge`
      instead. ``PHAB_ID=D143177``
    
    * finagle-core: `c.t.f.pool.WatermarkPool` was finalized. ``PHAB_ID=D137198``
    
    * finagle-core: `c.t.finagle.ssl.Ssl` and related classes have been
      removed. They were replaced as the primary way of using SSL/TLS
      within Finagle in release 6.44.0 (April 2017). Please migrate to using
      `c.t.f.ssl.client.SslClientEngineFactory` or
      `c.t.f.ssl.server.SslServerEngineFactory` instead. ``PHAB_ID=D135908``
    
    * 🚚 finagle-core: Removed `newSslEngine` and `newFinagleSslEngine` from
      `ServerBuilder`. Please implement a class which extends
      `c.t.f.ssl.server.SslServerEngineFactory` with the previously passed in
      function used as the implementation of the `apply` method. Then use the
      created engine factory with one of the `tls` methods instead.
      ``PHAB_ID=D135908``
    
    * 🚚 finagle-core: The deprecated `c.t.f.loadbalancer.DefaultBalancerFactory` has been removed.
      ``PHAB_ID=D139814``
    
    * 🚚 finagle-exp: The deprecated `c.t.f.exp.BackupRequestFilter` has been removed. Please use
      `c.t.f.client.BackupRequestFilter` instead. ``PHAB_ID=D143333``
    
    * 🚚 finagle-http: Removed the `c.t.f.Http.Netty3Impl`. Netty4 is now the only
      underlying HTTP implementation available. ``PHAB_ID=D136705``
    
    * finagle-zipkin-scribe: Renamed the finagle-zipkin module to finagle-zipkin-scribe, to
      better advertise that this is just the scribe implementation, instead of the default.
      ``PHAB_ID=D141940``
    
  • v18.2.0

    🆕 New Features

    
    * finagle-core: Add orElse to allow composition of `FailureAccrualPolicy`s.
      ``PHAB_ID=D131156``
    
    * finagle-core: `c.t.f.http.MethodBuilder` now exposes a method `newService` without a
      `methodName` to create a client. `c.t.f.thriftmux.MethodBuilder` now exposes a
      method `servicePerEndpoint` without a `methodName` to create a client. ``PHAB_ID=D131809``
    
    * 🔧 finagle-thriftmux: Expose the underlying configured client `label` in the
      `c.t.finagle.thriftmux.MethodBuilder`. ``PHAB_ID=D129109``
    
    🐛 Bug Fixes
    
    • finagle-http2: http2 servers no longer leak ping bodies. PHAB_ID=D130503

    🗄 Deprecations

    
    * finagle-core: `c.t.finagle.ssl.Ssl` and related classes have been
      deprecated. They were replaced as the primary way of using SSL/TLS
      within Finagle in release 6.44.0 (April 2017). Please migrate to using
      `c.t.f.ssl.client.SslClientEngineFactory` or
      `c.t.f.ssl.server.SslServerEngineFactory` instead. ``PHAB_ID=D129692``
    
    💥 Breaking API Changes
    
    • 🚚 finagle-base-http: c.t.f.h.codec.HttpCodec has been moved to the finagle-http project. PHAB_ID=D116364

    • 🚚 finagle base-http: c.t.f.h.Request.multipart has been removed. Use c.t.f.h.exp.MultipartDecoder instead. PHAB_ID=D129158

    • finagle-http: Split the toggle 'c.t.f.h.UseH2C' into a client-side toggle and a server-side toggle, named 'c.t.f.h.UseH2CClients', and 'c.t.f.h.UseH2CServers', respectively. PHAB_ID=D130988

    ⚙ Runtime Behavior Changes

    
    * finagle-core: Finagle clients with retry budgets or backoffs should no
      longer have infinite hash codes. ``PHAB_ID=D128594``
    
    * ⚡️ finagle-core: `c.t.f.l.Balancer` no longer uses a `c.t.f.u.Updater` as its underlying
      concurrency primitive as it was found that in practice coalescing updates almost never
      happens and in the absence of that `Updater` imposes more overhead than simple
      synchronization while complicating the result of calling `rebuild()` since we don't know
      if the rebuild actually occurred by the time we attempt to use the distributor again.
      ``PHAB_ID=D126486``