From 1790bc0e1a46696d243e447c96ee972a8f73d15e Mon Sep 17 00:00:00 2001 From: Mathias Date: Wed, 27 Mar 2013 15:29:24 +0100 Subject: [PATCH] TcpOutgoingConnection: Respond with CommandFailed rather than ErrorClosed on failed connect Before, a Tcp.ErrorClosed event is generated when a connection attempt fails. For symmetry with the Tcp.Bind case and general usability of the API a Tcp.CommandFailed(connect) is the better choice. --- .../src/test/scala/akka/io/TcpConnectionSpec.scala | 10 +++++----- akka-actor/src/main/scala/akka/io/TcpConnection.scala | 2 +- .../src/main/scala/akka/io/TcpOutgoingConnection.scala | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/io/TcpConnectionSpec.scala b/akka-actor-tests/src/test/scala/akka/io/TcpConnectionSpec.scala index fceb271ab4..6b9883339d 100644 --- a/akka-actor-tests/src/test/scala/akka/io/TcpConnectionSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/io/TcpConnectionSpec.scala @@ -5,7 +5,7 @@ package akka.io import java.io.IOException -import java.net.{ Socket, ConnectException, InetSocketAddress, SocketException } +import java.net.{ ConnectException, InetSocketAddress, SocketException } import java.nio.ByteBuffer import java.nio.channels.{ SelectionKey, Selector, ServerSocketChannel, SocketChannel } import java.nio.channels.spi.SelectorProvider @@ -175,6 +175,7 @@ class TcpConnectionSpec extends AkkaSpec("akka.io.tcp.register-timeout = 500ms") buffer.flip() ByteString(buffer).take(10).decodeString("ASCII") must be("morestuff!") } + "write data after not acknowledged data" in withEstablishedConnection() { setup ⇒ import setup._ @@ -404,6 +405,7 @@ class TcpConnectionSpec extends AkkaSpec("akka.io.tcp.register-timeout = 500ms") assertThisConnectionActorTerminated() } + "report when peer closed the connection when trying to write" in withEstablishedConnection() { setup ⇒ import setup._ @@ -431,8 +433,7 @@ class TcpConnectionSpec extends AkkaSpec("akka.io.tcp.register-timeout = 500ms") EventFilter[SocketException](occurrences = 1) intercept { selector.send(connectionActor, ChannelConnectable) - val err = userHandler.expectMsgType[ErrorClosed] - err.cause must be(ConnectionResetByPeerMessage) + userHandler.expectMsg(CommandFailed(Connect(serverAddress))) } verifyActorTermination(connectionActor) @@ -452,8 +453,7 @@ class TcpConnectionSpec extends AkkaSpec("akka.io.tcp.register-timeout = 500ms") key.isConnectable must be(true) EventFilter[ConnectException](occurrences = 1) intercept { selector.send(connectionActor, ChannelConnectable) - val err = userHandler.expectMsgType[ErrorClosed] - err.cause.startsWith(ConnectionRefusedMessagePrefix) must be(true) + userHandler.expectMsg(CommandFailed(Connect(UnboundAddress))) } verifyActorTermination(connectionActor) diff --git a/akka-actor/src/main/scala/akka/io/TcpConnection.scala b/akka-actor/src/main/scala/akka/io/TcpConnection.scala index b5bbc9ab03..c209421a87 100644 --- a/akka-actor/src/main/scala/akka/io/TcpConnection.scala +++ b/akka-actor/src/main/scala/akka/io/TcpConnection.scala @@ -318,5 +318,5 @@ private[io] object TcpConnection { */ case class CloseInformation( notificationsTo: Set[ActorRef], - closedEvent: ConnectionClosed) + closedEvent: Event) } diff --git a/akka-actor/src/main/scala/akka/io/TcpOutgoingConnection.scala b/akka-actor/src/main/scala/akka/io/TcpOutgoingConnection.scala index 098ab69b43..bbbe6cfc30 100644 --- a/akka-actor/src/main/scala/akka/io/TcpOutgoingConnection.scala +++ b/akka-actor/src/main/scala/akka/io/TcpOutgoingConnection.scala @@ -49,7 +49,10 @@ private[io] class TcpOutgoingConnection(_tcp: TcpExt, log.debug("Connection established") completeConnect(commander, options) } catch { - case e: IOException ⇒ handleError(commander, e) + case e: IOException ⇒ + if (tcp.Settings.TraceLogging) log.debug("Could not establish connection due to {}", e) + closedMessage = TcpConnection.CloseInformation(Set(commander), connect.failureMessage) + throw e } }