[Building Sakai] Deadlock in portal/velocity intermittently seen soon after startup

Niebel, William (wdn5e) wdn5e at eservices.virginia.edu
Sat Nov 2 19:16:07 PDT 2013


Hi, David.

You might remember that University of Virginia also is at Sakai 2.9 under Tomcat behind Apache on each of our individual servers.
I don't remember us ever seeing the problem you describe.  Other configuration differences may explain why our experience is different.

Our top-level portal pom.xml for Sakai 2.9.1 has Velocity at version 1.6.3    I assume you do too.
That version uses the non-thread-safe HashMap seen at the top of your stack trace.

You might try the next version 1.6.4 which finesses this for multi-threading.
(Again, we're at 1.6.3 and not having a problem, so won't bump this ourselves.)

Here's why:

The previous line in your stack trace
at org.apache.velocity.util.introspection.ClassMap$MethodCache.get(ClassMap.java:249) is source code line
Object cacheEntry = cache.get(methodKey);
from http://svn.apache.org/viewvc/velocity/engine/tags/1.6.3/src/java/org/apache/velocity/util/introspection/ClassMap.java?view=markup

MethodCache's instance variable "cache" is defined in the same source code file
org.apache.velocity.util.introspection.ClassMap:218 as
 private final Map cache = new HashMap();

So Velocity 1.6.3 hardcodes this Map for single-threading.


The equivalent line in the next version 1.6.4
org.apache.velocity.util.introspection.ClassMap:219 is instead
 private final Map cache = MapFactory.create(false);
( instead from http://svn.apache.org/viewvc/velocity/engine/tags/1.6.4/src/java/org/apache/velocity/util/introspection/ClassMap.java?view=markup )

Following this create() call into same-version
http://svn.apache.org/viewvc/velocity/engine/tags/1.6.4/src/java/org/apache/velocity/util/MapFactory.java?view=markup
org.apache.velocity.util.ClassMapFactory:67 create(...) method sets up some defaults and then calls
org.apache.velocity.util.ClassMapFactory:88 create(...) method with fuller signature, which returns a Map implementation appropriate for the level of concurrency and Java version


1.6.3 has similar MapFactory code, but it's not used in its line 218.  Also, I didn't look for Apache issue tracking which would explain the source code change.


Maybe ClassMap is a singleton and shared among threads, and so it matters how this is implemented.  However that is, it does look like bumping the Velocity version might help with this.

We certainly would like to know if this works out or any other success you have.  Good luck with it.

Bill Niebel
University of Virginia



More information about the sakai-dev mailing list