#2168 - Exposing more Netty options in remtoe config

This commit is contained in:
Viktor Klang 2012-06-01 21:29:47 +02:00
parent 2940740c48
commit 12b9af25cf
9 changed files with 83 additions and 47 deletions

View file

@ -28,22 +28,22 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
def unreliableCall(param: String) = {
param match {
case "fail" => throw new RuntimeException("FAIL")
case _ => param
case "fail" throw new RuntimeException("FAIL")
case _ param
}
}
def openBreaker: Unit = {
for (i <- 1 to 5)
for (i 1 to 5)
Await.result(breakers.breaker.withCircuitBreaker(Future(unreliableCall("fail"))) recoverWith {
case _ => Promise.successful("OK")
case _ Promise.successful("OK")
}, 1.second.dilated)
}
"A circuit breaker being called by many threads" must {
"allow many calls while in closed state with no errors" in {
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {Thread.sleep(10); unreliableCall("succeed")})
val futures = for (i 1 to 100) yield breakers.breaker.withCircuitBreaker(Future { Thread.sleep(10); unreliableCall("succeed") })
val futureList = Future.sequence(futures)
@ -59,10 +59,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
openBreaker
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
val futures = for (i 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
Thread.sleep(10); unreliableCall("success")
}) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO")
case _: CircuitBreakerOpenException Promise.successful("CBO")
}
val futureList = Future.sequence(futures)
@ -79,10 +79,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
Await.ready(breakers.halfOpenLatch, 2.seconds.dilated)
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
val futures = for (i 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
Thread.sleep(10); unreliableCall("succeed")
}) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO")
case _: CircuitBreakerOpenException Promise.successful("CBO")
}
val futureList = Future.sequence(futures)
@ -102,10 +102,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
Await.ready(breakers.breaker.withCircuitBreaker(Future(unreliableCall("succeed"))), 1.second.dilated)
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
val futures = for (i 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
Thread.sleep(10); unreliableCall("succeed")
}) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO")
case _: CircuitBreakerOpenException Promise.successful("CBO")
}
val futureList = Future.sequence(futures)

View file

@ -32,9 +32,9 @@ class DangerousActor extends Actor {
def dangerousCall: String = "This really isn't that dangerous of a call after all"
def receive = {
case "is my middle name" =>
case "is my middle name"
sender ! breaker.withCircuitBreaker(Future(dangerousCall))
case "block for me" =>
case "block for me"
sender ! breaker.withSyncCircuitBreaker(dangerousCall)
}
//#circuit-breaker-usage

View file

@ -133,6 +133,15 @@ akka {
# (I) Maximum total size of all channels, 0 for off
max-total-memory-size = 0b
# (I&O) Sets the high water mark for the in and outbound sockets, set to 0b for platform default
write-buffer-high-water-mark = 0b
# (I&O) Sets the send buffer size of the Sockets, set to 0b for platform default
send-buffer-size = 0b
# (I&O) Sets the receive buffer size of the Sockets, set to 0b for platform default
receive-buffer-size = 0b
# (O) Time between reconnect attempts for active clients
reconnect-delay = 5s

View file

@ -147,6 +147,12 @@ private[akka] class ActiveRemoteClient private[akka] (
b.setOption("tcpNoDelay", true)
b.setOption("keepAlive", true)
b.setOption("connectTimeoutMillis", settings.ConnectionTimeout.toMillis)
if (settings.ReceiveBufferSize.isDefined)
b.setOption("receiveBufferSize", settings.ReceiveBufferSize.get)
if (settings.SendBufferSize.isDefined)
b.setOption("sendBufferSize", settings.SendBufferSize.get)
if (settings.WriteBufferHighWaterMark.isDefined)
b.setOption("writeBufferHighWaterMark", settings.WriteBufferHighWaterMark.get)
settings.OutboundLocalAddress.foreach(s b.setOption("localAddress", new InetSocketAddress(s, 0)))
bootstrap = b

View file

@ -45,6 +45,12 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) {
b.setOption("tcpNoDelay", true)
b.setOption("child.keepAlive", true)
b.setOption("reuseAddress", true)
if (settings.ReceiveBufferSize.isDefined)
b.setOption("receiveBufferSize", settings.ReceiveBufferSize.get)
if (settings.SendBufferSize.isDefined)
b.setOption("sendBufferSize", settings.SendBufferSize.get)
if (settings.WriteBufferHighWaterMark.isDefined)
b.setOption("writeBufferHighWaterMark", settings.WriteBufferHighWaterMark.get)
b
}

View file

@ -37,8 +37,20 @@ private[akka] class NettySettings(config: Config, val systemName: String) {
val WriteTimeout: Duration = Duration(getMilliseconds("write-timeout"), MILLISECONDS)
val AllTimeout: Duration = Duration(getMilliseconds("all-timeout"), MILLISECONDS)
val ReconnectDelay: Duration = Duration(getMilliseconds("reconnect-delay"), MILLISECONDS)
val MessageFrameSize: Int = getBytes("message-frame-size").toInt
private[this] def optionSize(s: String): Option[Int] = getBytes(s).toInt match {
case 0 None
case x if x < 0
throw new ConfigurationException("Setting '%s' must be 0 or positive (and fit in an Int)" format s)
case other Some(other)
}
val WriteBufferHighWaterMark: Option[Int] = optionSize("write-buffer-high-water-mark")
val SendBufferSize: Option[Int] = optionSize("send-buffer-size")
val ReceiveBufferSize: Option[Int] = optionSize("receive-buffer-size")
val Hostname: String = getString("hostname") match {
case "" InetAddress.getLocalHost.getHostAddress
case value value

View file

@ -56,6 +56,9 @@ class RemoteConfigSpec extends AkkaSpec(
WriteTimeout must be(10 seconds)
AllTimeout must be(0 millis)
ReconnectionTimeWindow must be(10 minutes)
WriteBufferHighWaterMark must be(None)
SendBufferSize must be(None)
ReceiveBufferSize must be(None)
}
}