Our April releases have arrived!
Finagle 18.4.0, Finatra 18.4.0, Scrooge 18.4.0, TwitterServer 18.4.0, and Util 18.4.0.
New Features
finagle-core: c.t.f.filter.NackAdmissionFilter
can now be disabled via a with
-method.
$Protocol.client.withAdmissionControl.noNackAdmissionControl
323a20f4
finagle-mysql: Exceptions now include the SQL that was being executed when possible. 5a54f45d
finagle-mysql: Address PreparedStatement
usability from Java via
PreparedStatement.asJava()
. Through this, you can use the API with
varargs and Java 8 lambdas. c5bd6b97
finagle-mysql: Added support for Option
\s to Parameter
implicits. This
allows for the natural represention of nullable columns with an Option
where a None
is treated as a null
. 48f688d1
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. 911a01ce
finagle-redis: Support has been added for a number of new cluster commands introduced in Redis 3.0.0. 86b151bf
Bug Fixes
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.
1313d9ba
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. 61c7a711
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. 7a175a98
finagle-base-http: Removed deprecated c.t.f.Cookie.value_=
; use c.t.f.Cookie.value
instead. 4bdd261b
finagle-base-http: Removed deprecated c.t.f.Cookie.domain_=
; use c.t.f.Cookie.domain
instead. 4bdd261b
finagle-base-http: Removed deprecated c.t.f.Cookie.path_=
; use c.t.f.Cookie.path
instead. 4bdd261b
Runtime Behavior Changes
finagle-core: Add minimum request threshold for successRateWithinDuration
failure accrual.
b6caf3dd
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. 387d87d4
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
. 1313d9ba
finagle-core: Closing c.t.f.NullServer
is now a no-op. 36aac62c
finagle-netty4: Netty ByteBuf leak tracking is enabled by default. 24690b13
Deprecations
Added
finatra-http: Added the ability for requests to have a maximum forward depth to
c.t.finatra.http.routing.HttpRouter
, which prevents requests from being forwarded
an infinite number of times. By default the maximum forward depth is 5.
cb236294
inject-thrift-client: Update configureServicePerEndpoint
and
configureMethodBuilder
in ThriftMethodBuilderClientModule
to also pass a
c.t.inject.Injector
instance which allows users to use bound instances from
the object graph when providing further thriftmux.MethodBuilder
or
ThriftMethodBuilderFactory
configuration.
ee16c1c6
inject-thrift-client: Update configureThriftMuxClient
in ThriftClientModuleTrait
to
also pass a c.t.inject.Injector
instance which allows users to use bound instances
from the object graph when providing further ThriftMux.client
configuration.
e3047fe3
inject-server: Capture errors on close of the underlying TwitterServer. The embedded
testing utilities can now capture and report on an exception that occurs during close
of the underlying TwitterServer. EmbeddedTwitterServer#assertCleanShutdown
inspects
for any Throwable captured from closing the underlying server which it will then throw.
0e304bbc
finatra-http: Created a new API into c.t.f.h.response.StreamingResponse
which permits passing
a transformer
which is an AsynStream[T] => AsyncStream[(U, Buf)]
for serialization purposes,
as well as two callbacks – onDisconnect
, called when the stream is disconnected, and onWrite
,
which is a respond
side-effecting callback to every individual write to the stream.
ab44378c
Changed
#bind[T]
DSL. The testing #bind[T]
DSL is lacking in
its ability to be used from Java and we would like to revise the API to be more expressive such
that it also includes binding from a Type to a Type. Due to wanting to also support the ability
to bind a Type to a Type, the DSL has been re-worked to more closely match the actual Guice
binding DSL.For Scala users the #bind[T]
DSL now looks as follows:
bind[T].to[U <: T]
bind[T].to[Class[U <: T]]
bind[T].toInstance(T)
bind[T].annotatedWith[Ann].to[U <: T]
bind[T].annotatedWith[Ann].to[Class[U <: T]]
bind[T].annotatedWith[Ann].toInstance(T)
bind[T].annotatedWith[Class[Ann]].to[U <: T]
bind[T].annotatedWith[Class[Ann]].to[Class[U <: T]]
bind[T].annotatedWith[Class[Ann]].toInstance(T)
bind[T].annotatedWith(Annotation).to[U <: T]
bind[T].annotatedWith(Annotation).to[Class[U <: T]]
bind[T].annotatedWith(Annotation).toInstance(T)
bindClass(Class[T]).to[T]
bindClass(Class[T]).to[Class[U <: T]]
bindClass(Class[T]).toInstance(T)
bindClass(Class[T]).annotatedWith[Class[Ann]].to[T]
bindClass(Class[T]).annotatedWith[Class[Ann]].[Class[U <: T]]
bindClass(Class[T]).annotatedWith[Class[Ann]].toInstance(T)
bindClass(Class[T]).annotatedWith(Annotation).to[T]
bindClass(Class[T]).annotatedWith(Annotation).[Class[U <: T]]
bindClass(Class[T]).annotatedWith(Annotation).toInstance(T)
For Java users, there are more Java-friendly methods:
bindClass(Class[T], T)
bindClass(Class[T], Annotation, T)
bindClass(Class[T], Class[Annotation], T)
bindClass(Class[T], Class[U <: T])
bindClass(Class[T], Annotation, Class[U <: T])
bindClass(Class[T], Class[Annotation], Class[U <: T])
Additionally, these changes highlighted the lack of Java-support in the TwitterModule
for
creating injectable Flags. Thus c.t.inject.TwitterModuleFlags
has been updated to also provide
Java-friendly flag creation methods:
protected def createFlag[T](name: String, default: T, help: String, flggble: Flaggable[T]): Flag[T]
protected def createMandatoryFlag[T](name: String, help: String, usage: String, flggble: Flaggable[T]): Flag[T]
inject-thrift-client: The “retryBudget” in the c.t.inject.thrift.modules.ThriftMethodBuilderClientModule
should be a RetryBudget
and not the generic Budget
configuration Param. Updated the type.
8feea4bb
inject-server: Move HTTP-related concerns out of the embedded testing utilities into
specific HTTP “clients”. The exposed httpAdminClient
in the EmbeddedTwitterServer
and the httpClient
and httpsClient
in the EmbeddedHttpServer
are no longer just
Finagle Services from Request to Response, but actual objects. The underlying Finagle
Service[Request, Response]
can be accessed via Client.service
. 0e304bbc
scrooge-generator: Add support for construction_required fields. Add a validateNewInstance method to all generated scala companion objects. cbde3312
scrooge-core: Check for corruption in size meta field of container and throw an exception if size is found corrupted. 75392161
scrooge: Upgrade libthrift to 0.10.0. 997f2464
No Changes
New Features
util-app: Add the ability to bind specific implementations for LoadService.apply
via App.loadServiceBindings
. 74058678
util-core: Introduce the ClosableOnce
trait which extends the guarantees of
Closable
to include idempotency of the close
method. ccd1c697
Runtime Behavior Changes
util-app: Add visibility for NonFatal exceptions during exiting of c.t.app.App
.
Added visibility into any NonFatal exceptions which occur during the closing of
resources during App#close
. b152745e
util-core: Ensure the Awaitable.CloseAwaitably0.closeAwaitably
Future returns.
Because the closed
AtomicBoolean is flipped, we want to make sure that executing
the passed in f
function satisfies the onClose
Promise even the cases of thrown
exceptions. 0c793f97
util-stats: Alphabetically sort stats printed to the given PrintStream
in the
c.t.finagle.stats.InMemoryStatsReceiver#print(PrintStream)
function.
To include stats headers which provide better visual separation for the different
types of stats being printedm, set includeHeaders
to true. E.g.,
InMemoryStatsReceiver#print(PrintStream, includeHeaders = true)