On 05/11/2012 08:53 AM, Adam Heath wrote:
On 05/11/2012 12:40 AM, Jacopo Cappellato wrote:
Hi Adam,

please see inline:

On May 11, 2012, at 4:52 AM, Adam Heath wrote:

On 04/20/2012 07:53 AM, jaco...@apache.org wrote:
Author: jacopoc
Date: Fri Apr 20 12:53:35 2012
New Revision: 1328356

URL: http://svn.apache.org/viewvc?rev=1328356&view=rev
Log:
The cache of parsed Groovy scripts was not thread safe; this issue,
in instances with several concurrent threads running the same script
the first time (i.e. not cached) could cause the same script parsed
multiple times and then added to the cache (overriding the previous
value); this event was causing the clearing of caches in Freemarker;
because of a bug in Freemarker [*] this could cause a deadlock.
The issue is present on all versions of Freemarker but it is less
frequent on latest version because of the refactoring of caches
happened after release 2.3.10.

[*]
https://sourceforge.net/tracker/?func=detail&aid=3519805&group_id=794&atid=100794


Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/GroovyUtil.java

Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/GroovyUtil.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/GroovyUtil.java?rev=1328356&r1=1328355&r2=1328356&view=diff

==============================================================================

---
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/GroovyUtil.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/GroovyUtil.java
Fri Apr 20 12:53:35 2012
@@ -127,10 +127,17 @@ public class GroovyUtil {
} else {
scriptClass = parseClass(scriptUrl.openStream(), location);
}
- if (Debug.verboseOn()) {
- Debug.logVerbose("Caching Groovy script at: " + location, module);
+ synchronized (parsedScripts) {
+ Class<?> scriptClassCached = parsedScripts.get(location);
+ if (scriptClassCached == null) {
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Caching Groovy script at: " + location, module);
+ }
+ parsedScripts.put(location, scriptClass);
+ } else {
+ scriptClass = scriptClassCached;
+ }
}
- parsedScripts.put(location, scriptClass);
}
return scriptClass;
} catch (Exception e) {

Jacopo:  this is not DCL.

@@ -177,10 +184,18 @@ public class GroovyUtil {
Class<?> scriptClass = parsedScripts.get(script);
if (scriptClass == null) {
scriptClass = loadClass(script);
- if (Debug.verboseOn()) Debug.logVerbose("Caching Groovy script: "
+ script, module);
- parsedScripts.put(script, scriptClass);
+ synchronized (parsedScripts) {
+ Class<?> scriptClassCached = parsedScripts.get(script);
+ if (scriptClassCached == null) {
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Caching Groovy script: " + script, module);
+ }
+ parsedScripts.put(script, scriptClass);
+ } else {
+ scriptClass = scriptClassCached;
+ }
+ }
}
-

This is DCL.

Reply via email to