diff --git a/.github/workflows/build-test-prValidation.yml b/.github/workflows/build-test-prValidation.yml index a4479083e5..8cdeb7e270 100644 --- a/.github/workflows/build-test-prValidation.yml +++ b/.github/workflows/build-test-prValidation.yml @@ -56,7 +56,6 @@ jobs: run: |- sbt -jvm-opts .jvmopts-ci \ -Dakka.mima.enabled=false \ - -Dakka.ci-server=true \ -Dakka.test.multi-in-test=false \ -Dakka.test.timefactor=2 \ -Dakka.actor.testkit.typed.timefactor=2 \ diff --git a/.github/workflows/nightly-builds.yml b/.github/workflows/nightly-builds.yml index 40aa023fc5..358194612c 100644 --- a/.github/workflows/nightly-builds.yml +++ b/.github/workflows/nightly-builds.yml @@ -94,6 +94,7 @@ jobs: uses: coursier/cache-action@v6.2 - name: sbt ${{ matrix.command }} + # note that this is not running any multi-jvm tests because multi-in-test=false run: |- sbt -jvm-opts .jvmopts-ci \ -Djava.security.egd=file:/dev/./urandom \ @@ -101,13 +102,8 @@ jobs: -Dakka.test.timefactor=2 \ -Dakka.actor.testkit.typed.timefactor=2 \ -Dakka.test.tags.exclude=gh-exclude,timing \ + -Dakka.test.multi-in-test=false \ -Dakka.cluster.assert=on \ - -Dakka.test.names.exclude=akka.cluster.Stress \ - -Dmultinode.XX:MetaspaceSize=128M \ - -Dmultinode.Xms256M \ - -Dmultinode.Xmx256M \ - -Dmultinode.Xlog:gc \ - -Dmultinode.XX:+AlwaysActAsServerClassMachine \ clean ${{ matrix.command }} - name: Email on failure @@ -139,11 +135,11 @@ jobs: jdkVersion: ["adopt@1.8.0", "adopt@1.11", "openjdk@1.17.0"] include: - jdkVersion: adopt@1.8.0 - extraOpts: "-Dmultinode.XX:+PrintGCDetails -Dmultinode.XX:+PrintGCTimeStamps" + extraOpts: "" - jdkVersion: adopt@1.11 - extraOpts: "-Dmultinode.Xlog:gc" + extraOpts: "" - jdkVersion: openjdk@1.17.0 - extraopts: "-Dmultinode.Xlog:gc" + extraopts: "" steps: - name: Checkout uses: actions/checkout@v2 @@ -159,7 +155,7 @@ jobs: uses: coursier/cache-action@v6.2 - name: Compile and Test - # note that this is not running any multi-jvm tests (yet) because multi-in-test=false + # note that this is not running any multi-jvm tests because multi-in-test=false run: |- sbt -jvm-opts .jvmopts-ci \ -Dakka.cluster.assert=on \ @@ -168,10 +164,6 @@ jobs: -Dakka.actor.testkit.typed.timefactor=2 \ -Dakka.test.tags.exclude=gh-exclude,timing \ -Dakka.test.multi-in-test=false \ - -Dmultinode.XX:MetaspaceSize=128M \ - -Dmultinode.Xms256M \ - -Dmultinode.Xmx256M \ - -Dmultinode.XX:+AlwaysActAsServerClassMachine \ ${{ matrix.extraOpts }} \ clean "+~ ${{ matrix.scalaVersion }} test" checkTestsHaveRun @@ -225,3 +217,58 @@ jobs: body: | Job ${{ github.job }} in workflow ${{ github.workflow }} of ${{github.repository}} failed! https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} + + akka-artery-aeron-tests: + name: Akka Artery Aeron Tests + runs-on: ubuntu-20.04 + if: github.repository == 'akka/akka' + strategy: + fail-fast: false + matrix: + command: + - akka-remote/test akka-remote-tests/test + - akka-cluster/test akka-cluster-typed/test + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + # we don't know what commit the last tag was it's safer to get entire repo so previousStableVersion resolves + fetch-depth: 0 + + - name: Set up JDK 11 + uses: olafurpg/setup-scala@v10 + with: + java-version: adopt@1.11 + + - name: Cache Coursier cache + uses: coursier/cache-action@v6.2 + + - name: sbt ${{ matrix.command }} + # note that this is not running any multi-jvm tests because multi-in-test=false + run: |- + sbt -jvm-opts .jvmopts-ci \ + -Djava.security.egd=file:/dev/./urandom \ + -Dakka.remote.artery.transport=aeron-udp \ + -Dakka.test.timefactor=2 \ + -Dakka.actor.testkit.typed.timefactor=2 \ + -Dakka.test.tags.exclude=gh-exclude,gh-exclude-aeron,timing \ + -Dakka.test.multi-in-test=false \ + -Dakka.cluster.assert=on \ + -Daeron.dir=/opt/volumes/media-driver \ + -Daeron.term.buffer.length=33554432 \ + clean ${{ matrix.command }} + + - name: Email on failure + if: ${{ failure() }} + uses: dawidd6/action-send-mail@v3 + with: + server_address: smtp.gmail.com + server_port: 465 + username: ${{secrets.MAIL_USERNAME}} + password: ${{secrets.MAIL_PASSWORD}} + subject: "Failed: ${{ github.workflow }} / ${{ github.job }}" + to: akka.official@gmail.com + from: Akka CI (GHActions) + body: | + Job ${{ github.job }} in workflow ${{ github.workflow }} of ${{github.repository}} failed! + https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} diff --git a/.github/workflows/scala3-build.yml b/.github/workflows/scala3-build.yml index 0ad8f18f80..789dd17d52 100644 --- a/.github/workflows/scala3-build.yml +++ b/.github/workflows/scala3-build.yml @@ -57,7 +57,6 @@ jobs: -Dmultinode.XX:MetaspaceSize=128M \ -Dmultinode.Xms256M \ -Dmultinode.Xmx256M \ - -Dmultinode.Xlog:gc \ -Dmultinode.XX:+AlwaysActAsServerClassMachine \ "+~ 3 ${{ matrix.command }}" diff --git a/.github/workflows/timing-tests.yml b/.github/workflows/timing-tests.yml index 5dfdc6b3ce..376b617c0b 100644 --- a/.github/workflows/timing-tests.yml +++ b/.github/workflows/timing-tests.yml @@ -39,7 +39,6 @@ jobs: -Dmultinode.XX:MetaspaceSize=128M \ -Dmultinode.Xms256M \ -Dmultinode.Xmx256M \ - -Dmultinode.Xlog:gc \ -Dmultinode.XX:+AlwaysActAsServerClassMachine \ clean test diff --git a/.jvmopts-ci b/.jvmopts-ci index fad5362b94..8d097d6f45 100644 --- a/.jvmopts-ci +++ b/.jvmopts-ci @@ -12,3 +12,4 @@ -XX:MetaspaceSize=512M -XX:-ClassUnloadingWithConcurrentMark -Djava.security.egd=file:/dev/./urandom +-Dakka.ci-server=true diff --git a/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/receptionist/ClusterReceptionistSpec.scala b/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/receptionist/ClusterReceptionistSpec.scala index 9b73d2eebd..9cfd260e17 100644 --- a/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/receptionist/ClusterReceptionistSpec.scala +++ b/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/receptionist/ClusterReceptionistSpec.scala @@ -8,9 +8,11 @@ import java.util.concurrent.ThreadLocalRandom import scala.concurrent.Await import scala.concurrent.duration._ + import com.typesafe.config.ConfigFactory import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec + import akka.actor.RootActorPath import akka.actor.testkit.typed.FishingOutcome import akka.actor.testkit.typed.scaladsl.ActorTestKit @@ -31,6 +33,8 @@ import akka.serialization.jackson.CborSerializable import akka.testkit.LongRunningTest import org.scalatest.concurrent.ScalaFutures +import akka.testkit.GHExcludeAeronTest + object ClusterReceptionistSpec { val config = ConfigFactory.parseString(s""" akka.loglevel = DEBUG # issue #24960 @@ -80,7 +84,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin "The cluster receptionist" must { - "eventually replicate registrations to the other side" taggedAs (LongRunningTest) in { + "eventually replicate registrations to the other side".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-1", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -118,7 +122,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "handle registrations before joining" taggedAs (LongRunningTest) in { + "handle registrations before joining".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-2", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -148,11 +152,11 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "remove registrations when node dies" taggedAs (LongRunningTest) in { + "remove registrations when node dies".taggedAs(LongRunningTest, GHExcludeAeronTest) in { testNodeRemoval(down = true) } - "remove registrations when node leaves" taggedAs (LongRunningTest) in { + "remove registrations when node leaves".taggedAs(LongRunningTest, GHExcludeAeronTest) in { testNodeRemoval(down = false) } @@ -215,7 +219,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "not remove registrations when self is shutdown" taggedAs (LongRunningTest) in { + "not remove registrations when self is shutdown".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-4", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -264,7 +268,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } - "work with services registered before node joins cluster" taggedAs (LongRunningTest) in { + "work with services registered before node joins cluster".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-5", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -322,7 +326,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "handle a new incarnation of the same node well" taggedAs (LongRunningTest) in { + "handle a new incarnation of the same node well".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-6", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -423,7 +427,9 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } // reproducer of issue #26284 - "handle a new incarnation of the same node that is no longer part of same cluster" taggedAs (LongRunningTest) in { + "handle a new incarnation of the same node that is no longer part of same cluster".taggedAs( + LongRunningTest, + GHExcludeAeronTest) in { val testKit1 = ActorTestKit( "ClusterReceptionistSpec-test-7", ConfigFactory.parseString(""" @@ -527,7 +533,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "not lose removals on concurrent updates to same key" taggedAs (LongRunningTest) in { + "not lose removals on concurrent updates to same key".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val config = ConfigFactory.parseString(""" # disable delta propagation so we can have repeatable concurrent writes # without delta reaching between nodes already @@ -598,7 +604,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "not conflict with the ClusterClient receptionist default name" taggedAs (LongRunningTest) in { + "not conflict with the ClusterClient receptionist default name".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit = ActorTestKit(s"ClusterReceptionistSpec-test-9", ClusterReceptionistSpec.config) try { testKit.system.systemActorOf(Behaviors.ignore, "receptionist") @@ -607,7 +613,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "handle unregistration and re-registration of services" taggedAs (LongRunningTest) in { + "handle unregistration and re-registration of services".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-10", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -665,7 +671,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } - "handle unregistration per key not per actor" taggedAs (LongRunningTest) in { + "handle unregistration per key not per actor".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-11", ClusterReceptionistSpec.config) val system1 = testKit1.system val testKit2 = ActorTestKit(system1.name, system1.settings.config) @@ -717,7 +723,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } - "handle concurrent unregistration and registration on different nodes" taggedAs (LongRunningTest) in { + "handle concurrent unregistration and registration on different nodes".taggedAs(LongRunningTest, GHExcludeAeronTest) in { // this covers the fact that with ddata a removal can be lost val testKit1 = ActorTestKit("ClusterReceptionistSpec-test-12", ClusterReceptionistSpec.config) val system1 = testKit1.system @@ -776,7 +782,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } // Fixme concurrent registration and unregistration - "notify subscribers when registering and joining simultaneously" taggedAs (LongRunningTest) in { + "notify subscribers when registering and joining simultaneously".taggedAs(LongRunningTest, GHExcludeAeronTest) in { // failing test reproducer for issue #28792 // It's possible that the registry entry from the ddata update arrives before MemberJoined. val config = ConfigFactory.parseString(""" @@ -839,7 +845,7 @@ class ClusterReceptionistSpec extends AnyWordSpec with Matchers with LogCapturin } } - "never use durable store" taggedAs (LongRunningTest) in { + "never use durable store".taggedAs(LongRunningTest, GHExcludeAeronTest) in { val testKit = ActorTestKit("ClusterReceptionistSpec-test-14", ClusterReceptionistSpec.config) val system = testKit.system try { diff --git a/akka-cluster/src/test/scala/akka/cluster/JoinConfigCompatCheckerRollingUpdateSpec.scala b/akka-cluster/src/test/scala/akka/cluster/JoinConfigCompatCheckerRollingUpdateSpec.scala index 57be942f1e..4d25b28ff4 100644 --- a/akka-cluster/src/test/scala/akka/cluster/JoinConfigCompatCheckerRollingUpdateSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/JoinConfigCompatCheckerRollingUpdateSpec.scala @@ -6,7 +6,10 @@ package akka.cluster import scala.collection.{ immutable => im } import scala.concurrent.duration._ + import com.typesafe.config.{ Config, ConfigFactory } + +import akka.testkit.GHExcludeAeronTest import akka.testkit.LongRunningTest object JoinConfigCompatCheckerRollingUpdateSpec { @@ -47,14 +50,18 @@ class JoinConfigCompatCheckerRollingUpdateSpec "A Node" must { val timeout = 20.seconds - "NOT be allowed to re-join a cluster if it has a new, additional configuration the others do not have and not the old" taggedAs LongRunningTest in { + "NOT be allowed to re-join a cluster if it has a new, additional configuration the others do not have and not the old" + .taggedAs(LongRunningTest, GHExcludeAeronTest) in { // confirms the 2 attempted re-joins fail with both nodes being terminated upgradeCluster(3, v1Config, v2ConfigIncompatible, timeout, timeout, enforced = true, shouldRejoin = false) } - "be allowed to re-join a cluster if it has a new, additional property and checker the others do not have" taggedAs LongRunningTest in { + "be allowed to re-join a cluster if it has a new, additional property and checker the others do not have".taggedAs( + LongRunningTest, + GHExcludeAeronTest) in { upgradeCluster(3, v1Config, v2Config, timeout, timeout * 3, enforced = true, shouldRejoin = true) } - "be allowed to re-join a cluster if it has a new, additional configuration the others do not have and configured to NOT enforce it" taggedAs LongRunningTest in { + "be allowed to re-join a cluster if it has a new, additional configuration the others do not have and configured to NOT enforce it" + .taggedAs(LongRunningTest, GHExcludeAeronTest) in { upgradeCluster(3, v1Config, v2Config, timeout, timeout * 3, enforced = false, shouldRejoin = true) } } diff --git a/akka-testkit/src/test/scala/akka/testkit/TestTags.scala b/akka-testkit/src/test/scala/akka/testkit/TestTags.scala index ff91a88231..8a17412581 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestTags.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestTags.scala @@ -11,3 +11,4 @@ object LongRunningTest extends Tag("long-running") object PerformanceTest extends Tag("performance") object GHExcludeTest extends Tag("gh-exclude") +object GHExcludeAeronTest extends Tag("gh-exclude-aeron")