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 = { final protected def printFlightRecording(): Unit = {
if (arteryEnabled && destinationIsValidForDump() && Files.exists(flightRecorderFile)) { if (arteryEnabled && destinationIsValidForDump() && Files.exists(flightRecorderFile)) {
// use stdout/println as we do not know if the system log is alive // 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) FlightRecorderReader.dumpToStdout(flightRecorderFile)
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -5,7 +5,7 @@ package akka.remote
import language.postfixOps import language.postfixOps
import scala.concurrent.duration._ import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory import com.typesafe.config.{ Config, ConfigFactory }
import akka.actor.Actor import akka.actor.Actor
import akka.actor.ActorIdentity import akka.actor.ActorIdentity
import akka.actor.ActorRef 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 ## 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.watch-failure-detector.acceptable-heartbeat-pause = 3 s
akka.remote.artery.enabled = $artery akka.remote.artery.enabled = $artery
""")).withFallback(MultiNodeRemotingSpec.arteryFlightRecordingConf)) """)).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
} }
@ -92,7 +92,7 @@ object RemoteNodeDeathWatchSpec {
} }
abstract class RemoteNodeDeathWatchSpec(multiNodeConfig: RemoteNodeDeathWatchConfig) abstract class RemoteNodeDeathWatchSpec(multiNodeConfig: RemoteNodeDeathWatchConfig)
extends MultiNodeRemotingSpec(multiNodeConfig) { extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._ import multiNodeConfig._
import RemoteNodeDeathWatchSpec._ import RemoteNodeDeathWatchSpec._
import RemoteWatcher._ import RemoteWatcher._

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -10,7 +10,7 @@ import akka.testkit.{ DefaultTimeout, ImplicitSender }
import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigFactory
import org.scalatest.{ Outcome, Suite } import org.scalatest.{ Outcome, Suite }
object MultiNodeRemotingSpec { object RemotingMultiNodeSpec {
def arteryFlightRecordingConf = def arteryFlightRecordingConf =
ConfigFactory.parseString( 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 Suite
with STMultiNodeSpec with STMultiNodeSpec
with FlightRecordingSupport with FlightRecordingSupport

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,12 +7,13 @@ import java.io.File
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.nio.channels.{ DatagramChannel, FileChannel } import java.nio.channels.{ DatagramChannel, FileChannel }
import java.nio.file.Path import java.nio.file.Path
import java.util.UUID
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.{ AtomicLong, AtomicReference } import java.util.concurrent.atomic.{ AtomicLong, AtomicReference }
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import scala.annotation.tailrec import scala.annotation.tailrec
import scala.concurrent.{ Await, Future, Promise } import scala.concurrent.{ Await, ExecutionContext, Future, Promise }
import scala.concurrent.duration._ import scala.concurrent.duration._
import scala.util.Failure import scala.util.Failure
import scala.util.Success 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.SetThrottle
import akka.remote.transport.ThrottlerTransportAdapter.Unthrottled import akka.remote.transport.ThrottlerTransportAdapter.Unthrottled
import akka.stream.AbruptTerminationException import akka.stream.AbruptTerminationException
import akka.stream.ActorAttributes.Dispatcher
import akka.stream.ActorMaterializer import akka.stream.ActorMaterializer
import akka.stream.KillSwitches import akka.stream.KillSwitches
import akka.stream.Materializer import akka.stream.Materializer
@ -58,11 +60,7 @@ import akka.stream.scaladsl.Sink
import akka.stream.scaladsl.Source import akka.stream.scaladsl.Source
import akka.util.OptionVal import akka.util.OptionVal
import akka.util.WildcardIndex import akka.util.WildcardIndex
import io.aeron.Aeron import io.aeron._
import io.aeron.AvailableImageHandler
import io.aeron.CncFileDescriptor
import io.aeron.Image
import io.aeron.UnavailableImageHandler
import io.aeron.driver.MediaDriver import io.aeron.driver.MediaDriver
import io.aeron.driver.ThreadingMode import io.aeron.driver.ThreadingMode
import io.aeron.exceptions.ConductorServiceTimeoutException 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 settings = provider.remoteSettings.Artery
override def start(): Unit = { override def start(): Unit = {
Runtime.getRuntime.addShutdownHook(shutdownHook)
startMediaDriver() startMediaDriver()
startAeron() startAeron()
topLevelFREvents.loFreq(Transport_AeronStarted, NoMetaData) topLevelFREvents.loFreq(Transport_AeronStarted, NoMetaData)
@ -428,8 +427,7 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
private lazy val shutdownHook = new Thread { private lazy val shutdownHook = new Thread {
override def run(): Unit = { override def run(): Unit = {
if (!_shutdown) { if (!_shutdown) {
internalShutdown() Await.result(internalShutdown(), 20.seconds)
} }
} }
} }
@ -437,8 +435,14 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
private def startMediaDriver(): Unit = { private def startMediaDriver(): Unit = {
if (settings.Advanced.EmbeddedMediaDriver) { if (settings.Advanced.EmbeddedMediaDriver) {
val driverContext = new MediaDriver.Context val driverContext = new MediaDriver.Context
if (settings.Advanced.AeronDirectoryName.nonEmpty) if (settings.Advanced.AeronDirectoryName.nonEmpty) {
driverContext.aeronDirectoryName(settings.Advanced.AeronDirectoryName) 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.clientLivenessTimeoutNs(settings.Advanced.ClientLivenessTimeout.toNanos)
driverContext.imageLivenessTimeoutNs(settings.Advanced.ImageLivenessTimeoutNs.toNanos) driverContext.imageLivenessTimeoutNs(settings.Advanced.ImageLivenessTimeoutNs.toNanos)
driverContext.driverTimeoutMs(settings.Advanced.DriverTimeout.toMillis) driverContext.driverTimeoutMs(settings.Advanced.DriverTimeout.toMillis)
@ -468,7 +472,6 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R
val driver = MediaDriver.launchEmbedded(driverContext) val driver = MediaDriver.launchEmbedded(driverContext)
log.info("Started embedded media driver in directory [{}]", driver.aeronDirectoryName) log.info("Started embedded media driver in directory [{}]", driver.aeronDirectoryName)
topLevelFREvents.loFreq(Transport_MediaDriverStarted, driver.aeronDirectoryName().getBytes("US-ASCII")) topLevelFREvents.loFreq(Transport_MediaDriverStarted, driver.aeronDirectoryName().getBytes("US-ASCII"))
Runtime.getRuntime.addShutdownHook(shutdownHook)
if (!mediaDriver.compareAndSet(None, Some(driver))) { if (!mediaDriver.compareAndSet(None, Some(driver))) {
throw new IllegalStateException("media driver started more than once") 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]) { case class RichEntry(timeStamp: Instant, dirty: Boolean, code: Long, metadata: Array[Byte]) {
override def toString: String = { override def toString: String = {
val textualCode = FlightRecorderEvents.eventDictionary.getOrElse(code, "").take(34) 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" f"[$timeStamp] ${if (dirty) "#" else ""} $code%3s $textualCode%-34s | $metadataString"
} }
} }