velocity-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nathan Bubna (JIRA)" <...@velocity.apache.org>
Subject [jira] Commented: (VELOCITY-536) Velocity Engine throws NullPointer Exception when two people click on the same page at the same time for the first time
Date Mon, 02 Apr 2007 18:46:32 GMT

    [ https://issues.apache.org/jira/browse/VELOCITY-536?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12486096
] 

Nathan Bubna commented on VELOCITY-536:
---------------------------------------

Looking more carefully at this, rather than trusting my first look...

Ok, i see that there is potential for a second thread to jump ahead of the first one which
is busy performing the meat of the init.  This second thread then might run into trouble if
it tries to do anything with the instance before the first thread finishes the setup/initialization.

So, Christopher, you were right, there is an issue here, just not the original one.  Sorry,
and thanks for pressing me to keep thinking about it. :)

So, *if* the user is running things on pre-1.5, then JIT/VM can re-order the setting of init=true
within the synchronized block.   Then, *if* the VM decides to do that and another thread comes
along and finds init=true, thus skipping the synchronization, it could pass up the original
thread which is still busy performing the initialization.  *If* it then gets on to where it
tries to use the incompletely initialized (but fully instantiated ;) instance, it could get
into trouble.

So, while Lei's patch completely eliminates the chances of having the initialization code
called multiple times, it does introduce the chance of even less-frequent (and thus much harder
to debug) synchronization problems for those running on older JVMs.  Apply Murphy's Law, and
we can be sure it will happen. :(   We'd better just synchronize the block/method, without
trying to skip it via double checking.   If anyone's interested, we could leave a note that
once we require 1.5, we can use DCL with the volatile keyword happily.

> Velocity Engine throws NullPointer Exception when two people click on the same page at
the same time for the first time
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: VELOCITY-536
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-536
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.5
>            Reporter: Lei Gu
>         Attachments: 536-patch.txt, ASTDirective.java, ASTSetDirective.java, VelocimacroProxy.java
>
>
> Multi-thread concurrency issue
> During our concurrency testing, we observed NullPointer exceptions being thrown when
two people hit the same page at the same time for the first time. Upon further investigation,
it turns out that we need to synchronize the init method on ASTDirective, ASTSetDirective,
and render method on ASTSetDirective, and VelocimacroProxy.
>  Basically, the problem is introduced as the following; when two threads attempts to
parse and render the same template at the same time. Thread1 finishes parsing first and proceeds
to the render method call, while thread 2 is still busy parsing and will overwrite the existing
parse tree that is being used by thread 1 for rendering purpose. Thus under certainly condition
a NullPointer exception will be thrown. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org


Mime
View raw message