ORO Perl5Matcher and Perl5Compiler are used in thread-unsafe manner -------------------------------------------------------------------
Key: TAPESTRY-778 URL: http://issues.apache.org/jira/browse/TAPESTRY-778 Project: Tapestry Type: Bug Components: Framework Versions: 4.0 Environment: Windows XP SP2, HotSpot JVM, JBoss 4.0.3 Reporter: Jeff Lubetkin Priority: Critical >From the Jakarta ORO Javadocs >(http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Matcher.html): "Perl5Compiler and Perl5Matcher are designed with the intent that you use a separate instance of each per thread to avoid the overhead of both synchronization and concurrent access (e.g., a match that takes a long time in one thread will block the progress of another thread with a shorter match). If you want to use a single instance of each in a concurrent program, you must appropriately protect access to the instances with critical sections. If you want to share Perl5Pattern instances between concurrently executing instances of Perl5Matcher, you must compile the patterns with Perl5Compiler.READ_ONLY_MASK." Tapestry 4.0 violates this in two ways: 1) The class org.apache.tapestry.form.validator.ValidatorFactoryImpl is a singleton, and uses a single org.apache.tapestry.util.RegexpMatcher for matching "validators" binding strings. This in turn uses a single Perl5Matcher. If multiple pages/components that use a "validators" binding are instantiated simultaneously, a race condition exception can occur. 2) A singleton RegexpMatcher is potentially using the same cached compiled pattern on multiple threads simultaneously, yet they are not compiled with Perl5Compiler.READ_ONLY_MASK. My project has run into #1 by running a load test (using Grinder) rendering a single page over and over that contains a component with a "validators" binding. Frequently, StringIndexOutOfBoundsException would be thrown from inside the Perl5Matcher stack. I was able to stop this by putting a synchronized block around the call to _matcher.getMatches in ValidatorFactoryImpl.constructValidatorList, but this is not likely the best solution, and requires a patch as it doesn't seem straightforward to override ValidatorFactoryImpl in the hivemodule files. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]