On Fri, 12 Mar 2021 09:52:13 GMT, Jonathan Dowland <jdowl...@openjdk.org> wrote:
> This is an adaptation of a patch originally written by Shafi Ahmad in > a comment on the JBS page but never submitted or merged. > > With -Xcheck:jni, the method java.net.NetworkInterface.getAll very > quickly breaches the default JNI local refs threshold (32). Exactly when > this happens depends upon the number of network interfaces (in state "UP") > visible to Java. On Linux, with current Trunk, 2 network interfaces is > sufficient to breach: > > $ ./addif.sh 0 > 1 interfaces > $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest > (nothing) > $ ./addif.sh 1 > 2 interfaces > $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest > WARNING: JNI local refs: 33, exceeds capacity: 32 > at java.net.NetworkInterface.getAll(java.base/Native Method) > at > java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351) > at NITest.main(NITest.java:3) > > This patch improves the situation: > > $ ./addif.sh 3 > 4 interfaces > $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest > (nothing) > $ ./addif.sh 4 > 5 interfaces > $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest > WARNING: JNI local refs: 33, exceeds capacity: 32 > at java.net.NetworkInterface.getAll(java.base/Native Method) > at > java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351) > at NITest.main(NITest.java:3) > > > Once the JNI local refs threshold is breached, the threshold is raised. > With the patch, it takes 10 network interfaces to breach the new > threshold > > $ ./addif.sh 9 > 10 interfaces > $ sudo ip netns exec jbase $JAVA_HOME/bin/java -Xcheck:jni NITest > WARNING: JNI local refs: 33, exceeds capacity: 32 > at java.net.NetworkInterface.getAll(java.base/Native Method) > at > java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351) > at NITest.main(NITest.java:3) > WARNING: JNI local refs: 66, exceeds capacity: 65 > at java.net.NetworkInterface.getAll(java.base/Native Method) > at > java.net.NetworkInterface.getNetworkInterfaces(java.base/NetworkInterface.java:351) > at NITest.main(NITest.java:3) > > Without the patch it takes 5. > > Helper scripts for testing on Linux. `setupnet.sh`: > > #!/bin/bash > set -euo pipefail > > namespace=${namespace:-jbase} > sudo ip netns add ${namespace} > > And `addif.sh`: > > #!/bin/bash > set -euo pipefail > > namespace=${namespace:-jbase} > num="$1" > > sudo ip link add name vethhost${num} type veth peer name > veth${namespace}${num} > sudo ip link set veth${namespace}${num} netns ${namespace} > sudo ip addr add 192.168.2.${num}/24 dev vethhost${num} > sudo ip netns exec ${namespace} ip addr add 192.168.2.${num}/24 dev > veth${namespace}${num} > sudo ip link set vethhost${num} up > sudo ip netns exec ${namespace} ip link set veth${namespace}${num} up > > count="$(sudo ip netns exec ${namespace} ip link show |grep UP | wc -l)" > echo "${count} interfaces" I think this looks okay. I assume the deletion of the locals refs at the end of createNetworkInterface aren't really needed, but harmless. It may be useful to update test/jdk/java/net/NetworkInterface/Test.java to have it run with -Xcheck:jni for both the default and -Djava.net.preferIPv4Stack=true cases. ------------- PR: https://git.openjdk.java.net/jdk/pull/2963