InterruptedException in InfraControl.preTearDown so far only on ARM

eric.caspole at oracle.com eric.caspole at oracle.com
Thu Jul 29 21:01:53 UTC 2021


Hi Aleksey,
I would like to get your thoughts on this corner case problem. I have 
written a single shot JMH, a bit extracted from another workload 
processing a large file, to see the run to run variability. But on the 2 
node ARM64 platform, about 3 in 10 runs I get the InterruptedException 
and the iteration fails as shown at the bottom. This is all using JDK 17 
and 18 builds. It happens with both G1 and ParallelGC.

Sergey observed that the other wrappers have some try/catch around 
InfraControl.preTearDown:

try {
     while (control.warmdownShouldWait) {
         blackhole.consume(l_getclient0_G.get());
         res.allOps++;
     }
     control.preTearDown();
} catch (InterruptedException ie) {
     control.preTearDownForce();
}





But the single shot wrapper has no try/catch there:

             int batchSize = iterationParams.getBatchSize();

             report_ss_jmhStub(control, res, benchmarkParams, iterationParams, threadParams, blackhole, notifyControl, startRndMask, batchSize, l_reporterbench0_0);

             control.preTearDown();

             if (control.isLastIteration()) {

                 f_reporterbench0_0 = null;

             }

Do you remember why? Or maybe this is some ARM issue, I cannot get this 
exception on x64 in 30+ tries running it the same way on 2 node systems 
with JDK 17 and 18 builds.

Here is the exception that happens after several minutes of running the 
iteration:


[36.242s][info][gc] GC(25) Pause Young (Mixed) (G1 Evacuation Pause) 
6751M->6150M(16960M) 440.807ms
[40.179s][info][gc] GC(26) Pause Young (Normal) (G1 Evacuation Pause) 
7142M->7050M(16960M) 386.541ms
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) [618.992s][info][gc] GC(27) Pause Young 
(Normal) (G1 Evacuation Pause) 7914M->7694M(16960M) 466.143ms
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) (*interrupt*) 
(*interrupt*) <failure>

java.lang.InterruptedException
     at 
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1048)
     at 
java.base/java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
     at 
org.openjdk.jmh.runner.InfraControl.preTearDown(InfraControl.java:90)
     at 
com.oracle.micro.generated.ReporterBench_report_jmhTest.report_SingleShotTime(ReporterBench_report_jmhTest.java:300)
     at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method)
     at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
     at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.base/java.lang.reflect.Method.invoke(Method.java:568)
     at 
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:453)
     at 
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:437)
     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
     at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
     at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
     at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
     at java.base/java.lang.Thread.run(Thread.java:833)


What do you think?
Thanks,
Eric



More information about the jmh-dev mailing list