[ 
https://issues.apache.org/jira/browse/VELOCITY-992?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

vincent royer updated VELOCITY-992:
-----------------------------------
    Description: 
When using one VelocityEngine instance in a multithread app, I get the 
following dead lock:

"{*}javamail-executor-thread-1{*}@20270" tid=0xe0 nid=NA waiting for monitor 
entry
  java.lang.Thread.State: BLOCKED
     waiting for {*}javamail-executor-thread-2{*}@20366 to release lock on 
<0x5094> (a int[])
      at 
org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
      - locked <0x5093> (a org.apache.velocity.runtime.parser.node.ASTDirective)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
      at 
org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
      at org.apache.velocity.Template.initDocument(Template.java:230)
      at org.apache.velocity.Template.process(Template.java:146)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
      at 
org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
      at org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
      at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
      at org.apache.velocity.Template.merge(Template.java:358)
      at org.apache.velocity.Template.merge(Template.java:262)
      at 
org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
      at 
io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)

"{*}javamail-executor-thread-2{*}@20366" tid=0xe2 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at 
org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
      - locked <{*}0x5095{*}> (a 
org.apache.velocity.runtime.parser.node.ASTDirective)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
      at 
org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
      at org.apache.velocity.Template.initDocument(Template.java:230)
      at org.apache.velocity.Template.process(Template.java:146)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
      at 
org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
      at org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
      at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
      at org.apache.velocity.Template.merge(Template.java:358)
      at org.apache.velocity.Template.merge(Template.java:262)
      at 
org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
      at 
io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)

 

