We’re experimenting with a new form of release notes, so that it’s easier to get context on what’s going on in Finagle-land, especially with an eye to letting consumers see what the latest and greatest features are, and providing a little more context around what’s going on.
If you have questions about something you see in the changelogs that we didn’t mention in the expanded release notes, please feel free to email me and ask for a clarification.
At a broader level, we’d also like to mention that we’re interested in improving Java compatibility, so if you’re having trouble using one of our APIs from Java, please let us know.
util
: 6.19.0finagle
: 6.20.0scrooge
: 3.16.3twitter-server
: 1.7.3We made a couple of big changes to Buf
, our byte array abstraction, and
Reader
, our byte streaming abstraction. Previously, we had a special Buf
called Buf.Eof
to denote the end of a byte Stream, but it occurred to us that
it didn’t make sense to have this in the byte array abstraction—it made more
sense to model it in the byte stream abstraction, so now the semantic lies in
the Reader
. Reader
is experimental, and not used widely, so we didn’t bump
the major version. We apologize if this causes you problems.
At long last, we’ve deprecated com.twitter.util.Bijection
. This has been a
long time coming, since there’s now a fully-fledged open source
project built
around Bijection
that does everything that c.t.u.Bijection
did, and a whole
lot more!
We’ve added several new features to Buf, our byte array abstraction. In part,
this is to prepare to start exposing Netty-free interfaces,
so that we can swap Netty 3 out for other backends. Some of those features are
that we now have a Buf.ByteBuffer
to wrap java.nio.ByteBuffer
, Buf
s now
support reading and writing U(32|64)(BE|LE)
integers with Buf
s, and we’ve
significantly improved the performance of concatenating Buf
s, with
ConcatBuf
.
There are two new features on spools as we think more about object streaming.
Spool
now has take, useful for batching, and mapFuture, useful when you want
to apply a function which returns an asynchronous result to every item in your
spool.
We’ve modified the Logging
trait so that it’s more extensible, making it
easier to change the handlers for your logger. We hope that this will simplify
having a unified way of logging across a project or organization.
LoggerFactory
has been hard to use from Java for a long time. We just created
a LoggerFactoryBuilder
, which should be much easier to use from Java. There’s
an example in the LoggerFactoryBuilder
compilation
test.
We’re excited about making Finagle easier to use from Java, so please let us
know if you continue to run into trouble consuming Finagle from Java, so we can
work with you to make Finagle more Java-friendly.
The Scaladocs for Flag
and friends
have been significantly improved. If you ever wondered how util-flags
worked,
the Scaladocs are now an even better place to learn the nitty gritty details.
George Leontiev singlehandedly replaced all of our old specs tests with ScalaTest ones, paving the way for Util to be published against Scala 2.11. We weren’t able to publish util against 2.11 in this most recent release, but watch this space! We’re also making big strides in 2.11-ification for Finagle, in large part inspired by George’s work.
6.19.0 2014-08-05
util
: smattering of minor cleanups in util and finagleutil-core
: Reader and getContent symmetry6.18.4 2014-07-31
util-core
: Remove confusing NOOP 0.until(5) in Future.collect().util-app
: Fix a bug in global flag parsing6.18.2 2014-07-23
util-core
: Fixes a broken sbt testutil-core
: Log exceptions caught by ChannelStatsHandlerutil-core
: Satisfy promise on fatal exception in FuturePool taskutil-core
: small perf improvements to Future.collect, Throw, Flagutil-logging
: Java-friendly LoggerFactory API6.18.1 2014-07-08
util
: Update README to reflect correct storage units.util-*
: Convert all tests in util to ScalaTestutil-app
: Simplifies the logic to get the appnameutil-io
: Buf, Reader: remove Buf.Eof; end-of-stream is Noneutil-io
: Create Buf.ByteBuffer to wrap java.nio.ByteBuffer6.18.0 2014-06-23
util-app
: Don’t kill the JVM on flag-parsing failureutil-app
: Improve the Scaladocs for com.twitter.app.Flag and friendsutil-core
: Add U(32|64)(BE|LE) to Bufutil-core
: Add com.twitter.util.NilStopwatchutil-core
: Add src/main/java dependency on src/main/scalautil-core
: Catch InterruptedException in Closable collector threadutil-core
: Fix MockTimer#schedule(Duration)(=> Unit)‘s cancelutil-core
: Fix update-after-interrupt race condition in AsyncSemaphoreutil-core
: Signal the deprecation of com.twitter.util.Bijection.util-logging
: Add additional handlers to Logging trait6.17.0 2014-06-04
util
: Upgrade dependency versionsutil-core
: Scheduler productivity = cpuTime/wallTimeutil-core
: Add a take
method to Spool
util-core
: Introduce ConcatBuf
util-core
: add Spool.collectFuture
We’ve renamed Finagle threads, so that they are now called “finagle/netty3”. This should make it easier to figure out what is going on in your stack traces.
finagle-http
now supports streaming the request body. This is not yet
documented, but there is a pull request
to add documentation to the Finagle user guide. We’d love to hear what you
think.
getContent
and Reader
are two ways to retrieve the body of the HTTP message.
The previous behavior was that when the message was chunked, calling
reader.read(n)
retrieved n bytes of the message body, and getContent
returned an empty ChannelBuffer
. When the message was not chunked,
getContent
returned a ChannelBuffer
filled with the message body, and
calling reader.read(n)
was a future that never resolved. The new behavior is
that when the message is chunked, the behavior remains the same, but when not
chunked, calling reader.read(n)
retrieves n
bytes of the message body. We
think this is behavior is much more aligned with expectations.
The previous default for inet! resolution in Finagle was to never refresh the
DNS lookup, so people had to do terrible hacks to get it to work properly. Part
of the problem was that Twitter doesn’t change DNS entries frequently, so we
don’t rely on DNS for service discovery often. However, the new Finagle
supports timer-based DNS resolution as default in InetResolver
. Thanks a ton
to Alex Gleyzer, who came up with the original
implementation, and Cobb, who got it ready to merge
into Finagle.
Per-host stats can be too noisy to turn on in production, and will entail
significant GC pressure if you have many downstream hosts. We’ve added a new
flag that you can enable to turn on per host stats,
com.twitter.finagle.loadbalancer.perHostStats
, since they are often useful for
debugging problems locally, or in staging environments.
finagle-thriftmux
now supports the experimental feature GC Avoidance if you
turn on the right flags. We’re beginning to load test it now, but it’s not
ready for prime time yet. If you’re trying to use GC Avoidance outside of
Twitter, you might have a hard time. In some parts it depends upon having a JDK
which supports System.minorGc
, an extra call on System
which will only
trigger a minor GC. We’ve discussed other ways of forcing a minor GC, like
allocating a lot of big arrays very quickly, but haven’t implemented them yet.
Please get in contact if you’re interested in working on this.
We’ve significantly improved the documentation around HTTP streaming, and also added a bunch of examples. This hasn’t been merged yet, but can be found at the pull request to add documentation to the Finagle user guide. We’d love to hear what you think.
We’ve added several new stats to Finagle, to generally improve insight into
Finagle. We’ve added a marked_dead
counter to the FailFastFactory
, so that
you can see when your client perceives that downstream endpoints are flapping.
We’ve also added a couple of counters in WatermarkPool
, to make it easier to
see when you’re having queueing problems, and are asked to wait in line for a
connection, namedly pool_num_waited
, and pool_num_too_many_waiters
.
We’ve added a service acquisition latency stat to StatsFactoryWrapper
, which
gives insight into how long it takes to acquire a service. Since TCP
connections are usually quite fast, and should mostly be cached, this usually
measures how long you spend queueing for a connection.
Inspired in large part by the great work in Util to get ready for Scala 2.11,
we’ve started making Finagle ready for Scala 2.11. A large part of this is
paying down technical debt that we’ve accrued, like having half of our tests
still be on specs, which is super deprecated. Because of this, we’re trying to
move as much as possible onto ScalaTest, which is what we use now.
Pierre-Antoine Ganaye, the author of the very
cool finagle-zookeeper project,
stepped up and migrated the finagle-core
tests over, while getting up to speed
on Finagle, and the Finagle community took on the mantle for the rest of the
tests. We’re over halfway
there, and we’re beginning to think about how to switch over our other projects,
like Scrooge and Twitter-server.
In order to make it easier to get new contributors started with Finagle, we’ve added sections about review process and starter issues. Also, so that open source users can see how many other open source users there are and have more confidence in our commitment to open source, we’ve started an adopters list.
6.20.0
finagle
: Smattering of minor cleanups in util and finaglefinagle
: Upgrade sbt to 0.13finagle
: Upgrade to Netty 3.9.1.1.Finalfinagle-core
: Add NameTree.Fail to permit failing a name without fallbackfinagle-core
: Add a generic DtabStatsFilterfinagle-core
: Add a singleton exception and a counter in WatermarkPoolfinagle-core
: DefaultClient in terms of StackClientfinagle-core
: Disable Netty’s thread renamingfinagle-core
: Fix CumulativeGauge memory leakfinagle-core
: Fix negative resolution in Namer.globalfinagle-core
: Fixed ChannelStatsHandler to properly filter exceptionsfinagle-core
: Forces finagle-core to use ipv4 network stackfinagle-core
: Improve Failure.toString
finagle-core
: Include path and Dtab.local in NoBrokersAvailableExceptionfinagle-core
: Log exceptions caught by ChannelStatsHandlerfinagle-core
: Make timer-based DNS resolution as default of InetResolverfinagle-core
: Reader and getContent symmetryfinagle-core
: Reduces log level for common exceptionsfinagle-core
: Register clients centrallyfinagle-doc
: Add fintop to companion projects list on Finagle websitefinagle-http
: Don’t emit (illegal) newlines in lengthy dtab header valuesfinagle-http
: Fix code style from an open-source contributionfinagle-http
: Migrate from specs to ScalaTestfinagle-kestrel
: Make transaction abort timeout configurable in MultiReaderfinagle-mux
: Added extra client loggingfinagle-mux
: Fix broken draining behaviorfinagle-mux
: Improve granularity of rate to bytes/millisecondfinagle-serversets
: Handle errors that occur when fetching endpointsfinagle-serversets
: Increase ZK session timeout to 10 secondsfinagle-serversets
: Merge WeightedSocketAddresses with same host:port but different weight in Stabilizerfinagle-serversets
: Synchronize bug fixes & test coverage across ZK facadesfinagle-swift
: Fixes pants build warningfinagle-thrift
: Add explicit dependency on libthriftfinagle-thrift
: Remove usage of java_sources, should be able to depend on it normally6.19.0
finagle-core
: Allow trailing semicolons in dtabsfinagle-core
: Rescue exceptions thrown by filter in Filter.andthen(Filter)
finagle-core
: StackClient, StackClientLike don’t leak underlying In, Out typesfinagle-doc
: Clarify cancellationfinagle-doc
: Fix broken link in documentfinagle-doc
: Fix name footnote in finagle Names docsfinagle-http
: Buf, Reader remove Buf.Eof; end-of-stream is Nonefinagle-http
: Prepend comment to JSONP callbacksfinagle-http
: Removing specs from the CookieMapSpec test.finagle-kestrel
: Make failFast configurable in Kestrel codecfinagle-mysql
: Ensure mysql specific tracing is composed.finagle-mysql
: Finagle MySQL PreparedStatement accepts Value types as params.finagle-serversets
: Identity Providers for Serverset2finagle-thriftmux
: Add withProtocolFactory API endpointfinagle-thriftmux
: Don’t reuse InMemoryStatsReceiver in the same test6.18.0
finagle-*
: release scrooge v3.16.0finagle-*
: release util v6.18.0finagle-core
: Add description
field to com.twitter.finagle.Stackable traitfinagle-core
: Add a Flag to turn on per-host statsfinagle-core
: Add a service acquisition latency stat to StatsFactoryWrapperfinagle-core
: Don’t support empty path elements in com.twitter.finagle.Pathfinagle-core
: Improves FailFastFactory documentationfinagle-core
: Make c.t.f.Failure a direct subclass of Exceptionfinagle-core
: Skip SOCKS proxy when connecting to loopback addressfinagle-core
: Use Monitor from caller’s context in DefaultTimerfinagle-http
: Add “Enhance Your Calm” and “Too Many Requests” HTTP status codesfinagle-http
: Add exp.HttpServer, which allows request limits to be configuredfinagle-http
: Change Request#params to a memoized deffinagle-http
: Stream request bodyfinagle-kestrel
: Add Name-based methods for MultiReader constructionfinagle-memcached
: Expose the client type KetamaClient
in the build()
APIfinagle-mux
: GC Avoidance Algorithmfinagle-mux
: Hook up GC avoidance to serversfinagle-mux
: Move UseMux.java to the correct directoryfinagle-serversets
: Randomizes backoff interval in ZK2finagle-serversets
: Start resolution eagerly in ZK2finagle-stats
: Add a stat-filtration GlobalFlagfinagle-*
: release ostrich v9.5.2user guide
: Add Google Analytics tracking codeuser guide
: Add sections about review process and starter issuesuser guide
: Update Finagle adopter list on user guide websitewily
: Add Dtab expansion6.17.0
finagle
: Add list of Finagle adoptersfinagle
: Upgrade third-party dependenciesfinagle-core
: Add Addr.Neg
to the user guide’s list of Addr typesfinagle-core
: Added Failure support for sourcing to finaglefinagle-core
: ClientBuilder should turn per-host stats off by default (matching new Client building API).finagle-core
: Implement DefaultServer in terms of StackServerfinagle-core
: Improve the Dtab APIfinagle-core
: Prevent scoping stats with the empty-stringfinagle-core
: Rolls up the /tries scope properlyfinagle-core
: ServerStatsReceiver and ClientStatsReceiver can now update their root scopefinagle-core
: fix race case in DelayedFactoryfinagle-core
: introduce AbstractResolverfinagle-core
: remove need for hostConnectionLimit when using ClientBuilder#stackfinagle-core
: widen to type for ServerBuilder#stackfinagle-core
: widen type of ClientBuilder#stackfinagle-doc
: Removed a line from conf.pyfinagle-http
: DtabFilter should always clear dtab headersfinagle-http
: add HOST header for CONNECT methodfinagle-http
: scala 2.10 compatible testsfinagle-memcached
: filter out one more cancelling request exception in failure accrualfinagle-memcached
: remove empty testfinagle-mux
: Improve Mux server close behavior, control messages to non-Mux clientsfinagle-mux
: Marked a gc test as flakyfinagle-mux
: Modifies MuxService to essentially be a Service[Spool[Buf], Spool[Buf]] Problemfinagle-mux
: Rm ClientHangupException in favor of CancelledRequestExceptionfinagle-mysql
: Retrieving a timestamp from the DB nw creates a timestamp in UTCfinagle-mysql
: fix for issue where time was not being returned in UTC for binary protocolfinagle-serversets
: Prevent gauges from being garbage collectedfinagle-thrift
: Blackhole control messages sent to non-mux Thrift clientsfinagle-thriftmux
: Add per-connection protocol-usage statsfinagle-thriftmux
: Add stats to identify ThriftMux clients and serversfinagle-thriftmux
: Propagate Contexts from non-ThriftMux clientsfinagle-thriftmux
: add ClientBuilder#stack compatibility and make APIs symmetricfinagle-thriftmux
: pass along ClientId with ClientBuilder APIWe wrote a scrooge-linter,
which we’re really excited about. If you’re at a company that has a lot of
Thrift IDL files, you know the pain of trying to get everyone to write them in a
standard way, especially since the tooling is so anemic. scrooge-linter
begins to fix that problem, by linting your IDL files so you can catch
non-conforming thrift quickly and systematically.
The docs on how to use the scrooge tool from the command line have long been out of date. We just did a big refresher of them, and it’s much easier to get up and running with a new Scrooge project now.
3.16.3
scrooge-core
: Add union metadata for reflectionscrooge-doc
: Clarify docs on CLI usagescrooge-generator
: Fix error message for missing required fieldscrooge-generator
: Modify compiler to accept a Scaladoc comment at the end of Thrift filescrooge-generator
: Normalize scalatest versions between poms and 3rdpartyscrooge-generator
: Stricter checks for invalid Thrift filenamesscrooge-ostrich
: Default to using Protocols.binaryFactory
3.16.1
scrooge-*
: release finagle 6.18.0scrooge-*
: release util 6.18.0scrooge-linter
: Fix multiple arguments to linter + pants/mvn fixesscrooge
: Separate flow for linterscrooge
: Skip includes when linting3.16.0
scrooge-*
: Upgrade dependencies to latest versionsscrooge
: Move scrooge-linter into scroogescrooge
: Add SimpleID.originalName for enum fieldsIt has historically been difficult to understand how your client is configured, even though all clients are configured very similarly, usually with only small changes in parameters. However, when debugging, users sometimes need to know how long timeouts have been set to, what kind of load balancer is being used, and other configuration parameters, so that we can debug problems more quickly. Now, we have a neat admin endpoint where users can gain insight into each client individually.
Having logging at multiple granularities is a real luxury, but sometimes you realize that you’ve set the log level incorrectly, and you need to be able to see more granular logs on a box that’s already in an interesting state, in production. To that end, we’ve added a logging handler to the Twitter-server admin service, which can both tell you about the current log levels, but can also be used to change logging granularities on the fly.
We added a new admin handler to display the base dtab, so that it’s easier to reason about what will happen to a service when it receives a new dtab. Instead of having to guess based on its behavior, or try to figure it out through inspecting the code, you can just query now, and know the right answer immediately.
Built-in metrics are one of the coolest features of Finagle, but there are
really a ton of them, especially if you have many downstreams, or you use per
host stats. In order to make this problem easier to deal with, we added a flag,
com.twitter.finagle.stats.statsFilter
, which you can pass in to filter out
some stats that you know you will never use.
1.7.3
1.7.2
1.7.1