From 8798b92a6d693063a54d2500757c6c8d8b1c07f0 Mon Sep 17 00:00:00 2001 From: Vladimir Ivanovskiy Date: Wed, 16 Dec 2020 05:27:12 +0000 Subject: [PATCH] finagle-core: Add fixedinet scheme resolution to global Namer Problem Name paths with fixed addresses don't need background DNS updates. But "fixedinet" scheme was not recognized by global namer and path like "/$/fixedinet/localhost/1234" was not resolved. Solution Add additional checks for "fixedinet" scheme in InetPath object inside global Namer. Result Global namer recognizes both "inet" and "fixedinet" schemes and uses corresponding Resolver. Differential Revision: https://phabricator.twitter.biz/D589429 --- CHANGELOG.rst | 3 ++ .../scala/com/twitter/finagle/Namer.scala | 17 ++++++---- .../scala/com/twitter/finagle/NamerTest.scala | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 763a86647c..b5d7e15923 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -80,6 +80,9 @@ Bug Fixes `java.lang.UnsupportedOperationException: tail of empty stream` when a `c.t.f.s.RetryPolicy` is converted to a String for showing. ``PHAB_ID=D582199`` +* finagle-core: Recognize `fixedinet` name scheme in global `com.twitter.finagle.Namer`. + ``PHAB_ID=D589429`` + 20.10.0 ------- diff --git a/finagle-core/src/main/scala/com/twitter/finagle/Namer.scala b/finagle-core/src/main/scala/com/twitter/finagle/Namer.scala index 5d38ec22e1..e7c9f0ed72 100644 --- a/finagle-core/src/main/scala/com/twitter/finagle/Namer.scala +++ b/finagle-core/src/main/scala/com/twitter/finagle/Namer.scala @@ -72,8 +72,8 @@ object Namer { private[this] object InetPath { - private[this] def resolve(host: String, port: Int): Var[Addr] = - Resolver.eval(s"inet!$host:$port") match { + private[this] def resolve(scheme: String, host: String, port: Int): Var[Addr] = + Resolver.eval(s"$scheme!$host:$port") match { case Name.Bound(va) => va case n: Name.Path => Var.value( @@ -82,11 +82,16 @@ object Namer { } def unapply(path: Path): Option[(Var[Addr], Path)] = path match { - case Path.Utf8("$", "inet", host, IntegerString(port), residual @ _*) => - Some((resolve(host, port), Path.Utf8(residual: _*))) - case Path.Utf8("$", "inet", IntegerString(port), residual @ _*) => + case Path.Utf8( + "$", + scheme @ ("inet" | "fixedinet"), + host, + IntegerString(port), + residual @ _*) => + Some((resolve(scheme, host, port), Path.Utf8(residual: _*))) + case Path.Utf8("$", scheme @ ("inet" | "fixedinet"), IntegerString(port), residual @ _*) => // no host provided means localhost - Some((resolve("", port), Path.Utf8(residual: _*))) + Some((resolve(scheme, "", port), Path.Utf8(residual: _*))) case _ => None } } diff --git a/finagle-core/src/test/scala/com/twitter/finagle/NamerTest.scala b/finagle-core/src/test/scala/com/twitter/finagle/NamerTest.scala index 2226c42bd4..f2d1805802 100644 --- a/finagle-core/src/test/scala/com/twitter/finagle/NamerTest.scala +++ b/finagle-core/src/test/scala/com/twitter/finagle/NamerTest.scala @@ -188,6 +188,39 @@ class NamerTest extends FunSuite with AssertionsForJUnit { } } + test("Namer.global: /$/fixedinet") { + Namer.global.lookup(Path.read("/$/fixedinet/1234")).sample() match { + case NameTree.Leaf(Name.Bound(addr)) => + assert(addr.sample() == Addr.Bound(Set(Address(1234)))) + case _ => fail() + } + + Await.result( + Namer.global.lookup(Path.read("/$/fixedinet/127.0.0.1/1234")).values.toFuture(), + 1.second + )() match { + case NameTree.Leaf(Name.Bound(addr)) => + assert( + Await.result(addr.changes.filter(_ != Addr.Pending).toFuture(), 1.second) + == Addr.Bound(Set(Address("127.0.0.1", 1234))) + ) + case _ => fail() + } + + intercept[ClassNotFoundException] { + Namer.global.lookup(Path.read("/$/fixedinet")).sample() + } + + Namer.global.lookup(Path.read("/$/fixedinet/1234/foobar")).sample() match { + case NameTree.Leaf(bound: Name.Bound) => + assert(bound.addr.sample() == Addr.Bound(Address(1234))) + assert(bound.id == Path.Utf8("$", "fixedinet", "1234")) + assert(bound.path == Path.Utf8("foobar")) + + case _ => fail() + } + } + test("Namer.global: /$/fail") { assert( Namer.global.lookup(Path.read("/$/fail")).sample()