Fix artery test file leak #21484

* Include actor system name in artery dir path to ease debugging leaks
* Base class name changed to make actor system autonaming work
* Add shutdown hook directly in transport start
* Wait for completion in shutdown hook (actual leak fix)
This commit is contained in:
Johan Andrén 2016-09-19 13:22:54 +02:00 committed by GitHub
parent 133bafdf04
commit a939e30b49
28 changed files with 78 additions and 88 deletions

View file

@ -46,7 +46,7 @@ trait FlightRecordingSupport { self: MultiNodeSpec ⇒
final protected def printFlightRecording(): Unit = {
if (arteryEnabled && destinationIsValidForDump() && Files.exists(flightRecorderFile)) {
// use stdout/println as we do not know if the system log is alive
println("Flight recorder dump:")
println(s"Flight recorder dump from '$flightRecorderFile':")
FlightRecorderReader.dumpToStdout(flightRecorderFile)
}
}

View file

@ -24,7 +24,7 @@ class AttemptSysMsgRedeliveryMultiJvmSpec(artery: Boolean) extends MultiNodeConf
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
testTransport(on = true)
@ -53,7 +53,7 @@ object AttemptSysMsgRedeliverySpec {
}
abstract class AttemptSysMsgRedeliverySpec(multiNodeConfig: AttemptSysMsgRedeliveryMultiJvmSpec)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import AttemptSysMsgRedeliverySpec._

View file

@ -18,7 +18,7 @@ class LookupRemoteActorMultiJvmSpec(artery: Boolean) extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
val master = role("master")
val slave = role("slave")
@ -40,7 +40,7 @@ object LookupRemoteActorSpec {
}
abstract class LookupRemoteActorSpec(multiNodeConfig: LookupRemoteActorMultiJvmSpec)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import LookupRemoteActorSpec._

View file

@ -20,7 +20,7 @@ class NewRemoteActorMultiJvmSpec(artery: Boolean) extends MultiNodeConfig {
ConfigFactory.parseString(s"""
akka.remote.log-remote-lifecycle-events = off
akka.remote.artery.enabled = $artery
""").withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf)))
""").withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf)))
val master = role("master")
val slave = role("slave")
@ -55,7 +55,7 @@ object NewRemoteActorSpec {
}
abstract class NewRemoteActorSpec(multiNodeConfig: NewRemoteActorMultiJvmSpec)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import NewRemoteActorSpec._

View file

@ -15,7 +15,7 @@ class PiercingShouldKeepQuarantineConfig(artery: Boolean) extends MultiNodeConfi
ConfigFactory.parseString(s"""
akka.remote.retry-gate-closed-for = 0.5s
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
}
@ -38,7 +38,7 @@ object PiercingShouldKeepQuarantineSpec {
}
abstract class PiercingShouldKeepQuarantineSpec(multiNodeConfig: PiercingShouldKeepQuarantineConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import PiercingShouldKeepQuarantineSpec._

View file

@ -26,7 +26,7 @@ class RemoteDeliveryConfig(artery: Boolean) extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
}
class RemoteDeliveryMultiJvmNode1 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = false))
@ -48,7 +48,7 @@ object RemoteDeliverySpec {
}
abstract class RemoteDeliverySpec(multiNodeConfig: RemoteDeliveryConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteDeliverySpec._

View file

@ -27,7 +27,7 @@ class RemoteDeploymentDeathWatchMultiJvmSpec(artery: Boolean) extends MultiNodeC
akka.loglevel = INFO
akka.remote.log-remote-lifecycle-events = off
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
deployOn(second, """/hello.remote = "@third@" """)
@ -69,7 +69,7 @@ object RemoteDeploymentDeathWatchSpec {
}
abstract class RemoteDeploymentDeathWatchSpec(multiNodeConfig: RemoteDeploymentDeathWatchMultiJvmSpec)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteDeploymentDeathWatchSpec._

View file

@ -51,7 +51,7 @@ class RemoteGatePiercingSpecMultiJvmNode1 extends RemoteGatePiercingSpec
class RemoteGatePiercingSpecMultiJvmNode2 extends RemoteGatePiercingSpec
abstract class RemoteGatePiercingSpec
extends MultiNodeRemotingSpec(RemoteGatePiercingSpec) {
extends RemotingMultiNodeSpec(RemoteGatePiercingSpec) {
import RemoteGatePiercingSpec._

View file

@ -5,7 +5,7 @@ package akka.remote
import language.postfixOps
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory
import com.typesafe.config.{ Config, ConfigFactory }
import akka.actor.Actor
import akka.actor.ActorIdentity
import akka.actor.ActorRef
@ -31,7 +31,7 @@ class RemoteNodeDeathWatchConfig(artery: Boolean) extends MultiNodeConfig {
## Use a tighter setting than the default, otherwise it takes 20s for DeathWatch to trigger
akka.remote.watch-failure-detector.acceptable-heartbeat-pause = 3 s
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
}
@ -92,7 +92,7 @@ object RemoteNodeDeathWatchSpec {
}
abstract class RemoteNodeDeathWatchSpec(multiNodeConfig: RemoteNodeDeathWatchConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteNodeDeathWatchSpec._
import RemoteWatcher._

View file

@ -63,7 +63,7 @@ object RemoteNodeRestartDeathWatchSpec {
}
abstract class RemoteNodeRestartDeathWatchSpec(multiNodeConfig: RemoteNodeRestartDeathWatchConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteNodeRestartDeathWatchSpec._

View file

@ -46,7 +46,7 @@ class RemoteNodeRestartGateSpecMultiJvmNode1 extends RemoteNodeRestartGateSpec
class RemoteNodeRestartGateSpecMultiJvmNode2 extends RemoteNodeRestartGateSpec
abstract class RemoteNodeRestartGateSpec
extends MultiNodeRemotingSpec(RemoteNodeRestartGateSpec) {
extends RemotingMultiNodeSpec(RemoteNodeRestartGateSpec) {
import RemoteNodeRestartGateSpec._

View file

@ -47,7 +47,7 @@ class RemoteNodeShutdownAndComesBackMultiJvmNode1 extends RemoteNodeShutdownAndC
class RemoteNodeShutdownAndComesBackMultiJvmNode2 extends RemoteNodeShutdownAndComesBackSpec
abstract class RemoteNodeShutdownAndComesBackSpec
extends MultiNodeRemotingSpec(RemoteNodeShutdownAndComesBackSpec) {
extends RemotingMultiNodeSpec(RemoteNodeShutdownAndComesBackSpec) {
import RemoteNodeShutdownAndComesBackSpec._

View file

@ -27,7 +27,7 @@ class RemoteQuarantinePiercingConfig(artery: Boolean) extends MultiNodeConfig {
akka.loglevel = INFO
akka.remote.log-remote-lifecycle-events = INFO
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
}
@ -51,7 +51,7 @@ object RemoteQuarantinePiercingSpec {
}
abstract class RemoteQuarantinePiercingSpec(multiNodeConfig: RemoteQuarantinePiercingConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteQuarantinePiercingSpec._

View file

@ -35,7 +35,7 @@ class RemoteReDeploymentConfig(artery: Boolean) extends MultiNodeConfig {
acceptable-heartbeat-pause=2.5s
}
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
testTransport(on = true)
@ -106,7 +106,7 @@ object RemoteReDeploymentMultiJvmSpec {
}
abstract class RemoteReDeploymentMultiJvmSpec(multiNodeConfig: RemoteReDeploymentConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) {
extends RemotingMultiNodeSpec(multiNodeConfig) {
def sleepAfterKill: FiniteDuration
def expectQuarantine: Boolean

View file

@ -56,7 +56,7 @@ class RemoteRestartedQuarantinedSpecMultiJvmNode1 extends RemoteRestartedQuarant
class RemoteRestartedQuarantinedSpecMultiJvmNode2 extends RemoteRestartedQuarantinedSpec
abstract class RemoteRestartedQuarantinedSpec
extends MultiNodeRemotingSpec(RemoteRestartedQuarantinedSpec) {
extends RemotingMultiNodeSpec(RemoteRestartedQuarantinedSpec) {
import RemoteRestartedQuarantinedSpec._

View file

@ -10,7 +10,7 @@ import akka.testkit.{ DefaultTimeout, ImplicitSender }
import com.typesafe.config.ConfigFactory
import org.scalatest.{ Outcome, Suite }
object MultiNodeRemotingSpec {
object RemotingMultiNodeSpec {
def arteryFlightRecordingConf =
ConfigFactory.parseString(
@ -23,7 +23,7 @@ object MultiNodeRemotingSpec {
}
abstract class MultiNodeRemotingSpec(config: MultiNodeConfig) extends MultiNodeSpec(config)
abstract class RemotingMultiNodeSpec(config: MultiNodeConfig) extends MultiNodeSpec(config)
with Suite
with STMultiNodeSpec
with FlightRecordingSupport

View file

@ -47,7 +47,7 @@ object Ticket15109Spec extends MultiNodeConfig {
class Ticket15109SpecMultiJvmNode1 extends Ticket15109Spec
class Ticket15109SpecMultiJvmNode2 extends Ticket15109Spec
abstract class Ticket15109Spec extends MultiNodeRemotingSpec(Ticket15109Spec) {
abstract class Ticket15109Spec extends RemotingMultiNodeSpec(Ticket15109Spec) {
import Ticket15109Spec._

View file

@ -9,7 +9,7 @@ import java.util.concurrent.locks.LockSupport
import scala.concurrent.duration._
import akka.actor._
import akka.remote.MultiNodeRemotingSpec
import akka.remote.RemotingMultiNodeSpec
import akka.remote.testconductor.RoleName
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
@ -53,7 +53,7 @@ object LatencySpec extends MultiNodeConfig {
}
}
}
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
final case object Reset
@ -161,7 +161,7 @@ class LatencySpecMultiJvmNode1 extends LatencySpec
class LatencySpecMultiJvmNode2 extends LatencySpec
abstract class LatencySpec
extends MultiNodeRemotingSpec(LatencySpec) {
extends RemotingMultiNodeSpec(LatencySpec) {
import LatencySpec._

View file

@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit.NANOSECONDS
import scala.concurrent.duration._
import akka.actor._
import akka.remote.{ MultiNodeRemotingSpec, RARP, RemoteActorRefProvider }
import akka.remote.{ RemotingMultiNodeSpec, RARP, RemoteActorRefProvider }
import akka.remote.testconductor.RoleName
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
@ -67,7 +67,7 @@ object MaxThroughputSpec extends MultiNodeConfig {
}
}
}
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
case object Run
sealed trait Echo extends DeadLetterSuppression with JavaSerializable
@ -277,7 +277,7 @@ object MaxThroughputSpec extends MultiNodeConfig {
class MaxThroughputSpecMultiJvmNode1 extends MaxThroughputSpec
class MaxThroughputSpecMultiJvmNode2 extends MaxThroughputSpec
abstract class MaxThroughputSpec extends MultiNodeRemotingSpec(MaxThroughputSpec) with PerfFlamesSupport {
abstract class MaxThroughputSpec extends RemotingMultiNodeSpec(MaxThroughputSpec) with PerfFlamesSupport {
import MaxThroughputSpec._

View file

@ -20,7 +20,7 @@ import akka.remote.testconductor.RoleName
import akka.actor.Identify
import scala.concurrent.Await
import akka.remote.{ AddressUidExtension, MultiNodeRemotingSpec, RARP, ThisActorSystemQuarantinedEvent }
import akka.remote.{ AddressUidExtension, RemotingMultiNodeSpec, RARP, ThisActorSystemQuarantinedEvent }
object RemoteRestartedQuarantinedSpec extends MultiNodeConfig {
val first = role("first")
@ -31,7 +31,7 @@ object RemoteRestartedQuarantinedSpec extends MultiNodeConfig {
akka.loglevel = WARNING
akka.remote.log-remote-lifecycle-events = WARNING
akka.remote.artery.enabled = on
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
class Subject extends Actor {
def receive = {
@ -45,7 +45,7 @@ object RemoteRestartedQuarantinedSpec extends MultiNodeConfig {
class RemoteRestartedQuarantinedSpecMultiJvmNode1 extends RemoteRestartedQuarantinedSpec
class RemoteRestartedQuarantinedSpecMultiJvmNode2 extends RemoteRestartedQuarantinedSpec
abstract class RemoteRestartedQuarantinedSpec extends MultiNodeRemotingSpec(RemoteRestartedQuarantinedSpec) {
abstract class RemoteRestartedQuarantinedSpec extends RemotingMultiNodeSpec(RemoteRestartedQuarantinedSpec) {
import RemoteRestartedQuarantinedSpec._

View file

@ -7,7 +7,7 @@ import scala.concurrent.duration._
import akka.actor._
import akka.actor.ActorIdentity
import akka.actor.Identify
import akka.remote.{ MultiNodeRemotingSpec, QuarantinedEvent, RARP }
import akka.remote.{ RemotingMultiNodeSpec, QuarantinedEvent, RARP }
import akka.remote.testconductor.RoleName
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
@ -25,7 +25,7 @@ object SurviveNetworkPartitionSpec extends MultiNodeConfig {
akka.loglevel = INFO
akka.remote.artery.enabled = on
akka.remote.artery.advanced.give-up-system-message-after = 4s
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
testTransport(on = true)
}
@ -33,7 +33,7 @@ object SurviveNetworkPartitionSpec extends MultiNodeConfig {
class SurviveNetworkPartitionSpecMultiJvmNode1 extends SurviveNetworkPartitionSpec
class SurviveNetworkPartitionSpecMultiJvmNode2 extends SurviveNetworkPartitionSpec
abstract class SurviveNetworkPartitionSpec extends MultiNodeRemotingSpec(SurviveNetworkPartitionSpec) {
abstract class SurviveNetworkPartitionSpec extends RemotingMultiNodeSpec(SurviveNetworkPartitionSpec) {
import SurviveNetworkPartitionSpec._

View file

@ -9,7 +9,7 @@ import akka.actor.ActorRef
import akka.actor.Address
import akka.actor.PoisonPill
import akka.actor.Props
import akka.remote.MultiNodeRemotingSpec
import akka.remote.RemotingMultiNodeSpec
import akka.remote.testkit.{ MultiNodeConfig, MultiNodeSpec, STMultiNodeSpec }
import akka.routing.Broadcast
import akka.routing.RandomPool
@ -27,7 +27,7 @@ class RemoteRandomConfig(artery: Boolean) extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
deployOnAll("""
/service-hello {
@ -56,7 +56,7 @@ object RemoteRandomSpec {
}
}
class RemoteRandomSpec(multiNodeConfig: RemoteRandomConfig) extends MultiNodeRemotingSpec(multiNodeConfig)
class RemoteRandomSpec(multiNodeConfig: RemoteRandomConfig) extends RemotingMultiNodeSpec(multiNodeConfig)
with DefaultTimeout {
import multiNodeConfig._
import RemoteRandomSpec._

View file

@ -3,32 +3,19 @@
*/
package akka.remote.routing
import language.postfixOps
import scala.collection.immutable
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Props
import akka.actor.PoisonPill
import akka.actor.Address
import scala.concurrent.Await
import akka.actor.{Actor, ActorRef, Address, PoisonPill, Props}
import akka.pattern.ask
import akka.remote.MultiNodeRemotingSpec
import akka.remote.testkit.{ MultiNodeConfig, MultiNodeSpec, STMultiNodeSpec }
import akka.routing.Broadcast
import akka.routing.GetRoutees
import akka.routing.Routees
import akka.routing.RoundRobinPool
import akka.routing.RoundRobinGroup
import akka.routing.RoutedActorRef
import akka.routing.Resizer
import akka.routing.Routee
import akka.routing.FromConfig
import akka.remote.RemotingMultiNodeSpec
import akka.remote.testkit.MultiNodeConfig
import akka.routing._
import akka.testkit._
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory
import scala.collection.immutable
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.language.postfixOps
class RemoteRoundRobinConfig(artery: Boolean) extends MultiNodeConfig {
val first = role("first")
@ -39,7 +26,7 @@ class RemoteRoundRobinConfig(artery: Boolean) extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
deployOnAll("""
/service-hello {
@ -86,10 +73,10 @@ object RemoteRoundRobinSpec {
}
}
class RemoteRoundRobinSpec(multiNodeConfig: RemoteRoundRobinConfig) extends MultiNodeRemotingSpec(multiNodeConfig)
class RemoteRoundRobinSpec(multiNodeConfig: RemoteRoundRobinConfig) extends RemotingMultiNodeSpec(multiNodeConfig)
with DefaultTimeout {
import multiNodeConfig._
import RemoteRoundRobinSpec._
import multiNodeConfig._
def initialParticipants = roles.size

View file

@ -9,7 +9,7 @@ import akka.actor.ActorRef
import akka.actor.Address
import akka.actor.PoisonPill
import akka.actor.Props
import akka.remote.MultiNodeRemotingSpec
import akka.remote.RemotingMultiNodeSpec
import akka.remote.testkit.{ MultiNodeConfig, MultiNodeSpec, STMultiNodeSpec }
import akka.routing.Broadcast
import akka.routing.ScatterGatherFirstCompletedPool
@ -28,7 +28,7 @@ class RemoteScatterGatherConfig(artery: Boolean) extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
deployOnAll("""
/service-hello {
@ -57,7 +57,7 @@ object RemoteScatterGatherSpec {
}
}
class RemoteScatterGatherSpec(multiNodeConfig: RemoteScatterGatherConfig) extends MultiNodeRemotingSpec(multiNodeConfig)
class RemoteScatterGatherSpec(multiNodeConfig: RemoteScatterGatherConfig) extends RemotingMultiNodeSpec(multiNodeConfig)
with DefaultTimeout {
import multiNodeConfig._
import RemoteScatterGatherSpec._

View file

@ -15,12 +15,12 @@ import akka.testkit.LongRunningTest
import java.net.InetSocketAddress
import java.net.InetAddress
import akka.remote.MultiNodeRemotingSpec
import akka.remote.RemotingMultiNodeSpec
import akka.remote.testkit.{ MultiNodeConfig, MultiNodeSpec, STMultiNodeSpec }
import akka.remote.transport.ThrottlerTransportAdapter.Direction
object TestConductorMultiJvmSpec extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
commonConfig(debugConfig(on = false).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
val master = role("master")
val slave = role("slave")
@ -31,7 +31,7 @@ object TestConductorMultiJvmSpec extends MultiNodeConfig {
class TestConductorMultiJvmNode1 extends TestConductorSpec
class TestConductorMultiJvmNode2 extends TestConductorSpec
class TestConductorSpec extends MultiNodeRemotingSpec(TestConductorMultiJvmSpec) {
class TestConductorSpec extends RemotingMultiNodeSpec(TestConductorMultiJvmSpec) {
import TestConductorMultiJvmSpec._

View file

@ -3,11 +3,11 @@
*/
package akka.remote.testkit
import akka.remote.MultiNodeRemotingSpec
import akka.remote.RemotingMultiNodeSpec
import akka.testkit.LongRunningTest
object MultiNodeSpecMultiJvmSpec extends MultiNodeConfig {
commonConfig(debugConfig(on = false).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf))
commonConfig(debugConfig(on = false).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
val node1 = role("node1")
val node2 = role("node2")
@ -20,7 +20,7 @@ class MultiNodeSpecSpecMultiJvmNode2 extends MultiNodeSpecSpec
class MultiNodeSpecSpecMultiJvmNode3 extends MultiNodeSpecSpec
class MultiNodeSpecSpecMultiJvmNode4 extends MultiNodeSpecSpec
class MultiNodeSpecSpec extends MultiNodeRemotingSpec(MultiNodeSpecMultiJvmSpec) {
class MultiNodeSpecSpec extends RemotingMultiNodeSpec(MultiNodeSpecMultiJvmSpec) {
import MultiNodeSpecMultiJvmSpec._

View file

@ -7,12 +7,13 @@ import java.io.File
import java.net.InetSocketAddress
import java.nio.channels.{ DatagramChannel, FileChannel }
import java.nio.file.Path
import java.util.UUID
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.{ AtomicLong, AtomicReference }
import java.util.concurrent.atomic.AtomicBoolean
import scala.annotation.tailrec
import scala.concurrent.{ Await, Future, Promise }
import scala.concurrent.{ Await, ExecutionContext, Future, Promise }
import scala.concurrent.duration._
import scala.util.Failure
import scala.util.Success
@ -47,6 +48,7 @@ import akka.remote.transport.ThrottlerTransportAdapter.Blackhole
import akka.remote.transport.ThrottlerTransportAdapter.SetThrottle
import akka.remote.transport.ThrottlerTransportAdapter.Unthrottled
import akka.stream.AbruptTerminationException
import akka.stream.ActorAttributes.Dispatcher
import akka.stream.ActorMaterializer
import akka.stream.KillSwitches
import akka.stream.Materializer
@ -58,11 +60,7 @@ import akka.stream.scaladsl.Sink
import akka.stream.scaladsl.Source
import akka.util.OptionVal
import akka.util.WildcardIndex
import io.aeron.Aeron
import io.aeron.AvailableImageHandler
import io.aeron.CncFileDescriptor
import io.aeron.Image
import io.aeron.UnavailableImageHandler
import io.aeron._
import io.aeron.driver.MediaDriver
import io.aeron.driver.ThreadingMode
import io.aeron.exceptions.ConductorServiceTimeoutException
@ -381,6 +379,7 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
override def settings = provider.remoteSettings.Artery
override def start(): Unit = {
Runtime.getRuntime.addShutdownHook(shutdownHook)
startMediaDriver()
startAeron()
topLevelFREvents.loFreq(Transport_AeronStarted, NoMetaData)
@ -428,8 +427,7 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
private lazy val shutdownHook = new Thread {
override def run(): Unit = {
if (!_shutdown) {
internalShutdown()
Await.result(internalShutdown(), 20.seconds)
}
}
}
@ -437,8 +435,14 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
private def startMediaDriver(): Unit = {
if (settings.Advanced.EmbeddedMediaDriver) {
val driverContext = new MediaDriver.Context
if (settings.Advanced.AeronDirectoryName.nonEmpty)
if (settings.Advanced.AeronDirectoryName.nonEmpty) {
driverContext.aeronDirectoryName(settings.Advanced.AeronDirectoryName)
} else {
// create a random name but include the actor system name for easier debugging
val uniquePart = UUID.randomUUID().toString
val randomName = s"${CommonContext.AERON_DIR_PROP_DEFAULT}-${system.name}-$uniquePart"
driverContext.aeronDirectoryName(randomName)
}
driverContext.clientLivenessTimeoutNs(settings.Advanced.ClientLivenessTimeout.toNanos)
driverContext.imageLivenessTimeoutNs(settings.Advanced.ImageLivenessTimeoutNs.toNanos)
driverContext.driverTimeoutMs(settings.Advanced.DriverTimeout.toMillis)
@ -468,7 +472,6 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
val driver = MediaDriver.launchEmbedded(driverContext)
log.info("Started embedded media driver in directory [{}]", driver.aeronDirectoryName)
topLevelFREvents.loFreq(Transport_MediaDriverStarted, driver.aeronDirectoryName().getBytes("US-ASCII"))
Runtime.getRuntime.addShutdownHook(shutdownHook)
if (!mediaDriver.compareAndSet(None, Some(driver))) {
throw new IllegalStateException("media driver started more than once")
}

View file

@ -199,7 +199,7 @@ private[akka] final class FlightRecorderReader(fileChannel: FileChannel) {
case class RichEntry(timeStamp: Instant, dirty: Boolean, code: Long, metadata: Array[Byte]) {
override def toString: String = {
val textualCode = FlightRecorderEvents.eventDictionary.getOrElse(code, "").take(34)
val metadataString = new String(metadata, "UTF-8")
val metadataString = new String(metadata, "US-ASCII")
f"[$timeStamp] ${if (dirty) "#" else ""} $code%3s $textualCode%-34s | $metadataString"
}
}