This is probably because the reentrant Node.init() is synchronized in the 
ASTDirective.
{color:#b3ae60}@Override{color}{color:#cf8e6d}public synchronized {color}Object 
{color:#56a8f5}init{color}(InternalContextAdapter context, Object data) 
{color:#cf8e6d}throws {color}TemplateInitException

See 
[https://github.com/apache/velocity-engine/blob/master/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTDirective.java#L101]

My velocity template defines a runtime macro for i18n, processed as an 
ASTDirective, and the content of the macro is also processed as an 
ASTDirective, causing the reentrant deadlock.
#macro(msg $key) $messages.getMessage($key, $key, $locale) #end
#parse("templates/header.vm")

  was:
When using one VelocityEngine instance in a multithread app, I get the 
following dead lock:

"{*}javamail-executor-thread-1{*}@20270" tid=0xe0 nid=NA waiting for monitor 
entry
  java.lang.Thread.State: BLOCKED
     waiting for {*}javamail-executor-thread-2{*}@20366 to release lock on 
<0x5094> (a int[])
      at 
org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
      - locked <0x5093> (a org.apache.velocity.runtime.parser.node.ASTDirective)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
      at 
org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
      at org.apache.velocity.Template.initDocument(Template.java:230)
      at org.apache.velocity.Template.process(Template.java:146)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
      at 
org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
      at org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
      at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
      at org.apache.velocity.Template.merge(Template.java:358)
      at org.apache.velocity.Template.merge(Template.java:262)
      at 
org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
      at 
io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)

"{*}javamail-executor-thread-2{*}@20366" tid=0xe2 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at 
org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
      - locked <{*}0x5095{*}> (a 
org.apache.velocity.runtime.parser.node.ASTDirective)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
      at 
org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
      at org.apache.velocity.Template.initDocument(Template.java:230)
      at org.apache.velocity.Template.process(Template.java:146)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
      at 
org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
      at 
org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
      at org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
      at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
      at 
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
      at 
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
      at org.apache.velocity.Template.merge(Template.java:358)
      at org.apache.velocity.Template.merge(Template.java:262)
      at 
org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
      at 
io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)

 

This is probably because the reentrant Node.init() is synchronized in the 
ASTDirective.
{color:#b3ae60}@Override
{color}{color:#cf8e6d}public synchronized {color}Object 
{color:#56a8f5}init{color}(InternalContextAdapter context, Object data)
{color:#cf8e6d}throws {color}TemplateInitException
{
Token t;

{color:#7a7e85}/* method is synchronized to avoid concurrent directive 
initialization **/
{color}{color:#7a7e85}
{color}{color:#7a7e85} {color}{color:#cf8e6d}if 
{color}(!{color:#c77dbb}isInitialized{color})
See 
[https://github.com/apache/velocity-engine/blob/master/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTDirective.java#L101]

My velocity template defines a runtime macro for i18n, processed as an 
ASTDirective, and the content of the macro is also processed as an 
ASTDirective, causing the reentrant deadlock.
#macro(msg $key) $messages.getMessage($key, $key, $locale) #end
#parse("templates/header.vm")


> VelocityEngine multi-thread deadlock
> ------------------------------------
>
>                 Key: VELOCITY-992
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-992
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 2.4.1
>            Reporter: vincent royer
>            Priority: Major
>
> When using one VelocityEngine instance in a multithread app, I get the 
> following dead lock:
> "{*}javamail-executor-thread-1{*}@20270" tid=0xe0 nid=NA waiting for monitor 
> entry
>   java.lang.Thread.State: BLOCKED
>      waiting for {*}javamail-executor-thread-2{*}@20366 to release lock on 
> <0x5094> (a int[])
>       at 
> org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
>       at 
> org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
>       - locked <0x5093> (a 
> org.apache.velocity.runtime.parser.node.ASTDirective)
>       at 
> org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
>       at 
> org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
>       at org.apache.velocity.Template.initDocument(Template.java:230)
>       at org.apache.velocity.Template.process(Template.java:146)
>       at 
> org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
>       at 
> org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
>       at 
> org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
>       at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
>       at 
> org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
>       at 
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
>       at org.apache.velocity.Template.merge(Template.java:358)
>       at org.apache.velocity.Template.merge(Template.java:262)
>       at 
> org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
>       at 
> io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)
> "{*}javamail-executor-thread-2{*}@20366" tid=0xe2 nid=NA runnable
>   java.lang.Thread.State: RUNNABLE
>       at 
> org.apache.velocity.runtime.directive.RuntimeMacro.init(RuntimeMacro.java:133)
>       at 
> org.apache.velocity.runtime.parser.node.ASTDirective.init(ASTDirective.java:197)
>       - locked <{*}0x5095{*}> (a 
> org.apache.velocity.runtime.parser.node.ASTDirective)
>       at 
> org.apache.velocity.runtime.parser.node.SimpleNode.init(SimpleNode.java:400)
>       at 
> org.apache.velocity.runtime.parser.node.ASTprocess.init(ASTprocess.java:64)
>       at org.apache.velocity.Template.initDocument(Template.java:230)
>       at org.apache.velocity.Template.process(Template.java:146)
>       at 
> org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:429)
>       at 
> org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:346)
>       at 
> org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1696)
>       at 
> org.apache.velocity.runtime.directive.Parse.getTemplate(Parse.java:356)
>       at org.apache.velocity.runtime.directive.Parse.render(Parse.java:220)
>       at 
> org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
>       at 
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
>       at org.apache.velocity.Template.merge(Template.java:358)
>       at org.apache.velocity.Template.merge(Template.java:262)
>       at 
> org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:295)
>       at 
> io.micronaut.views.velocity.VelocityViewsRenderer.render(VelocityViewsRenderer.java:92)
>  
> This is probably because the reentrant Node.init() is synchronized in the 
> ASTDirective.
> {color:#b3ae60}@Override{color}{color:#cf8e6d}public synchronized 
> {color}Object {color:#56a8f5}init{color}(InternalContextAdapter context, 
> Object data) {color:#cf8e6d}throws {color}TemplateInitException
> See 
> [https://github.com/apache/velocity-engine/blob/master/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTDirective.java#L101]
> My velocity template defines a runtime macro for i18n, processed as an 
> ASTDirective, and the content of the macro is also processed as an 
> ASTDirective, causing the reentrant deadlock.
> #macro(msg $key) $messages.getMessage($key, $key, $locale) #end
> #parse("templates/header.vm")



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to