Skip to content

Virtual threads and native image fails on NoSuchElementException #7818

Closed
@jkamon

Description

@jkamon

Describe the issue
Running multithreaded program build to native image using virtual threads and AccessController causes java.util.NoSuchElementException: null

Problem occurs only with virtual threads. 2 virtual threads are enough to cause the problem. Platform threads works as expected see attached replicator.zip.

We found this issue trying to run spring boot application as native build with virtual threads. Our application was using Apache HTTP5 client to create SSL connections. It uses SSLConnectionSocketFactory which works with socket inside AccessController (which is modified during native build).

Steps to reproduce the issue
Build:

  1. download attached replicator.zip
  2. unzip
  3. make clean install
  4. target folder contains replicator executable binary and jar file.

Run:

  1. simple execution of executor binary (./replicator) from target directory will cause exception see output below
  2. execution with java (java -jar replicator-1.0-SNAPSHOT.jar) will not cause exception

Describe GraalVM and your environment:
Environment used for replication of the issue:
java -version
openjdk version "21" 2023-09-19
OpenJDK Runtime Environment GraalVM CE 21+35.1 (build 21+35-jvmci-23.1-b15)
OpenJDK 64-Bit Server VM GraalVM CE 21+35.1 (build 21+35-jvmci-23.1-b15, mixed mode, sharing)

mvn -v
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: /home/USER/apache-maven-3.8.7
Java version: 21, vendor: GraalVM Community, runtime: /aplikace/USER/graalvm-community-openjdk-21+35.1
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.14.0-284.30.1.el9_2.x86_64", arch: "amd64", family: "unix"

uname -a
Linux HOST 5.14.0-284.30.1.el9_2.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Aug 25 09:13:12 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux

More details
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-0 - 2
Thread name: virtual-1 - 2
Thread name: virtual-0 - 2
Exception in thread "virtual-1" java.util.NoSuchElementException
at java.base@21/java.util.ArrayDeque.removeFirst(ArrayDeque.java:361)
at java.base@21/java.util.ArrayDeque.pop(ArrayDeque.java:592)
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.PrivilegedStack.pop(AccessControllerUtil.java:88)
at java.base@21/java.security.AccessController.executePrivileged(AccessController.java:116)
at java.base@21/java.security.AccessController.doPrivileged(AccessController.java:571)
at org.example.Main.lambda$main$1(Main.java:23)
at java.base@21/java.lang.VirtualThread.runWith(VirtualThread.java:341)
at java.base@21/java.lang.VirtualThread.run(VirtualThread.java:311)
at java.base@21/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:192)
Exception in thread "virtual-0" java.util.NoSuchElementException
at java.base@21/java.util.ArrayDeque.removeFirst(ArrayDeque.java:361)
at java.base@21/java.util.ArrayDeque.pop(ArrayDeque.java:592)
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.PrivilegedStack.pop(AccessControllerUtil.java:88)
at java.base@21/java.security.AccessController.executePrivileged(AccessController.java:116)
at java.base@21/java.security.AccessController.doPrivileged(AccessController.java:571)
at org.example.Main.lambda$main$1(Main.java:23)
at java.base@21/java.lang.VirtualThread.runWith(VirtualThread.java:341)
at java.base@21/java.lang.VirtualThread.run(VirtualThread.java:311)
at java.base@21/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:192)

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions