This is an automated email from the ASF dual-hosted git repository.

pchenxi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new e429792dd2 [#10223] Prevent sensitive Spark job environment values 
from being logged in SparkProcessBuilder (#10450)
e429792dd2 is described below

commit e429792dd2bdb23a9f61bc6e318cd5a2cf867700
Author: Lucas <[email protected]>
AuthorDate: Wed Mar 18 17:34:10 2026 +0800

    [#10223] Prevent sensitive Spark job environment values from being logged 
in SparkProcessBuilder (#10450)
    
    <!--
    1. Title: [#<issue>] <type>(<scope>): <subject>
       Examples:
         - "[#123] feat(operator): Support xxx"
         - "[#233] fix: Check null before access result in xxx"
         - "[MINOR] refactor: Fix typo in variable name"
         - "[MINOR] docs: Fix typo in README"
         - "[#255] test: Fix flaky test NameOfTheTest"
       Reference: https://www.conventionalcommits.org/en/v1.0.0/
    2. If the PR is unfinished, please mark this PR as draft.
    -->
    
    ### What changes were proposed in this pull request?
    
    - Modified SparkProcessBuilder.start() method to log only environment
    variable names instead of full key-value pairs
    
    ### Why are the changes needed?
    
    
    
    Fix: #10223
    
    ### Does this PR introduce _any_ user-facing change?
    
    
    ### How was this patch tested?
---
 .../gravitino/job/local/SparkProcessBuilder.java   |  4 +-
 .../job/local/TestSparkProcessBuilder.java         | 62 ++++++++++++++++++++++
 2 files changed, 64 insertions(+), 2 deletions(-)

diff --git 
a/core/src/main/java/org/apache/gravitino/job/local/SparkProcessBuilder.java 
b/core/src/main/java/org/apache/gravitino/job/local/SparkProcessBuilder.java
index d577c5af9f..918c48f564 100644
--- a/core/src/main/java/org/apache/gravitino/job/local/SparkProcessBuilder.java
+++ b/core/src/main/java/org/apache/gravitino/job/local/SparkProcessBuilder.java
@@ -125,9 +125,9 @@ public class SparkProcessBuilder extends 
LocalProcessBuilder {
     builder.redirectError(errorFile);
 
     LOG.info(
-        "Starting local Spark job with command: {}, environment variables: {}",
+        "Starting local Spark job with command: {}, environment variable 
names: {}",
         Joiner.on(" ").join(commandList),
-        Joiner.on(", ").withKeyValueSeparator(": 
").join(sparkJobTemplate.environments()));
+        Joiner.on(", ").join(sparkJobTemplate.environments().keySet()));
 
     try {
       return builder.start();
diff --git 
a/core/src/test/java/org/apache/gravitino/job/local/TestSparkProcessBuilder.java
 
b/core/src/test/java/org/apache/gravitino/job/local/TestSparkProcessBuilder.java
index 930bf1a4e0..12c2a69325 100644
--- 
a/core/src/test/java/org/apache/gravitino/job/local/TestSparkProcessBuilder.java
+++ 
b/core/src/test/java/org/apache/gravitino/job/local/TestSparkProcessBuilder.java
@@ -19,9 +19,12 @@
 
 package org.apache.gravitino.job.local;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.job.SparkJobTemplate;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -140,4 +143,63 @@ public class TestSparkProcessBuilder {
     Assertions.assertTrue(command4.contains("arg1"));
     Assertions.assertTrue(command4.contains("arg2"));
   }
+
+  @Test
+  public void testSparkEnvironmentInfoOutputWithoutValue() {
+    SparkJobTemplate template =
+        SparkJobTemplate.builder()
+            .withName("template4")
+            .withExecutable("/path/to/spark-demo.jar")
+            .withArguments(Lists.newArrayList("arg1", "arg2"))
+            .withClassName("com.example.MainClass")
+            .withConfigs(
+                ImmutableMap.of(
+                    "spark.executor.memory", "2g",
+                    "spark.executor.cores", "2"))
+            .withEnvironments(ImmutableMap.of("key1", "value1", "key2", 
"value2"))
+            .build();
+    Map<String, String> environments = template.environments();
+    String environmentKeys = Joiner.on(", ").join(environments.keySet());
+    Assertions.assertEquals("key1, key2", environmentKeys);
+  }
+
+  @Test
+  public void testSparkEnvironmentInfoWithEmptyMap() {
+    SparkJobTemplate template =
+        SparkJobTemplate.builder()
+            .withName("template4")
+            .withExecutable("/path/to/spark-demo.jar")
+            .withArguments(Lists.newArrayList("arg1", "arg2"))
+            .withClassName("com.example.MainClass")
+            .withConfigs(
+                ImmutableMap.of(
+                    "spark.executor.memory", "2g",
+                    "spark.executor.cores", "2"))
+            .withEnvironments(ImmutableMap.of())
+            .build();
+    Map<String, String> environments = template.environments();
+    String environmentKeys = Joiner.on(", ").join(environments.keySet());
+    Assertions.assertTrue(StringUtils.isBlank(environmentKeys));
+  }
+
+  @Test
+  public void testSparkEnvironmentInfoWithNullMap() {
+    SparkJobTemplate template =
+        SparkJobTemplate.builder()
+            .withName("template4")
+            .withExecutable("/path/to/spark-demo.jar")
+            .withArguments(Lists.newArrayList("arg1", "arg2"))
+            .withClassName("com.example.MainClass")
+            .withConfigs(
+                ImmutableMap.of(
+                    "spark.executor.memory", "2g",
+                    "spark.executor.cores", "2"))
+            .withEnvironments(null)
+            .build();
+    Map<String, String> environments = template.environments();
+    Assertions.assertNotNull(environments);
+    Assertions.assertTrue(environments.isEmpty());
+    String environmentKeys = Joiner.on(", ").join(environments.keySet());
+    Assertions.assertTrue(StringUtils.isBlank(environmentKeys));
+  }
 }

Reply via email to