#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) = { def unreliableCall(param: String) = {
param match { param match {
case "fail" => throw new RuntimeException("FAIL") case "fail" throw new RuntimeException("FAIL")
case _ => param case _ param
} }
} }
def openBreaker: Unit = { def openBreaker: Unit = {
for (i <- 1 to 5) for (i 1 to 5)
Await.result(breakers.breaker.withCircuitBreaker(Future(unreliableCall("fail"))) recoverWith { Await.result(breakers.breaker.withCircuitBreaker(Future(unreliableCall("fail"))) recoverWith {
case _ => Promise.successful("OK") case _ Promise.successful("OK")
}, 1.second.dilated) }, 1.second.dilated)
} }
"A circuit breaker being called by many threads" must { "A circuit breaker being called by many threads" must {
"allow many calls while in closed state with no errors" in { "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) val futureList = Future.sequence(futures)
@ -59,10 +59,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
openBreaker 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") Thread.sleep(10); unreliableCall("success")
}) recoverWith { }) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO") case _: CircuitBreakerOpenException Promise.successful("CBO")
} }
val futureList = Future.sequence(futures) val futureList = Future.sequence(futures)
@ -79,10 +79,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
Await.ready(breakers.halfOpenLatch, 2.seconds.dilated) 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") Thread.sleep(10); unreliableCall("succeed")
}) recoverWith { }) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO") case _: CircuitBreakerOpenException Promise.successful("CBO")
} }
val futureList = Future.sequence(futures) 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) 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") Thread.sleep(10); unreliableCall("succeed")
}) recoverWith { }) recoverWith {
case _: CircuitBreakerOpenException => Promise.successful("CBO") case _: CircuitBreakerOpenException Promise.successful("CBO")
} }
val futureList = Future.sequence(futures) 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 dangerousCall: String = "This really isn't that dangerous of a call after all"
def receive = { def receive = {
case "is my middle name" => case "is my middle name"
sender ! breaker.withCircuitBreaker(Future(dangerousCall)) sender ! breaker.withCircuitBreaker(Future(dangerousCall))
case "block for me" => case "block for me"
sender ! breaker.withSyncCircuitBreaker(dangerousCall) sender ! breaker.withSyncCircuitBreaker(dangerousCall)
} }
//#circuit-breaker-usage //#circuit-breaker-usage

View file

@ -133,6 +133,15 @@ akka {
# (I) Maximum total size of all channels, 0 for off # (I) Maximum total size of all channels, 0 for off
max-total-memory-size = 0b 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 # (O) Time between reconnect attempts for active clients
reconnect-delay = 5s reconnect-delay = 5s

View file

@ -147,6 +147,12 @@ private[akka] class ActiveRemoteClient private[akka] (
b.setOption("tcpNoDelay", true) b.setOption("tcpNoDelay", true)
b.setOption("keepAlive", true) b.setOption("keepAlive", true)
b.setOption("connectTimeoutMillis", settings.ConnectionTimeout.toMillis) 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))) settings.OutboundLocalAddress.foreach(s b.setOption("localAddress", new InetSocketAddress(s, 0)))
bootstrap = b bootstrap = b

View file

@ -45,6 +45,12 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) {
b.setOption("tcpNoDelay", true) b.setOption("tcpNoDelay", true)
b.setOption("child.keepAlive", true) b.setOption("child.keepAlive", true)
b.setOption("reuseAddress", 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 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 WriteTimeout: Duration = Duration(getMilliseconds("write-timeout"), MILLISECONDS)
val AllTimeout: Duration = Duration(getMilliseconds("all-timeout"), MILLISECONDS) val AllTimeout: Duration = Duration(getMilliseconds("all-timeout"), MILLISECONDS)
val ReconnectDelay: Duration = Duration(getMilliseconds("reconnect-delay"), MILLISECONDS) val ReconnectDelay: Duration = Duration(getMilliseconds("reconnect-delay"), MILLISECONDS)
val MessageFrameSize: Int = getBytes("message-frame-size").toInt 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 { val Hostname: String = getString("hostname") match {
case "" InetAddress.getLocalHost.getHostAddress case "" InetAddress.getLocalHost.getHostAddress
case value value case value value

View file

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