From 7c019a2bd9861b99ead0f236d7ac1448c7c9c534 Mon Sep 17 00:00:00 2001 From: Ben Hollis Date: Sat, 12 Sep 2026 02:27:54 +0000 Subject: [PATCH] Avoid plan comparison when change logging is disabled --- .../org/apache/spark/internal/Logging.scala | 4 +++ .../sql/catalyst/rules/RuleExecutor.scala | 33 +++++++++---------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/common/utils/src/main/scala/org/apache/spark/internal/Logging.scala b/common/utils/src/main/scala/org/apache/spark/internal/Logging.scala index 3fac57dbe5dda..2aba75dd897c0 100644 --- a/common/utils/src/main/scala/org/apache/spark/internal/Logging.scala +++ b/common/utils/src/main/scala/org/apache/spark/internal/Logging.scala @@ -307,6 +307,10 @@ trait Logging { log.isTraceEnabled } + protected def withLogLevel(level: Slf4jLevel)(f: => Unit): Unit = { + if (log.isEnabledForLevel(level)) f + } + protected def logBasedOnLevel(level: Slf4jLevel)(f: => MessageWithContext): Unit = { level match { case Slf4jLevel.TRACE => logTrace(f.message) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/rules/RuleExecutor.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/rules/RuleExecutor.scala index b5a35608a54e6..8a04a5431a68c 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/rules/RuleExecutor.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/rules/RuleExecutor.scala @@ -55,25 +55,24 @@ class PlanChangeLogger[TreeType <: TreeNode[_]] extends Logging { private val logBatches = SQLConf.get.planChangeBatches.map(Utils.stringToSeq) def logRule(ruleName: String, oldPlan: TreeType, newPlan: TreeType): Unit = { - if (!newPlan.fastEquals(oldPlan)) { - if (logRules.isEmpty || logRules.get.contains(ruleName)) { - def message(): MessageWithContext = { - val oldPlanStringWithOutput = oldPlan.treeString(verbose = false, - printOutputColumns = true) - val newPlanStringWithOutput = newPlan.treeString(verbose = false, - printOutputColumns = true) - // scalastyle:off line.size.limit + withLogLevel(logLevel) { + if ((logRules.isEmpty || logRules.get.contains(ruleName)) && + !newPlan.fastEquals(oldPlan)) { + val oldPlanStringWithOutput = oldPlan.treeString(verbose = false, + printOutputColumns = true) + val newPlanStringWithOutput = newPlan.treeString(verbose = false, + printOutputColumns = true) + // scalastyle:off line.size.limit + logBasedOnLevel(logLevel) { log""" - |=== Applying Rule ${MDC(RULE_NAME, ruleName)} === - |${MDC(QUERY_PLAN, sideBySide(oldPlan.treeString, newPlan.treeString).mkString("\n"))} - | - |Output Information: - |${MDC(QUERY_PLAN, sideBySide(oldPlanStringWithOutput, newPlanStringWithOutput).mkString("\n"))} - """.stripMargin - // scalastyle:on line.size.limit + |=== Applying Rule ${MDC(RULE_NAME, ruleName)} === + |${MDC(QUERY_PLAN, sideBySide(oldPlan.treeString, newPlan.treeString).mkString("\n"))} + | + |Output Information: + |${MDC(QUERY_PLAN, sideBySide(oldPlanStringWithOutput, newPlanStringWithOutput).mkString("\n"))} + """.stripMargin } - - logBasedOnLevel(logLevel)(message()) + // scalastyle:on line.size.limit } } }