Uploaded image for project: 'Velocity'
  1. Velocity
  2. VELOCITY-934

NullPointerException under high concurrency

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Information Provided
    • Affects Version/s: 1.7.x, 2.2
    • Fix Version/s: None
    • Component/s: Engine
    • Labels:
      None
    • Environment:
      Windows 10 Professional

      Description

      I adjusted the mboseke/template-benchmark to profile throughput on AMD Ryzen 5950x:

      https://github.com/casid/template-benchmark/tree/ryzen-5950x

      With 32 concurrent threads, I can reliably reproduce a runtime exception in the Apache Velocity benchmark:

      java.lang.NullPointerException
              at org.apache.velocity.runtime.directive.Directive.postRender(Directive.java:240)
              at org.apache.velocity.runtime.directive.Foreach.clean(Foreach.java:325)
              at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:292)
              at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:301)
              at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:423)
              at org.apache.velocity.Template.merge(Template.java:358)
              at org.apache.velocity.Template.merge(Template.java:262)
              at com.mitchellbosecke.benchmark.Velocity.benchmark(Velocity.java:34)
              at com.mitchellbosecke.benchmark.generated.Velocity_benchmark_jmhTest.benchmark_thrpt_jmhStub(Velocity_benchmark_jmhTest.java:122)
              at com.mitchellbosecke.benchmark.generated.Velocity_benchmark_jmhTest.benchmark_Throughput(Velocity_benchmark_jmhTest.java:69)
              at jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
              at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.base/java.lang.reflect.Method.invoke(Method.java:566)
              at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:430)
              at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:412)
              at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
              at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
              at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
              at java.base/java.lang.Thread.run(Thread.java:834)
      
      

      This initially happened with version 1.7, but after updating to 2.2 the problem is still there. It looks like there is some threading issue under high concurrency.

      This is the velocity benchmark class:

      https://github.com/casid/template-benchmark/blob/ryzen-5950x/src/main/java/com/mitchellbosecke/benchmark/Velocity.java

      And this is the velocity template:

      https://github.com/casid/template-benchmark/blob/ryzen-5950x/src/main/resources/templates/stocks.velocity.html

       

       

       

       

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              casid Andreas Hager
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: