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

shunping pushed a commit to branch debug-flink-load-test
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/debug-flink-load-test by this 
push:
     new a6e1302c249 Fix
a6e1302c249 is described below

commit a6e1302c2496f47f6e541a41f3995a477ef93b08
Author: Shunping Huang <[email protected]>
AuthorDate: Fri Jun 26 13:41:53 2026 -0400

    Fix
---
 .../flink/FlinkPipelineExecutionEnvironment.java   |   6 +-
 .../beam/runners/flink/FlinkSubmissionTest.java    | 133 +++++++++++++++++----
 .../streaming/io/UnboundedSourceWrapperTest.java   |  13 +-
 runners/flink/flink_runner.gradle                  |   4 +
 4 files changed, 128 insertions(+), 28 deletions(-)

diff --git 
a/runners/flink/2.0/src/main/java/org/apache/beam/runners/flink/FlinkPipelineExecutionEnvironment.java
 
b/runners/flink/2.0/src/main/java/org/apache/beam/runners/flink/FlinkPipelineExecutionEnvironment.java
index 758ded42aff..9c311b81c30 100644
--- 
a/runners/flink/2.0/src/main/java/org/apache/beam/runners/flink/FlinkPipelineExecutionEnvironment.java
+++ 
b/runners/flink/2.0/src/main/java/org/apache/beam/runners/flink/FlinkPipelineExecutionEnvironment.java
@@ -176,7 +176,11 @@ class FlinkPipelineExecutionEnvironment {
     return new FlinkDetachedRunnerResult(jobClient, 
options.getJobCheckIntervalInSecs());
   }
 
