Uploaded image for project: 'Lucene - Core'
  1. Lucene - Core
  2. LUCENE-9117

RamUsageEstimator hangs with AOT compilation

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • None
    • 9.0
    • None
    • None
    • New

    Description

      Mailing list report by Cleber Muramoto.

      After generating a pre-compiled image lucene-core (8.3.0)  with jaotc (JDK
      13.0.1), RamUsageEstimator class is never loaded - it fails to complete the
      static initializer.
      
      Steps to reproduce:
      
       1)Generate the image with
      
      >jaotc --info --ignore-errors --jar ~/.m2/repository/org/apache/lucene/lucene-core/8.3.0/lucene-core-8.3.0.jar --output lucene-core.so
      
      2)Create a simple test class to trigger class loading
      
       import java.io.IOException;
      
      import java.nio.file.Path;
      import java.nio.file.Paths;
      
      import org.apache.lucene.index.IndexWriter;
      import org.apache.lucene.index.IndexWriterConfig;
      import org.apache.lucene.store.MMapDirectory;
      
      public class TestAOT {
      
      public static void main(String...args){
       run();
       System.out.println("Done");
       }
      static void run(){
       try {
       var iw = new IndexWriter(MMapDirectory.open(Paths.get("dir")), new
      IndexWriterConfig());
       iw.close();
       } catch (IOException e) {
       e.printStackTrace();
       }
       }
      }
      
      3)Run the class with the pre-compiled image
      
      >java -XX:AOTLibrary=./lucene-core.so -XX:+PrintAOT  -cp ~/.m2/repository/org/apache/lucene/lucene-core/8.3.0/lucene-core-8.3.0.jar TestAOT.java
      
      4)The program never completes. After inspecting it with jstack <pid> it
      shows that it's stuck in line 195 of RamUsageEstimator
      
      "main" #1 prio=5 os_prio=0 cpu=174827,04ms elapsed=173,91s
      tid=0x00007fe984018800 nid=0x2daf runnable [0x00007fe98bc3c000]
        java.lang.Thread.State: RUNNABLE
          at
      org.apache.lucene.util.RamUsageEstimator.<clinit>(RamUsageEstimator.java:195)
      
          at org.apache.lucene.util.ArrayUtil.<clinit>(ArrayUtil.java:31)
          at org.apache.lucene.index.IndexWriter.<clinit>(IndexWriter.java:276)
          at TestAOT.run(TestAOT.java:20)
          at TestAOT.main(TestAOT.java:14)
          at
      jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@13.0.1/Native
      Method)
          at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@13.0.1/NativeMethodAccessorImpl.java:62)
      
          at
      jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@13.0.1/DelegatingMethodAccessorImpl.java:43)
      
          at java.lang.reflect.Method.invoke(java.base@13.0.1/Method.java:567)
          at com.sun.tools.javac.launcher.Main.execute(jdk.compiler@13.0.1/Main.java:415)
      
          at com.sun.tools.javac.launcher.Main.run(jdk.compiler@13.0.1/Main.java:192)
      
          at com.sun.tools.javac.launcher.Main.main(jdk.compiler@13.0.1
      /Main.java:132)
      
      My guess is that the AOT compiler aggressive optimizations like
      inlining/scalar replacing calls to Long.valueOf, are working against the
      code's desired semantics.
      
      Perhaps the logic to determine LONG_CACHE_[MIN/MAX]_VALUE could be
      conditioned to VM version/vendor in Constants class. From [Open|Oracle]JDK
      7 onwards (don't know about older versions) Long cache has a fixed range of
      [-128,127], so there's no need to loop until a non-cached boxed value shows
      up.
      
      I know this compiler bug isn't Lucene's fault and as a workaround one could
      use --compile-for-tiered or exclude RamUsageEstimator's methods from jaotc,
      however, it would be nice to have a faster, allocation/loop-free
      initializer for RamUsageEstimator nevertheless.
      

      Attachments

        1. LUCENE-9117.patch
          1 kB
          Dawid Weiss

        Activity

          People

            dweiss Dawid Weiss
            dweiss Dawid Weiss
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment