ijuma commented on a change in pull request #8467: URL: https://github.com/apache/kafka/pull/8467#discussion_r413826884
########## File path: core/src/main/scala/kafka/log/LogManager.scala ########## @@ -1003,9 +1003,17 @@ class LogManager(logDirs: Seq[File], /** * Map of log dir to logs by topic and partitions in that dir */ - private def logsByDir: Map[String, Map[TopicPartition, Log]] = { - (this.currentLogs.toList ++ this.futureLogs.toList).toMap - .groupBy { case (_, log) => log.parentDir } + def logsByDir: Map[String, Map[TopicPartition, Log]] = { + // This code is called often by checkpoint processes and is written in a way that reduces + // allocations and CPU with many topic partitions. + // When changing this code please measure the changes with org.apache.kafka.jmh.server.CheckpointBench + val byDir = new mutable.AnyRefMap[String, mutable.AnyRefMap[TopicPartition, Log]]() + def addToDir(tp: TopicPartition, log: Log): Unit = { + byDir.getOrElseUpdate(log.parentDir, new mutable.AnyRefMap[TopicPartition, Log]()).put(tp, log) + } + currentLogs.foreach { case (tp, log) => addToDir(tp, log) } + futureLogs.foreach { case (tp, log) => addToDir(tp, log) } Review comment: `scala.collection.Map` has a `def foreachEntry[U](f: (K, V) => U): Unit` method that avoids allocating tuples (it's a function with two parameters). If we want to avoid allocations, we should introduce one such method to `Pool` and use it here. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org