From c2597ed33db14bbebe9aa36afe0c66d57c48255e Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 17 Dec 2011 15:54:09 +0100 Subject: [PATCH] Adding debug messages for all remote exceptions, to ease debugging of remoting --- .../akka/dispatch/ThreadPoolBuilder.scala | 2 - .../scala/akka/remote/RemoteInterface.scala | 130 +++++++++++++----- .../remote/netty/NettyRemoteSupport.scala | 2 +- 3 files changed, 100 insertions(+), 34 deletions(-) diff --git a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala index 52062041b1..22dfd15ffa 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala @@ -10,8 +10,6 @@ import akka.util.Duration import java.util.concurrent._ object ThreadPoolConfig { - type Bounds = Int - type FlowHandler = Either[SaneRejectedExecutionHandler, Bounds] type QueueFactory = () ⇒ BlockingQueue[Runnable] val defaultAllowCoreThreadTimeout: Boolean = false diff --git a/akka-remote/src/main/scala/akka/remote/RemoteInterface.scala b/akka-remote/src/main/scala/akka/remote/RemoteInterface.scala index 6dbc50eab8..4e6730f65b 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteInterface.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteInterface.scala @@ -32,6 +32,8 @@ trait ParsedTransportAddress extends RemoteTransportAddress case class RemoteNettyAddress(host: String, ip: Option[InetAddress], port: Int) extends ParsedTransportAddress { def protocol = "akka" + + override def toString(): String = "akka://" + host + ":" + port } object RemoteNettyAddress { @@ -145,29 +147,57 @@ trait RemoteClientLifeCycleEvent extends RemoteLifeCycleEvent { case class RemoteClientError[T <: ParsedTransportAddress]( @BeanProperty cause: Throwable, @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientError@" + + remoteAddress + + ": ErrorMessage[" + + (if (cause ne null) cause.getMessage else "no message") + + "]" +} case class RemoteClientDisconnected[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientDisconnected@" + remoteAddress +} case class RemoteClientConnected[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientConnected@" + remoteAddress +} case class RemoteClientStarted[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientStarted@" + remoteAddress +} case class RemoteClientShutdown[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientShutdown@" + remoteAddress +} case class RemoteClientWriteFailed[T <: ParsedTransportAddress]( @BeanProperty request: AnyRef, @BeanProperty cause: Throwable, @BeanProperty remote: RemoteSupport[T], - @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent + @BeanProperty remoteAddress: T) extends RemoteClientLifeCycleEvent { + override def toString = + "RemoteClientWriteFailed@" + + remoteAddress + + ": MessageClass[" + + (if (request ne null) request.getClass.getName else "no message") + + "] ErrorMessage[" + + (if (cause ne null) cause.getMessage else "no message") + + "]" +} /** * Life-cycle events for RemoteServer. @@ -175,26 +205,77 @@ case class RemoteClientWriteFailed[T <: ParsedTransportAddress]( trait RemoteServerLifeCycleEvent extends RemoteLifeCycleEvent case class RemoteServerStarted[T <: ParsedTransportAddress]( - @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent + @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerStarted@" + remote.name +} + case class RemoteServerShutdown[T <: ParsedTransportAddress]( - @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent + @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerShutdown@" + remote.name +} + case class RemoteServerError[T <: ParsedTransportAddress]( @BeanProperty val cause: Throwable, - @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent + @BeanProperty remote: RemoteSupport[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerError@" + + remote.name + + ": ErrorMessage[" + + (if (cause ne null) cause.getMessage else "no message") + + "]" +} + case class RemoteServerClientConnected[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent + @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerClientConnected@" + + remote.name + + ": Client[" + + (if (clientAddress.isDefined) clientAddress.get else "no address") + + "]" +} + case class RemoteServerClientDisconnected[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent + @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerClientDisconnected@" + + remote.name + + ": Client[" + + (if (clientAddress.isDefined) clientAddress.get else "no address") + + "]" +} + case class RemoteServerClientClosed[T <: ParsedTransportAddress]( @BeanProperty remote: RemoteSupport[T], - @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent + @BeanProperty val clientAddress: Option[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerClientClosed@" + + remote.name + + ": Client[" + + (if (clientAddress.isDefined) clientAddress.get else "no address") + + "]" +} + case class RemoteServerWriteFailed[T <: ParsedTransportAddress]( @BeanProperty request: AnyRef, @BeanProperty cause: Throwable, - @BeanProperty server: RemoteSupport[T], - @BeanProperty remoteAddress: Option[T]) extends RemoteServerLifeCycleEvent + @BeanProperty remote: RemoteSupport[T], + @BeanProperty remoteAddress: Option[T]) extends RemoteServerLifeCycleEvent { + override def toString = + "RemoteServerWriteFailed@" + + remote + + ": ClientAddress[" + + remoteAddress + + "] MessageClass[" + + (if (request ne null) request.getClass.getName else "no message") + + "] ErrorMessage[" + + (if (cause ne null) cause.getMessage else "no message") + + "]" +} /** * Thrown for example when trying to send a message using a RemoteClient that is either not started or shut down. @@ -204,22 +285,6 @@ class RemoteClientException[T <: ParsedTransportAddress] private[akka] ( @BeanProperty val client: RemoteSupport[T], val remoteAddress: T, cause: Throwable = null) extends AkkaException(message, cause) -/** - * Thrown when the remote server actor dispatching fails for some reason. - */ -class RemoteServerException private[akka] (message: String) extends AkkaException(message) - -/** - * Thrown when a remote exception sent over the wire cannot be loaded and instantiated - */ -case class CannotInstantiateRemoteExceptionDueToRemoteProtocolParsingErrorException private[akka] (cause: Throwable, originalClassName: String, originalMessage: String) - extends AkkaException("\nParsingError[%s]\nOriginalException[%s]\nOriginalMessage[%s]" - .format(cause.toString, originalClassName, originalMessage)) { - override def printStackTrace = cause.printStackTrace - override def printStackTrace(printStream: PrintStream) = cause.printStackTrace(printStream) - override def printStackTrace(printWriter: PrintWriter) = cause.printStackTrace(printWriter) -} - abstract class RemoteSupport[-T <: ParsedTransportAddress](val system: ActorSystemImpl) { /** * Shuts down the remoting @@ -253,7 +318,10 @@ abstract class RemoteSupport[-T <: ParsedTransportAddress](val system: ActorSyst recipient: RemoteActorRef, loader: Option[ClassLoader]): Unit - protected[akka] def notifyListeners(message: RemoteLifeCycleEvent): Unit = system.eventStream.publish(message) + protected[akka] def notifyListeners(message: RemoteLifeCycleEvent): Unit = { + system.eventStream.publish(message) + system.log.debug("REMOTE: {}", message) + } override def toString = name } diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index b9edbc9e60..6e53c88866 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -459,7 +459,7 @@ class NettyRemoteSupport(_system: ActorSystemImpl, val remote: Remote, val addre def name = currentServer.get match { case Some(server) ⇒ server.name - case None ⇒ "Non-running NettyRemoteServer@" + remote.remoteAddress + case None ⇒ remote.remoteAddress.toString } private val _isRunning = new Switch(false)