From d0670cc2477c85ca96f4a18dc328002ef0c8493d Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 15:05:55 -0600 Subject: [PATCH 01/11] spectator 1.8.4 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 0691cbd47..33315e222 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -11,7 +11,7 @@ object Dependencies { val log4j = "2.24.3" val scala = "2.13.15" val slf4j = "2.0.16" - val spectator = "1.8.3" + val spectator = "1.8.4" val spring = "6.1.16" val crossScala = Seq(scala, "3.5.1") From 188b2f4d50a9f7b43671959724d805d032345b89 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 15:07:25 -0600 Subject: [PATCH 02/11] iep 5.0.30 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 33315e222..c1eda72d1 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,7 +6,7 @@ object Dependencies { object Versions { val pekko = "1.1.2" val pekkoHttpV = "1.1.0" - val iep = "5.0.29" + val iep = "5.0.30" val jackson = "2.18.2" val log4j = "2.24.3" val scala = "2.13.15" From 10d2461e49ef3010fe077081377607e86278ff0a Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 15:08:06 -0600 Subject: [PATCH 03/11] scala-collection-compat 2.13.0 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index c1eda72d1..a63dd8996 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -55,7 +55,7 @@ object Dependencies { val postgres = "org.postgresql" % "postgresql" % "42.7.4" val postgresEmbedded = "io.zonky.test" % "embedded-postgres" % "2.1.0" val roaringBitmap = "org.roaringbitmap" % "RoaringBitmap" % "1.3.0" - val scalaCompat = "org.scala-lang.modules" %% "scala-collection-compat" % "2.12.0" + val scalaCompat = "org.scala-lang.modules" %% "scala-collection-compat" % "2.13.0" val scalaCompatJdk8 = "org.scala-lang.modules" %% "scala-java8-compat" % "1.0.2" val scalaCompiler = "org.scala-lang" % "scala-compiler" val scalaLibrary = "org.scala-lang" % "scala-library" From 775993022c8056bd868e34ba620cc11f7f0e31b3 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 15:09:34 -0600 Subject: [PATCH 04/11] scala 2.13.16 Switch from AnyRefMap to HashMap to fix deprecation warnings. --- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/snapshot.yml | 2 +- .../com/netflix/atlas/core/model/StatefulExpr.scala | 2 +- .../main/scala/com/netflix/atlas/core/util/Hash.scala | 10 ++++------ .../com/netflix/atlas/eval/model/AggrDatapoint.scala | 2 +- .../com/netflix/atlas/eval/stream/FinalExprEval.scala | 2 +- .../netflix/atlas/eval/stream/LwcToAggrDatapoint.scala | 4 ++-- .../scala/com/netflix/atlas/pekko/ClusterOps.scala | 2 +- .../com/netflix/atlas/postgres/PostgresDatabase.scala | 2 +- project/Dependencies.scala | 2 +- 11 files changed, 15 insertions(+), 17 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d6d0c6ec2..50cac42f0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: java: [17, 23] - scala: [2.13.15, 3.5.1] + scala: [2.13.16, 3.5.1] steps: - uses: actions/checkout@v3 - name: Set up JDK ${{ matrix.java }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bb18fa1de..c5e037206 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,5 +31,5 @@ jobs: PGP_PASSPHRASE: ${{ secrets.ORG_SIGNING_PASSWORD }} run: | git fetch --unshallow --tags - cat /dev/null | project/sbt ++2.13.15 clean test +publishSigned + cat /dev/null | project/sbt ++2.13.16 clean test +publishSigned cat /dev/null | project/sbt sonatypeBundleRelease diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml index 54cfec074..b2358214a 100644 --- a/.github/workflows/snapshot.yml +++ b/.github/workflows/snapshot.yml @@ -31,4 +31,4 @@ jobs: PGP_PASSPHRASE: ${{ secrets.ORG_SIGNING_PASSWORD }} run: | git fetch --unshallow --tags - cat /dev/null | project/sbt ++2.13.15 clean test +publishSigned + cat /dev/null | project/sbt ++2.13.16 clean test +publishSigned diff --git a/atlas-core/src/main/scala/com/netflix/atlas/core/model/StatefulExpr.scala b/atlas-core/src/main/scala/com/netflix/atlas/core/model/StatefulExpr.scala index dfdbb5d01..8e607d1b2 100644 --- a/atlas-core/src/main/scala/com/netflix/atlas/core/model/StatefulExpr.scala +++ b/atlas-core/src/main/scala/com/netflix/atlas/core/model/StatefulExpr.scala @@ -247,7 +247,7 @@ object StatefulExpr { */ trait OnlineExpr extends StatefulExpr { - type StateMap = scala.collection.mutable.AnyRefMap[ItemId, AlgoState] + type StateMap = scala.collection.mutable.HashMap[ItemId, AlgoState] protected def name: String diff --git a/atlas-core/src/main/scala/com/netflix/atlas/core/util/Hash.scala b/atlas-core/src/main/scala/com/netflix/atlas/core/util/Hash.scala index 0ec2796fe..1dcc98378 100644 --- a/atlas-core/src/main/scala/com/netflix/atlas/core/util/Hash.scala +++ b/atlas-core/src/main/scala/com/netflix/atlas/core/util/Hash.scala @@ -47,8 +47,8 @@ object Hash { // https://github.com/jruby/jruby/commit/e840823c435393e8365be1bae93f646c1bb0043f private val cloneableDigests = createDigests() - private def createDigests(): scala.collection.mutable.AnyRefMap[String, MessageDigest] = { - val digests = new scala.collection.mutable.AnyRefMap[String, MessageDigest]() + private def createDigests(): scala.collection.mutable.HashMap[String, MessageDigest] = { + val digests = new scala.collection.mutable.HashMap[String, MessageDigest]() List("MD5", "SHA1").foreach { algorithm => Try(MessageDigest.getInstance(algorithm)).foreach { digest => // Try to clone the digest to make sure it is cloneable @@ -61,11 +61,9 @@ object Hash { } def get(algorithm: String): MessageDigest = { - val digest = cloneableDigests.getOrNull(algorithm) - if (digest != null) + cloneableDigests.get(algorithm).fold(MessageDigest.getInstance(algorithm)) { digest => digest.clone().asInstanceOf[MessageDigest] - else - MessageDigest.getInstance(algorithm) + } } def md5(input: Array[Byte]): BigInteger = { diff --git a/atlas-eval/src/main/scala/com/netflix/atlas/eval/model/AggrDatapoint.scala b/atlas-eval/src/main/scala/com/netflix/atlas/eval/model/AggrDatapoint.scala index 2ae5582b0..11b9558a9 100644 --- a/atlas-eval/src/main/scala/com/netflix/atlas/eval/model/AggrDatapoint.scala +++ b/atlas-eval/src/main/scala/com/netflix/atlas/eval/model/AggrDatapoint.scala @@ -217,7 +217,7 @@ object AggrDatapoint { private class GroupByAggregator(settings: AggregatorSettings) extends Aggregator(settings) { private val aggregators = - scala.collection.mutable.AnyRefMap.empty[Map[String, String], Aggregator] + scala.collection.mutable.HashMap.empty[Map[String, String], Aggregator] private def newAggregator(datapoint: AggrDatapoint): Aggregator = { datapoint.expr match { diff --git a/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/FinalExprEval.scala b/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/FinalExprEval.scala index 5da4b83b1..1b9b25178 100644 --- a/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/FinalExprEval.scala +++ b/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/FinalExprEval.scala @@ -72,7 +72,7 @@ private[stream] class FinalExprEval(exprInterpreter: ExprInterpreter, enableNoDa // Maintains the state for each expression we need to evaluate. TODO: implement // limits to sanity check against running of our memory private val states = - scala.collection.mutable.AnyRefMap.empty[StyleExpr, Map[StatefulExpr, Any]] + scala.collection.mutable.HashMap.empty[StyleExpr, Map[StatefulExpr, Any]] // Step size for datapoints flowing through, it will be determined by the first data // sources message that arrives and should be consistent for the life of this stage diff --git a/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/LwcToAggrDatapoint.scala b/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/LwcToAggrDatapoint.scala index e076220c1..3895d4966 100644 --- a/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/LwcToAggrDatapoint.scala +++ b/atlas-eval/src/main/scala/com/netflix/atlas/eval/stream/LwcToAggrDatapoint.scala @@ -61,8 +61,8 @@ private[stream] class LwcToAggrDatapoint(context: StreamContext) override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = { new GraphStageLogic(shape) with InHandler with OutHandler { - private val tsState = scala.collection.mutable.AnyRefMap.empty[String, DatapointMetadata] - private val eventState = scala.collection.mutable.AnyRefMap.empty[String, String] + private val tsState = scala.collection.mutable.HashMap.empty[String, DatapointMetadata] + private val eventState = scala.collection.mutable.HashMap.empty[String, String] override def onPush(): Unit = { val dpBuilder = List.newBuilder[AggrDatapoint] diff --git a/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ClusterOps.scala b/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ClusterOps.scala index a7ac75ddd..d224db572 100644 --- a/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ClusterOps.scala +++ b/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ClusterOps.scala @@ -101,7 +101,7 @@ object ClusterOps extends StrictLogging { new GraphStageLogic(shape) with InHandler with OutHandler { private val registry = context.registry - private val membersSources = mutable.AnyRefMap.empty[M, SourceQueue[D]] + private val membersSources = mutable.HashMap.empty[M, SourceQueue[D]] override def onPush(): Unit = { val msg = grab(in) diff --git a/atlas-postgres/src/main/scala/com/netflix/atlas/postgres/PostgresDatabase.scala b/atlas-postgres/src/main/scala/com/netflix/atlas/postgres/PostgresDatabase.scala index db1eb42f3..9351d6cf7 100644 --- a/atlas-postgres/src/main/scala/com/netflix/atlas/postgres/PostgresDatabase.scala +++ b/atlas-postgres/src/main/scala/com/netflix/atlas/postgres/PostgresDatabase.scala @@ -98,7 +98,7 @@ class PostgresDatabase(postgres: PostgresService) extends Database { override def execute(ctxt: EvalContext, expr: DataExpr): List[TimeSeries] = { val exactTags = Query.tags(expr.query) - val data = mutable.AnyRefMap.empty[Map[String, String], TimeSeriesBuffer] + val data = mutable.HashMap.empty[Map[String, String], TimeSeriesBuffer] postgres.runQueries { stmt => overlappingTimes(stmt, ctxt).foreach { t => val block = ArrayBlock(t.toEpochMilli, blockSize) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a63dd8996..da6a1ab4a 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -9,7 +9,7 @@ object Dependencies { val iep = "5.0.30" val jackson = "2.18.2" val log4j = "2.24.3" - val scala = "2.13.15" + val scala = "2.13.16" val slf4j = "2.0.16" val spectator = "1.8.4" val spring = "6.1.16" From 6362f71b76f049c9f4000fc72f54550c3b61a551 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 17:54:38 -0600 Subject: [PATCH 05/11] munit 1.1.0 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index da6a1ab4a..bbe218163 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -51,7 +51,7 @@ object Dependencies { val log4jJcl = "org.apache.logging.log4j" % "log4j-jcl" % log4j val log4jJul = "org.apache.logging.log4j" % "log4j-jul" % log4j val log4jSlf4j = "org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j - val munit = "org.scalameta" %% "munit" % "1.0.3" + val munit = "org.scalameta" %% "munit" % "1.1.0" val postgres = "org.postgresql" % "postgresql" % "42.7.4" val postgresEmbedded = "io.zonky.test" % "embedded-postgres" % "2.1.0" val roaringBitmap = "org.roaringbitmap" % "RoaringBitmap" % "1.3.0" From ea9db788e071743b8b4e2a197b619dc7337bda7d Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 17:55:03 -0600 Subject: [PATCH 06/11] spring 6.2.2 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index bbe218163..bc2255609 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -12,7 +12,7 @@ object Dependencies { val scala = "2.13.16" val slf4j = "2.0.16" val spectator = "1.8.4" - val spring = "6.1.16" + val spring = "6.2.2" val crossScala = Seq(scala, "3.5.1") } From f3a9ff0f5273ca489bf1c46febf5952c94578e6d Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 18:58:03 -0600 Subject: [PATCH 07/11] caffeine 3.2.0 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index bc2255609..611ea97d5 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -27,7 +27,7 @@ object Dependencies { val pekkoStream = "org.apache.pekko" %% "pekko-stream" % pekko val pekkoStreamTestkit= "org.apache.pekko" %% "pekko-stream-testkit" % pekko val pekkoTestkit = "org.apache.pekko" %% "pekko-testkit" % pekko - val caffeine = "com.github.ben-manes.caffeine" % "caffeine" % "3.1.8" + val caffeine = "com.github.ben-manes.caffeine" % "caffeine" % "3.2.0" val datasketches = "org.apache.datasketches" % "datasketches-java" % "6.1.1" val equalsVerifier = "nl.jqno.equalsverifier" % "equalsverifier" % "3.18" val hikariCP = "com.zaxxer" % "HikariCP" % "6.2.1" From 89ac3cf00aeba41458d0fcc3f081115e0e0d61d7 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 18:58:53 -0600 Subject: [PATCH 08/11] postgresql 42.7.5 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 611ea97d5..c99fda2cc 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -52,7 +52,7 @@ object Dependencies { val log4jJul = "org.apache.logging.log4j" % "log4j-jul" % log4j val log4jSlf4j = "org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j val munit = "org.scalameta" %% "munit" % "1.1.0" - val postgres = "org.postgresql" % "postgresql" % "42.7.4" + val postgres = "org.postgresql" % "postgresql" % "42.7.5" val postgresEmbedded = "io.zonky.test" % "embedded-postgres" % "2.1.0" val roaringBitmap = "org.roaringbitmap" % "RoaringBitmap" % "1.3.0" val scalaCompat = "org.scala-lang.modules" %% "scala-collection-compat" % "2.13.0" From e82434e03fc5a51860a9db47cf9529131436f110 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 18:59:36 -0600 Subject: [PATCH 09/11] equalsverifier 3.19 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index c99fda2cc..7fcef6baa 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -29,7 +29,7 @@ object Dependencies { val pekkoTestkit = "org.apache.pekko" %% "pekko-testkit" % pekko val caffeine = "com.github.ben-manes.caffeine" % "caffeine" % "3.2.0" val datasketches = "org.apache.datasketches" % "datasketches-java" % "6.1.1" - val equalsVerifier = "nl.jqno.equalsverifier" % "equalsverifier" % "3.18" + val equalsVerifier = "nl.jqno.equalsverifier" % "equalsverifier" % "3.19" val hikariCP = "com.zaxxer" % "HikariCP" % "6.2.1" val iepLeaderApi = "com.netflix.iep" % "iep-leader-api" % iep val iepLeaderDynamoDb = "com.netflix.iep" % "iep-leader-dynamodb" % iep From 525159d19afd2f50c7d3edbd7673b5ff52b3e58e Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Fri, 7 Feb 2025 19:00:30 -0600 Subject: [PATCH 10/11] datasketches-java 7.0.1 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 7fcef6baa..26e0cb2ec 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -28,7 +28,7 @@ object Dependencies { val pekkoStreamTestkit= "org.apache.pekko" %% "pekko-stream-testkit" % pekko val pekkoTestkit = "org.apache.pekko" %% "pekko-testkit" % pekko val caffeine = "com.github.ben-manes.caffeine" % "caffeine" % "3.2.0" - val datasketches = "org.apache.datasketches" % "datasketches-java" % "6.1.1" + val datasketches = "org.apache.datasketches" % "datasketches-java" % "7.0.1" val equalsVerifier = "nl.jqno.equalsverifier" % "equalsverifier" % "3.19" val hikariCP = "com.zaxxer" % "HikariCP" % "6.2.1" val iepLeaderApi = "com.netflix.iep" % "iep-leader-api" % iep From c9dcdff422843335a71724d1d712a6b0dc298088 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Sun, 9 Feb 2025 17:38:49 -0600 Subject: [PATCH 11/11] webapi: force eager creation of beans In spring 6.2.x there are some additional checks about creating singletons in multiple threads. This would sometimes get triggered by the database getting created in another thread for the actor. --- .../src/main/scala/com/netflix/atlas/pekko/ActorService.scala | 2 ++ project/Dependencies.scala | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ActorService.scala b/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ActorService.scala index 635d5a43e..48e479063 100644 --- a/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ActorService.scala +++ b/atlas-pekko/src/main/scala/com/netflix/atlas/pekko/ActorService.scala @@ -55,6 +55,8 @@ class ActorService( classOf[Config] -> config, classOf[Registry] -> registry ).withDefaultValue(null) + // Force eager loading of dependencies to avoid locking issues with singleton beans + classFactory.verifyDependencies(cls, bindings.asJava) val props = Props(classFactory.newInstance[Actor](cls, bindings.asJava)) val routerCfgPath = s"pekko.actor.deployment./$name.router" if (config.hasPath(routerCfgPath)) FromConfig.props(props) else props diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 26e0cb2ec..a0a00f209 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,7 +6,7 @@ object Dependencies { object Versions { val pekko = "1.1.2" val pekkoHttpV = "1.1.0" - val iep = "5.0.30" + val iep = "5.0.31" val jackson = "2.18.2" val log4j = "2.24.3" val scala = "2.13.16"