All Versions
Latest Version
Avg Release Cycle
28 days
Latest Release

Changelog History
Page 9

  • v6.27.0 Changes

    ๐Ÿ†• New Features

    * ๐Ÿ‘ finagle-http: Support nacks between Finagle Http clients and servers. When a server fails
      with retryable exceptions (exceptions wrapped by `Failure.rejected`), it sends back a "Nack"
      response, i.e. 503 Response code with a new "finagle-http-nack" header. This allows clients
      to safely retry failed requests, and keep connections open. ``RB_ID=705948``
    โš™ Runtime Behavior Changes
    • finagle-core: FailFast parameter renamed from onOrOff to enabled. RB_ID=720781

    • finagle-core: When evaluating NameTree unions, return components of the union in Ok state rather than waiting for all components to be Ok. This enables resilience of unions when part of the tree cannot be resolved. RB_ID=697114

    • finagle-stats: Standard of deviation is no longer calculated. It is exported as a constant 0.0 for "$statName.stddev". RB_ID=717647

    ๐Ÿ’ฅ Breaking API Changes

    * finagle-stream: Introduce StreamRequest as a replacement for Netty's
      HttpRequest, and converted the rest of the public API to not leak
      other Netty types (notably ChannelBuffer is replaced by Buf). ``RB_ID=695896``
    * finagle-core: Dtab does not implement the Namer interface anymore. Use
      `c.t.f.naming.DefaultInterpreter` to bind a name via a Dtab. Support for Dtab entries starting
      with /#/ has been removed. `c.t.f.Namer.bindAndEval` has been removed. Use
      `c.t.f.Namer.resolve` instead. ``RB_ID=711681``
    * ๐Ÿ—„ finagle: `LoadService` and `ThriftRichClient` migrated off of deprecated `ClassManifest`
      to `ClassTag`. ``RB_ID=720455``
  • v6.26.0 Changes

    ๐Ÿ—„ Deprecations

    * ๐Ÿšš finagle-memcached: Deprecated in favor of finagle-memcachedx and now removed.
    ๐Ÿ†• New Features
    • ๐Ÿ‘ finagle-httpx: Support nacks between Finagle Http clients and servers. When a server fails with retryable exceptions (exceptions wrapped by Failure.rejected), it sends back a "Nack" response, i.e. 503 Response code with a new "finagle-http-nack" header. This allows clients to safely retry failed requests, and keep connections open. RB_ID=670046

    ๐Ÿ’ฅ Breaking API Changes

    * ๐Ÿšš finagle-core: Moved netty3 specific things into a netty3 namespace. For
      these symbols, the namespace translation follows this pattern:
      `c.t.f.$MODULE._ => c.t.f.netty3.$MODULE._.` ``RB_ID=691746``
    * finagle-core: Define `WeightedSocketAddress` as a case class. Add
      `WeightedSocketAddress.extract` method to extract weight. ``RB_ID=614228``
    * finagle-core: Constructing a new Balancer that can be injected into a Finagle client
      was unnecessarily complex and non-uniform. We removed the legacy constructors around
      defining the collection of endpoints and simplified the interface to `LoadBalancerFactory`.
      Now, `com.twitter.finagle.loadbalancer.Balancers` defines the collection of balancer
      constructors. ``RB_ID=660730``
    * ๐Ÿ”ง finagle-core: Aperture can no longer be enabled via command line flags. Configuring
      per-client settings globally is generally not a good idea and we're working to remove
      these flags from Finagle. Use the constructors in `com.twitter.finagle.loadbalancer.Balancers`
      to create an instance that can be injected into a client. ``RB_ID=663194``
    * 0๏ธโƒฃ finagle-core: The default load balancer has changed to p2c from heap. ``RB_ID=693450``
    * finagle-core: `Service.isAvailable` and `ServiceFactory.isAvailable` is finalized.
      `Service.status` and `ServiceFactory.status` supersedes `isAvailable` usage since 6.24.0 release.
    * ๐Ÿšš finagle-core: `ClientBuilder.failureAccrual` method is removed. Use `ClientBuilder.failureAccrualFactory`
      instead. ``RB_ID=689076``
    * ๐Ÿšš finagle-core: Stack param `ClientBuilder.ClientConfig.FailureAccrualFac` is removed.
      Use `ClientBuilder.failureAccrualFactory` instead. ``RB_ID=689076``
    * ๐Ÿ‘ป finagle-exception: `com.twitter.finagle.exception.ExceptionReporter` is no longer used
      as the default `com.twitter.finagle.util.ReporterFactory`. ``RB_ID=674646``
    * ๐Ÿ“ฆ finagle-kestrel: Replace deprecated finagle-kestrel package with finagle-kestrelx.
    * finagle-core: Add new method `noFailureAccrual` on `ClientBuilder` that completely disables
      `FailureAccrualFactory` in the underlying stack. ``RB_ID=689076``
    ๐Ÿ†• New Features
    • ๐Ÿ‘ finagle-thrift: Support for finagle Services per thrift method.
  • v6.25.0 Changes

    ๐Ÿ’ฅ Breaking API Changes

    * ๐Ÿ— finagle-core: `c.t.f.builder.Server` now implements `c.t.f.ListeningServer`.
    * finagle-core: `c.t.f.Server.serveAndAnnounce` with a `ServiceFactory` had
      its first argument renamed to `name` from `forum`.
    * finagle-core: Add an attribute map to `c.t.f.Addr.Bound`.
    * ๐Ÿ— finagle-core: `c.t.f.builder.ClientConfig.FailFast` has moved to
    * finagle-core: NoBrokersAvailableException now has two Dtab constructor
      arguments, both the base and local Dtabs.
    * finagle-core: `c.t.f.Failure` convenience constructors (e.g., `Failure.Cause`,
      `Failure.Rejected`) were removed in favor of uniform flag treatment, and clean
      separation of attributes from interpretation of those attributes.
    * finagle-core: `ExitGuard` usage is now private to finagle.
    * finagle-core: `c.t.f.service.TimeoutFilter.module` is now split into
      `TimeoutFilter.clientModule` and `TimeoutFilter.serverModule`.
    * ๐Ÿ— finagle-core: remove deprecated `c.t.f.builder.ClientBuilder.stack` taking a
      `Stack.Params => Client[Req1, Rep1]`.
    * finagle-core: StackRegistry.Entry takes different constructor arguments, and the
      name has been bundled in with the Stack.Params.  StackRegistry.Entry is only used
      internally, so this should be relatively inexpensive.  Similarly, StackRegister#register
      has also had a small change to its method signature along the same lines.
    * ๐Ÿšš finagle-http: deprecated methods in `c.t.f.http.HttpMessageProxy` have been removed.
    * ๐Ÿšš finagle-memcached / finagle-memcachedx: move TwitterCacheResolver
      and related objects to new finagle-cacheresolver package.
    * finagle-memcached / finagle-memcachedx: failureAccrual param in ReplicationClient
      is changed from type (Int, Duration) to (Int, () => Duration), to allow flexibility
      to config duration. Also see `markDeadFor` change in finagle-core in the "New Features"
      section below.
    * โœ… finagle-memcached / finagle-memcachedx: MigrationClientTest now uses
      ServerCnxnFactory from com.twitter.zk rather than NIOServerCnxn.Factory from
    * ๐Ÿšš finagle-mux: `c.t.f.mux.RequestNackedException` is removed in favor of a standard
      Failure (`c.t.f.Failure.Rejected`).
    * finagle-ostrich4: Switched dependency to finagle-httpx from finagle-http.
    * โœ… finagle-serversets: ZkInstance in tests now uses ServerCnxnFactory from
      com.twitter.zk rather than NIOServerCnxn.Factory from
    * finagle-stats: Switched dependency to finagle-httpx from finagle-http.
    * finagle-mysql: PreparedStatements are now more type-safe! The type signature of
      PreparedStatements has changed from Seq[Any] => Future[Result] to Seq[Parameter] =>
      Future[Result]. Parameter represents objects that are serializable by finagle-mysql.
      In most cases, scalac should transparently wrap your arguments in Parameter when
      applying a PreparedStatement. However, in cases where this doesn't happen you
      can explicitly wrap them using `Parameter.wrap`.
    โš™ Runtime Behavior Changes
    • finagle-core: com.twitter.finagle.service.StatsFilter no longer requires a com.twitter.finagle.stats.RollupStatsReceiver for correct behaviour, and providing one will double count failures.

    • finagle-core: com.twitter.finagle.factory.TimeoutFactory will fail with a retryable com.twitter.finagle.Failure when it times out.

    • finagle-core: com.twitter.finagle.pool.WatermarkPool will fail with an interrupted com.twitter.finagle.Failure when it is interrupted while waiting or trying to establish a connection. It has previously failed with a com.twitter.finagle.WriteException when trying to establish a connection, but it's incorrect to retry on an interruption.

    • finagle-core: com.twitter.fiangle.RetryPolicy's RetryableWriteException and WriteExceptionsOnly will not retry on com.twitter.finagle.Failures that are marked InterruptedBy, even if they are Retryable.

    • finagle-core: The error message provided by c.t.f.NoBrokersAvailableException prints both the base and local Dtabs.

    • finagle-core: Stats produced by com.twitter.finagle.factory.BindingFactory are now scoped with the "namer" prefix rather than "interpreter". The total latency associated with Name binding is now recorded in the "bind_latency_ms" stat.

    • finagle-core: The "service_creation/service_acquisition_latency_ms" stat produced by com.twitter.finagle.factory.StatsFactoryWrapper no longer includes time spent in name resolution, which is now covered by "namer/bind_latency_us" as discussed above.

    • ๐Ÿšค finagle-core: added transit_latency_ms and deadline_budget_ms stats.

    • finagle-core: Automatic retries (requeues) are now credited as a ratio of requests over a window of time, instead of a fixed limit. The stats scope has also changed from "automatic" to "requeues".

    ๐Ÿ—„ Deprecations

    * ๐Ÿ— finagle-core: `c.t.f.builder.Server.localAddress` is deprecated in favor of
    ๐Ÿ†• New Features
    • ๐Ÿ‘€ finagle-core: Fail fast <>_ is now configurable <>_ on Stack-based clients via the com.twitter.finagle.FailFastFactory.FailFast param.

    • ๐Ÿ”ง finagle-core: com.twitter.finagle.service.StatsFilter is now configurable with an com.twitter.finagle.stats.ExceptionStatsHandler to customize how failures are recorded.

    • finagle-core: It should be safe to match on com.twitter.finagle.Failure.InterruptedBy to tell if a com.twitter.util.Future failed due to being interrupted.

    • finagle-core: markDeadFor in c.t.f.service.FailureAccrualFactory.Param is changed from Duration type to () => Duration. So it's flexible for clients to pass in a function that specifies Duration. For example, c.t.f.service.FailureAccrualFactory provides a function that adds perturbation in durations. Stack-based API and c.t.f.builder.ClientBuilder support both types for client configuration. For example,


      Thrift.client.configured(FailureAccrualFactory(5, () => 1.seconds)) // or Thrift.client.configured(new FailureAccrualFactory(5, 1.seconds)).

      c.t.f.client.DefaultClient does not support Duration type in failureAccrual anymore.

    • finagle-core: improved Java compatiblity for c.t.f.Stack.Params / c.t.f.Stack.Parameterized.

    • ๐Ÿ“‡ finagle-core: Introduce the ability to add metadata to a bound com.twitter.finagle.Addr.

    • ๐Ÿšค finagle-core: Introduce per-address latency compensation. Clients may be configured with a 'Compensator' function that uses the client's address metadata to adjust connection and request timeouts. This can be used, for instance, to account for speed-of-light latency between physical regions.

    • ๐Ÿ”ง finagle-core: Introduce per-address stats scoping. Clients may be configured with a com.twitter.finagle.client.StatsScoping.Scoper function that uses the client's address metadata to adjust the scope of client stats. This can be used, for instance, to properly scope client stats for a Name that resolves to a Union of distinct clusters.

    • finagle-core: A convenient method Client.newService(dest: String, label: String) was added.

    • finagle-core: ExitGuard now has an 'explainGuards' method to provide a human-readable description of exit guards that are still active.

    • finagle-http(x): Two missing params were added: Decompression and CompressionLevel. Both client and server may be configured with either configured method or withDecompression/ withCompressionLevel.

    • ๐Ÿ‘ finagle-mysql: Add support for MySQL transactions.

    • finagle-stats: A new HostStatsReceiver type is added and used for per host stats. It is loaded through LoadService and used by the Stack-based API as a default param. Per host stats can be turned on through com.twitter.finagle.loadbalancer.perHostStats flag, and is exported to the "/admin/per_host_metrics.json" route in twitter-server.

    • finagle-stats: Improved compatibility when migrating from Ostrich <>_ stats via two flags: com.twitter.finagle.stats.useCounterDeltas=true and com.twitter.finagle.stats.format=ostrich. If these flags are both set, HTTP requests to /admin/stats.json with the period=60 query string parameter will replicate Ostrich's behavior by computing deltas on counters every minute and formatting histograms with the same labels Ostrich uses.

    • finagle-memcached(x): Add c.t.f.memcached.Memcached which provides a Stack based Memcache client that uses pipelining.

    ๐Ÿ› Bug Fixes

    * finagle-core: `c.t.f.Server.serveAndAnnounce` for a `Service` had its usage
      of `name` and `addr` transposed.
    Miscellaneous Cleanup
    • ๐Ÿšš finagle-protobuf: Move entire unused subproject to the Finagle organization on GitHub <>_.
  • v6.24.0 Changes

    ๐Ÿ’ฅ Breaking API Changes

    * ๐Ÿšš finagle-core: Remove `c.t.f.client.StackClient.Role.loadBalancer`, which
      was unused and duplicated by `c.t.f.loadbalancer.LoadBalancerFactory.role`.
    * ๐Ÿšš finagle-core: `c.t.f.Namer.orElse` was removed; composing Namers
      may be accomplished by constructing an appropriate Dtab.
    * ๐Ÿšš finagle-core: removed experimental `enum` / `expand` from
      `c.t.f.Namer` and `alt` / `union` from `c.t.f.Dtab`.
    * ๐Ÿšš finagle-http: Remove `c.t.f.http.CheckRequestFilter` along with
      `c.t.f.http.CheckHttpRequestFilter`. The functionality has been
      added to `c.t.f.http.codec.HttpServerDispatcher`. In addition,
      the codecError in `c.t.f.http.BadHttpRequest` has been replaced
      with the exception thrown by the HttpServerCodec.
    * ๐Ÿšš finagle-httpx: Remove deprecated code, limited scope of access on internal
    * finagle-mux: `` no longer
      calls `Thread.start()` in its constructor. This should be now be
      done by the caller.
    * finagle-mux: The experimental session API is discontinued.
    * finagle-mux: Introduce new Request and Response types for mux services.
      The new mux request includes a `destination` path so that, which corresponds
      to the `destination` field in Tdispatch requests. Furthermore, these new
      types expose `` instead of Netty's ChannelBuffers.
    * finagle-thrift,finagle-thriftmux: `c.t.f.Thrift.Client`, `c.t.f.Thrift.Server`,
      `c.t.f.ThriftMux.Client` and `c.t.f.ThriftMux.Server` have their
      `TProtocolFactory` configured via a `c.t.f.thrift.param.ProtocolFactory`
    * finagle-thriftmux: `c.t.f.ThriftMux.Client` now has its `ClientId`
      configured via a `c.t.f.thrift.param.ClientId` `Stack.Param`.
    * Traces (``com.twitter.finagle.tracing.Trace``) lose their local-state mutating methods:
      ``Trace.clear``, ``Trace.pushId``, ``Trace.setId``, ``Trace.setTerminalId``, ``Trace.pushTracer``,
      ``Trace.state_=``, and ``Trace.unwind``.
      Let-bound versions of these are introduced in their stead.
      This makes it simple to ensure that state changes are properly delimited;
      further, these are always guaranteed to be delimited properly by Finagle.
          // Let-bound version:
          Tracer.letTracer(tracer) {
    * ๐Ÿšš Context handlers (``com.twitter.finagle.Context``) are removed.
      They are replaced by the use of marshalled request contexts
      Marshalled request contexts do not require the use of service loading,
      so their use no longer requires build system coordination.
      We show Finagle's trace context:
      the first version uses the old context handler mechanism;
      the second uses ``Contexts.broadcast``.
          // The old context handler for Finagle's tracing context. Note that this
          // also required the file
          // finagle-core/src/main/resources/META-INF/services/com.twitter.finagle.ContextHandler
          // to contain the fully qualifed class path of the below object.
          class TraceContext extends ContextHandler {
            val key = Buf.Utf8("com.twitter.finagle.tracing.TraceContext")
            def handle(body: Buf) {
              // Parse 'body' and mutate the trace state accordingly.
            def emit(): Option[Buf] = {
              // Read the trace state and marshal to a Buf.
          // New definition. No service loading required.
          private[finagle] val idCtx = new Contexts.broadcast.Key[TraceId] {
            val marshalId = Buf.Utf8("com.twitter.finagle.tracing.TraceContext")
            def marshal(id: TraceId): Buf = {
              // Marshal the given trace Id
            def tryUnmarshal(body: Buf): Try[TraceId] = {
              // Try to marshal 'body' into a trace id.
    โš™ Runtime Behavior Changes
    • finagle-mux: Mark the ServiceFactory available again if the underlying Service is no longer available. This permits it to be closed and reused.

    • finagle-mux: Rename the "lease_counter" counter to "leased" on mux clients.

    ๐Ÿ—„ Deprecations

    * ๐Ÿ—„ finagle-core: Deprecated the mechanisms of FailureAccrual that use
      factory Transformers.  It's better to just use the Params to
      configure the existing FailureAccrualFactory.  However, if you've
      actually written your own failure accrual transformer that's
      significantly different, then you can do stack.replace() to swap it
    * finagle-memcached: Have cas() operation return false on NotFound()
      state instead of throw IllegalStateException
    ๐Ÿ†• New Features
    • finagle-core: All Stack.Params used in ClientBuilder and ServerBuilder are now publicly exposed for configuration parity.

    • finagle-mux: Drain mux servers properly, so that shutdowns can be graceful.

    • finagle-core: Introduce Service.status which supersedes Service.isAvailable. Service.status is a fine-grained health indicator. The default definition of Service.isAvailable is now defined in terms of Service.status; this definition will soon be made final.

    • finagle-mux: Inject bound residual paths into mux requests.

    • Request contexts. Request contexts replace the direct use of com.twitter.util.Local and of com.twitter.finagle.Context. Request contexts are environments of request-local bindings; they are guaranteed to be delimited by Finagle, and their API admits only properly delimited binding. They come in two flavors: Contexts.local are always local to handling a single request; bindings in Contexts.broadcast may be marshalled and transmitted across process boundaries where there is protocol support. Currently, both Thrift and Mux (and thus also ThriftMux) support marshalled contexts. See com.twitter.finagle.contexts.Context for more details.

  • v6.23.0 Changes

    ๐Ÿ’ฅ Breaking API Changes

    * finagle-core: `c.t.f.Stackable`s maintained state about which parameters were
      accessed via `get`. This was error prone and violated the assumption that `Stack`s
      are immutable data structures. We removed this in favor of annotating modules with
      parameters. The abstract classes for Stackables were also simplified. Now we only have
      `Module` and `ModuleN` variants which are more convenient for most definitions.
      Since this is an advanced API, it should not impact standard usage of finagle.
    * โšก๏ธ finagle-core: Update ConcurrentRingBuffer to use ClassTag instead of ClassManifest;
      rename size argument to capacity.
    ๐Ÿ—„ Deprecations
    • ServerBuilder.stack[Req1, Rep1](mk: Stack.Params => Server[Req1, Rep1]) is deprecated in favor of ServerBuilder.stack[Req1, Rep1](server: Stack.Parameterized[Server[Req1, Rep1]])

    โš™ Runtime Behavior Changes

    * `finagle`: Improve allocation semantics for uses of Buf.
  • v6.22.0 Changes

    ๐Ÿ’ฅ Breaking API Changes

    * ๐Ÿšš finagle-core: Removed unused `com.twitter.finagle.service.ProxyService`. It wasn't
      sufficiently general to be used outside of finagle, and was no longer used
      in finagle.
    * โœ‚ Removed TLSEngine, and replaced it with two, TLSClientEngine, and
      TLSServerEngine, where TLSServerEngine is the same as TLSEngine, and
      TLSClientEngine takes a SocketAddress instead of (). Additionally,
      the Netty3TransporterTLSConfig now takes a function SocketAddress => Engine,
      instead of () => Engine.
    ๐Ÿ†• New Features
    • finagle-core: BroadcastStatsReceiver, introduce specialized implementation
    • finagle-core: Introduce gauges in SummarizingStatsReceiver
    • finagle-core: Introduce Transport#copyToWriter
    • finagle-core: Make base Dtab used in BindingFactory a Stack.Param
    • finagle-core: Proper decay in experimental ewma load metric
    • finagle-core: Simplify Stack{Client, Server} and unify around them

    โš™ Runtime Behavior Changes

    * ๐Ÿ‘ finagle-core: Add support for non-URLClassloaders to LoadService
    * finagle-core: clear locals before entering server dispatch loop
    * finagle-core: Defer DNS Resolution in InetResolver to FuturePool
    * finagle-core: for paths starting with /#/, skip rewrites where prefix is /
    * finagle-core: include name resolution in tracing request span
    * finagle-core: Properly wrap some IOException into ConnectionFailedException
    * finagle-core: Scope InetResolver's stats properly
    * finagle-http: Send "Connection: close" header while dispatcher is closing
    * finagle-http: Set content length header when appropriate
    * finagle-memcached: Use interruptible future for the client request readiness
    * finagle-stats: Add content-type response header to JsonExporter
    * finagle-thrift: Add back connection_preparation_latency stat in Thrift
    * finagle-thriftmux: Record protocol as a gauge rather than a counter
    ๐Ÿ“š Documentation
    • finagle-core: Add Scaladocs for ChannelBufferBuf and BufChannelBuffer
    • ๐Ÿ™‹ finagle-core: link to the FAQ in FailedFastException
    • finagle-serversets: Defer DNS resolution for endpoints to InetResolver
    • ๐Ÿ—„ finagle-thrift{,mux}: Clarified with* deprecation warning
    • ๐Ÿ›  Fix minor issues and missing code blocks in Finagle documentation


    * finagle-core: GlobalFlag isn't caching the property value
    * ๐Ÿ“œ finagle-core: recursive-descent Path / NameTree / Dentry / Dtab parsers to reduce heap allocation
    ๐Ÿ› Bug Fixes
    • finagle-core: Fix a deadlock in Contexts
    • finagle-core: Fix breaking ABI change in SummarizingStatsReceiver
    • finagle-core: Fix bug in computing array index in SummarizingStatsReceiver
    • ๐Ÿ— finagle-core: Fix location for maven builds
    • ๐Ÿ”€ finagle-core: Fix synchronization in LeasedFactory
    • finagle-core: Fix tracing with Stack{Client, Server}
    • finagle-core: Make FailedFastException an instance variable.
    • ๐Ÿ”€ finagle-core: Synchronized access to the Stackable mutable.params map
    • finagle-http: Fix CookieMap.rewriteCookieHeaders()
    • finagle-http: Fix the memory leak in HttpClientDispatcher
    • finagle-mysql: Fix timestamp fractional seconds encoding
    • finagle-mysql: Properly heed timezone when extracting TimestampValue
    • mux: clear contexts after receive, not in 'finally' clause
  • v6.21.0 Changes

    • โฌ†๏ธ finagle: Upgrade to scala_2.10
    • ๐Ÿ‘ finagle-core: Add weighted address support to InetResolver.
    • finagle-core: Adds ClientRegistry.expAllRegisteredClientsResolved
    • finagle-core: Attach Dtab.local to NoBrokersAvailableException in filter
    • finagle-core: Attempt to add dtab stats to all clients and servers
    • finagle-core: Avoid SOCKS proxy for both loopback and link-local addresses
    • finagle-core: Bind names lazily under Alt so we don't do needless lookups
    • finagle-core: DelayedFactory to detachable implementation
    • finagle-core: Fix a race in load balancer initialization
    • ๐ŸŒฒ finagle-core: Improve loadbalancer logging
    • finagle-core: Introduce ewma load metric
    • ๐ŸŒฒ finagle-core: Log state for ewma load metric
    • finagle-core: Redesign of twitter-server admin page
    • finagle-core: Register StackClient with Path dest in ClientRegistry as evaluated against Dtab.base Problem
    • finagle-core: Rewrote ServiceLoader to avoid creating
    • finagle-core: SingletonPool: a single-service pool with good semantics
    • finagle-core: Zipkin tracing for name resolution
    • ๐Ÿ”€ finagle-core: fix synchronization in SummarizingStatsReceiver
    • finagle-core: reusing pool: isAvailable === underlying.isAvailable
    • ๐Ÿ“„ finagle-docs: A better picture for filters. (Replaces hand-drawn monstrosity.)
    • ๐Ÿ‘ป finagle-docs: Add Scaladocs for all public exception classes in Finagle.
    • ๐Ÿ™‹ finagle-docs: Add a section to the FAQ regarding FailedFastExceptions
    • finagle-exp: Generify the DarkTrafficFilter problem
    • finagle-guide: Document stabilizing serverset metrics.
    • ๐Ÿ‘ finagle-http: Add support for a Dtab-Local header
    • finagle-http: Fail requests with invalid X-Dtab headers
    • finagle-http: Fail requests with invalid X-Dtab headers
    • finagle-http: TextualContentCompressor should compress textual Content-Type's even when containing a charset
    • finagle-mux,thriftmux: explain why the files are named Netty3
    • ๐Ÿ‘ finagle-mux: Better gc avoidance flags for experimentation
    • finagle-mux: Enable gc avoidance for parallel gc
    • finagle-mux: Improve mux's handling of client disconnects
    • ๐Ÿ“„ finagle-mux: Improved Garbage Collection Avoidance Docs
    • ๐Ÿ“„ finagle-mux: docs and minor cleansing in Message subclasses
    • finagle-mysql: Switches PreparedCache over to util-cache FutureCache
    • ๐Ÿ‘ finagle-serversets: Add support for getEphemerals ZooKeeper call
    • finagle-serversets: Memoize getChildrenWatchOp instead of globPrefixWatchOp
    • ๐Ÿ“œ finagle-serversets: Reuse ObjectMapper in JSON parser.
    • ๐Ÿšค finagle-serversets: add latency metrics for ServerSet2.
    • finagle-zipkin: Reduce allocations when tracing
  • v6.20.0 Changes

    • finagle: Smattering of minor cleanups in util and finagle
    • โฌ†๏ธ finagle: Upgrade sbt to 0.13
    • โฌ†๏ธ finagle: Upgrade to Netty
    • finagle-core: Add NameTree.Fail to permit failing a name without fallback
    • finagle-core: Add a generic DtabStatsFilter
    • ๐Ÿ‘ป finagle-core: Add a singleton exception and a counter in WatermarkPool
    • 0๏ธโƒฃ finagle-core: DefaultClient in terms of StackClient
    • finagle-core: Disable Netty's thread renaming
    • finagle-core: Fix CumulativeGauge memory leak
    • finagle-core: Fix negative resolution in
    • ๐Ÿ›  finagle-core: Fixed ChannelStatsHandler to properly filter exceptions
    • finagle-core: Forces finagle-core to use ipv4 network stack
    • finagle-core: Improve Failure.toString
    • finagle-core: Include path and Dtab.local in NoBrokersAvailableException
    • ๐ŸŒฒ finagle-core: Log exceptions caught by ChannelStatsHandler
    • 0๏ธโƒฃ finagle-core: Make timer-based DNS resolution as default of InetResolver
    • finagle-core: Reader and getContent symmetry
    • ๐ŸŒฒ finagle-core: Reduces log level for common exceptions
    • finagle-core: Register clients centrally
    • finagle-doc: Add fintop to companion projects list on Finagle website
    • finagle-http: Don't emit (illegal) newlines in lengthy dtab header values
    • ๐Ÿ’… finagle-http: Fix code style from an open-source contribution
    • โœ… finagle-http: Migrate from specs to scalatest
    • ๐Ÿ”ง finagle-kestrel: Make transaction abort timeout configurable in MultiReader
    • ๐ŸŒฒ finagle-mux: Added extra client logging
    • finagle-mux: Fix broken draining behavior
    • finagle-mux: Improve granularity of rate to bytes/millisecond
    • finagle-serversets: Handle errors that occur when fetching endpoints
    • โฑ finagle-serversets: Increase ZK session timeout to 10 seconds
    • ๐Ÿ”€ finagle-serversets: Merge WeightedSocketAddresses with same host:port but different weight in Stabilizer
    • ๐Ÿ”€ finagle-serversets: Synchronize bug fixes & test coverage across ZK facades
    • ๐Ÿ— finagle-swift: Fixes pants build warning
    • finagle-thrift: Add explicit dependency on libthrift
    • ๐Ÿšš finagle-thrift: Remove usage of java_sources, should be able to depend on it normally
  • v6.19.0 Changes

    • finagle-core: Allow trailing semicolons in dtabs
    • finagle-core: Rescue exceptions thrown by filter in Filter.andthen(Filter)
    • finagle-core: StackClient, StackClientLike don't leak underlying In, Out types
    • finagle-doc: Clarify cancellation
    • finagle-doc: Fix broken link in document
    • ๐Ÿ“„ finagle-doc: Fix name footnote in finagle Names docs
    • ๐Ÿšš finagle-http: Buf, Reader remove Buf.Eof; end-of-stream is None
    • finagle-http: Prepend comment to JSONP callbacks
    • โœ… finagle-http: Removing specs from the CookieMapSpec test.
    • ๐Ÿ”ง finagle-kestrel: Make failFast configurable in Kestrel codec
    • finagle-mysql: Ensure mysql specific tracing is composed.
    • finagle-mysql: Finagle MySQL PreparedStatement accepts Value types as params.
    • finagle-serversets: Identity Providers for Serverset2
    • finagle-thriftmux: Add withProtocolFactory API endpoint
    • โœ… finagle-thriftmux: Don't reuse InMemoryStatsReceiver in the same test
  • v6.18.0 Changes

    • ๐Ÿš€ finagle-*: release scrooge v3.16.0
    • ๐Ÿš€ finagle-*: release util v6.18.0
    • finagle-core: Add description field to com.twitter.finagle.Stackable trait
    • finagle-core: Add a Flag to turn on per-host stats
    • ๐Ÿšค finagle-core: Add a service acquisition latency stat to StatsFactoryWrapper
    • ๐Ÿ‘ finagle-core: Don't support empty path elements in com.twitter.finagle.Path
    • ๐Ÿ“š finagle-core: Improves FailFastFactory documentation
    • ๐Ÿ‘ป finagle-core: Make c.t.f.Failure a direct subclass of Exception
    • finagle-core: Skip SOCKS proxy when connecting to loopback address
    • 0๏ธโƒฃ finagle-core: Use Monitor from caller's context in DefaultTimer
    • โœจ finagle-http: Add "Enhance Your Calm" and "Too Many Requests" HTTP status codes
    • ๐Ÿ”ง finagle-http: Add exp.HttpServer, which allows request limits to be configured
    • finagle-http: Change Request#params to a memoized def
    • finagle-http: Stream request body
    • finagle-kestrel: Add Name-based methods for MultiReader construction
    • ๐Ÿ— finagle-memcached: Expose the client type KetamaClient in the build() API
    • finagle-mux: GC Avoidance Algorithm
    • finagle-mux: Hook up GC avoidance to servers
    • ๐Ÿšš finagle-mux: Move to the correct directory
    • finagle-serversets: Randomizes backoff interval in ZK2
    • finagle-serversets: Start resolution eagerly in ZK2
    • finagle-stats: Add a stat-filtration GlobalFlag
    • ๐Ÿš€ ostrich: release ostrich v9.5.2
    • ๐Ÿ“ˆ user guide: Add Google Analytics tracking code
    • user guide: Add sections about review process and starter issues
    • โšก๏ธ user guide: Update Finagle adopter list on user guide website
    • wily: Add Dtab expansion