-  private FlinkRunnerResult createAttachedPipelineResult(JobExecutionResult 
result) {
+  private PipelineResult createAttachedPipelineResult(JobExecutionResult 
result) {
+    if (result instanceof 
org.apache.flink.core.execution.DetachedJobExecutionResult) {
+      LOG.info("Pipeline submitted in detached mode");
+      return new FlinkRunnerResult(java.util.Collections.emptyMap(), -1L);
+    }
     LOG.info("Execution finished in {} msecs", result.getNetRuntime());
     Map<String, Object> accumulators = result.getAllAccumulatorResults();
     if (accumulators != null && !accumulators.isEmpty()) {
diff --git 
a/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/FlinkSubmissionTest.java
 
b/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/FlinkSubmissionTest.java
index 66079f855a7..58a9b6d2144 100644
--- 
a/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/FlinkSubmissionTest.java
+++ 
b/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/FlinkSubmissionTest.java
@@ -19,7 +19,7 @@ package org.apache.beam.runners.flink;
 
 import java.io.File;
 import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
+import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.security.Permission;
@@ -68,7 +68,7 @@ public class FlinkSubmissionTest {
   private static transient RemoteMiniCluster flinkCluster;
 
   /** Each test has a timeout of 60 seconds (for safety). */
-  @Rule public Timeout timeout = new Timeout(60, TimeUnit.SECONDS);
+  @Rule public Timeout timeout = new Timeout(5, TimeUnit.SECONDS);
 
   /** Counter which keeps track of the number of jobs submitted. */
   private static int expectedNumberOfJobs;
@@ -148,7 +148,9 @@ public class FlinkSubmissionTest {
       // Run end-to-end test
       CliFrontend.main(args.toArray(new String[0]));
     } catch (SystemExitException e) {
-      // The CliFrontend exited and we can move on to check if the job has 
finished
+      if (e.getStatus() != 0) {
+        throw new AssertionError("CliFrontend exited with status " + 
e.getStatus());
+      }
     } finally {
       restoreDefaultSystemExitBehavior();
     }
@@ -173,13 +175,22 @@ public class FlinkSubmissionTest {
 
   /** The Flink program which is executed by the CliFrontend. */
   public static void main(String[] args) {
-    FlinkPipelineOptions options =
-        
PipelineOptionsFactory.fromArgs(args).withValidation().as(FlinkPipelineOptions.class);
-    options.setRunner(FlinkRunner.class);
-    options.setParallelism(1);
-    Pipeline p = Pipeline.create(options);
-    p.apply(GenerateSequence.from(0).to(1));
-    p.run();
+    System.out.println("!!! FlinkSubmissionTest.main started !!!");
+    try {
+      FlinkPipelineOptions options =
+          
PipelineOptionsFactory.fromArgs(args).withValidation().as(FlinkPipelineOptions.class);
+      options.setRunner(FlinkRunner.class);
+      options.setParallelism(1);
+      Pipeline p = Pipeline.create(options);
+      p.apply(GenerateSequence.from(0).to(1));
+      System.out.println("!!! Running pipeline !!!");
+      p.run();
+      System.out.println("!!! Pipeline run completed !!!");
+    } catch (Throwable t) {
+      System.err.println("!!! Exception in main: " + t);
+      t.printStackTrace();
+      throw t;
+    }
   }
 
   private static void prepareEnvironment() throws Exception {
@@ -187,10 +198,14 @@ public class FlinkSubmissionTest {
     File file = TEMP_FOLDER.newFile("config.yaml");
     String config =
         String.format(
-            "rest:\n  port: '%d'\njobmanager:\n  rpc:\n    address: %s\n    
port: '%d'",
+            "rest.port: %d\njobmanager.rpc.address: %s\njobmanager.rpc.port: 
%d\n",
             flinkCluster.getRestPort(), "localhost", 
flinkCluster.getClusterPort());
 
     Files.write(file.toPath(), config.getBytes(StandardCharsets.UTF_8));
+    System.out.println("!!! config.yaml path: " + file.getAbsolutePath());
+    System.out.println(
+        "!!! config.yaml content:\n"
+            + new String(Files.readAllBytes(file.toPath()), 
StandardCharsets.UTF_8));
 
     // Create a new environment with the location of the Flink config for 
CliFrontend
     ImmutableMap<String, String> newEnv =
@@ -199,7 +214,26 @@ public class FlinkSubmissionTest {
             .put(ConfigConstants.ENV_FLINK_CONF_DIR, file.getParent())
             .build();
 
+    Class<?> processEnvClass = Class.forName("java.lang.ProcessEnvironment");
+    System.out.println("!!! Inspecting ProcessEnvironment fields:");
+    for (Field f : processEnvClass.getDeclaredFields()) {
+      try {
+        f.setAccessible(true);
+        Object val = f.get(null);
+        System.out.println(
+            "!!!   Field name: "
+                + f.getName()
+                + ", type: "
+                + f.getType()
+                + ", value type: "
+                + (val == null ? "null" : val.getClass().getName()));
+      } catch (Exception e) {
+        System.out.println(
+            "!!!   Field name: " + f.getName() + " (error reading value: " + e 
+ ")");
+      }
+    }
     modifyEnv(newEnv);
+    System.out.println("!!! System.getenv(\"FLINK_CONF_DIR\"): " + 
System.getenv("FLINK_CONF_DIR"));
   }
 
   private static void restoreEnvironment() throws Exception {
@@ -212,29 +246,70 @@ public class FlinkSubmissionTest {
    * be set using the {@code ConfigConstants.ENV_FLINK_CONF_DIR} environment 
variable.
    */
   private static void modifyEnv(Map<String, String> env) throws Exception {
-    Class processEnv = Class.forName("java.lang.ProcessEnvironment");
-    Field envField = processEnv.getDeclaredField("theUnmodifiableEnvironment");
-
-    Field modifiersField = Field.class.getDeclaredField("modifiers");
-    modifiersField.setAccessible(true);
-    modifiersField.setInt(envField, envField.getModifiers() & ~Modifier.FINAL);
+    Class<?> processEnvClass = Class.forName("java.lang.ProcessEnvironment");
+    Field theEnvironmentField = 
processEnvClass.getDeclaredField("theEnvironment");
+    theEnvironmentField.setAccessible(true);
+    Map<Object, Object> envMap = (Map<Object, Object>) 
theEnvironmentField.get(null);
+    envMap.clear();
+
+    Class<?> variableClass = null;
+    Method variableValueOf = null;
+    Class<?> valueClass = null;
+    Method valueValueOf = null;
+    try {
+      variableClass = Class.forName("java.lang.ProcessEnvironment$Variable");
+      variableValueOf = variableClass.getDeclaredMethod("valueOf", 
String.class);
+      variableValueOf.setAccessible(true);
+
+      valueClass = Class.forName("java.lang.ProcessEnvironment$Value");
+      valueValueOf = valueClass.getDeclaredMethod("valueOf", String.class);
+      valueValueOf.setAccessible(true);
+    } catch (ClassNotFoundException e) {
+      // String keys/values (e.g. on Windows)
+    }
 
-    envField.setAccessible(true);
-    envField.set(null, env);
-    envField.setAccessible(false);
+    for (Map.Entry<String, String> entry : env.entrySet()) {
+      Object key =
+          (variableValueOf != null) ? variableValueOf.invoke(null, 
entry.getKey()) : entry.getKey();
+      Object val =
+          (valueValueOf != null) ? valueValueOf.invoke(null, entry.getValue()) 
: entry.getValue();
+      envMap.put(key, val);
+    }
 
-    modifiersField.setInt(envField, envField.getModifiers() & Modifier.FINAL);
-    modifiersField.setAccessible(false);
+    try {
+      Field theCaseInsensitiveEnvironmentField =
+          processEnvClass.getDeclaredField("theCaseInsensitiveEnvironment");
+      theCaseInsensitiveEnvironmentField.setAccessible(true);
+      Map<Object, Object> cienvMap =
+          (Map<Object, Object>) theCaseInsensitiveEnvironmentField.get(null);
+      cienvMap.clear();
+      for (Map.Entry<String, String> entry : env.entrySet()) {
+        Object key =
+            (variableValueOf != null)
+                ? variableValueOf.invoke(null, entry.getKey())
+                : entry.getKey();
+        Object val =
+            (valueValueOf != null) ? valueValueOf.invoke(null, 
entry.getValue()) : entry.getValue();
+        cienvMap.put(key, val);
+      }
+    } catch (NoSuchFieldException e) {
+      // Ignore if not on Windows
+    }
   }
 
   /** Prevents the CliFrontend from calling System.exit. */
   private static void throwExceptionOnSystemExit() {
     System.setSecurityManager(
         new SecurityManager() {
+          @Override
+          public void checkExit(int status) {
+            throw new SystemExitException(status);
+          }
+
           @Override
           public void checkPermission(Permission permission) {
             if (permission.getName().startsWith("exitVM")) {
-              throw new SystemExitException();
+              throw new SystemExitException(0);
             }
             if (SECURITY_MANAGER != null) {
               SECURITY_MANAGER.checkPermission(permission);
@@ -247,5 +322,15 @@ public class FlinkSubmissionTest {
     System.setSecurityManager(SECURITY_MANAGER);
   }
 
-  private static class SystemExitException extends SecurityException {}
+  private static class SystemExitException extends SecurityException {
+    private final int status;
+
+    public SystemExitException(int status) {
+      this.status = status;
+    }
+
+    public int getStatus() {
+      return status;
+    }
+  }
 }
diff --git 
a/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/translation/wrappers/streaming/io/UnboundedSourceWrapperTest.java
 
b/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/translation/wrappers/streaming/io/UnboundedSourceWrapperTest.java
index 48939b0cbbf..86fb3285071 100644
--- 
a/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/translation/wrappers/streaming/io/UnboundedSourceWrapperTest.java
+++ 
b/runners/flink/2.0/src/test/java/org/apache/beam/runners/flink/translation/wrappers/streaming/io/UnboundedSourceWrapperTest.java
@@ -684,9 +684,16 @@ public class UnboundedSourceWrapperTest {
           // The expected state is for finalizeSource to sleep instead of 
exiting
           while (true) {
             StackTraceElement[] callStack = thread.getStackTrace();
-            if (callStack.length >= 2
-                && "sleep".equals(callStack[0].getMethodName())
-                && "finalizeSource".equals(callStack[1].getMethodName())) {
+            boolean isSleepingInFinalizeSource = false;
+            for (int i = 0; i < callStack.length - 1; i++) {
+              if ("finalizeSource".equals(callStack[i + 1].getMethodName())
+                  && ("sleep".equals(callStack[i].getMethodName())
+                      || "sleep0".equals(callStack[i].getMethodName()))) {
+                isSleepingInFinalizeSource = true;
+                break;
+              }
+            }
+            if (isSleepingInFinalizeSource) {
               break;
             }
             Thread.sleep(10);
diff --git a/runners/flink/flink_runner.gradle 
b/runners/flink/flink_runner.gradle
index 837561ec71b..7dbe39a27ba 100644
--- a/runners/flink/flink_runner.gradle
+++ b/runners/flink/flink_runner.gradle
@@ -187,6 +187,10 @@ test {
   // Change log level to debug only for the package and nested packages:
   // systemProperty 
"org.slf4j.simpleLogger.log.org.apache.beam.runners.flink.translation.wrappers.streaming",
 "debug"
   jvmArgs "-XX:-UseGCOverheadLimit"
+  jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
+  jvmArgs "--add-opens=java.base/java.util=ALL-UNNAMED"
+  jvmArgs "--add-opens=java.base/java.nio=ALL-UNNAMED"
+  jvmArgs "-Djava.security.manager=allow"
   if (System.getProperty("beamSurefireArgline")) {
     jvmArgs System.getProperty("beamSurefireArgline")
   }

Reply via email to