You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by bu...@apache.org on 2005/03/03 22:31:47 UTC

DO NOT REPLY [Bug 33836] New: - JXTemplateGenerator cache thread safety problem

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG�
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=33836>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND�
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=33836

           Summary: JXTemplateGenerator cache thread safety problem
           Product: Cocoon 2
           Version: 2.1.6
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: sitemap components
        AssignedTo: dev@cocoon.apache.org
        ReportedBy: niklas@trillian.se


I just upgraded to 2.1.6 and found a bug in JXTemplateGenerator.

The bug appears if one thread calls setup() and removes the cached template from
the cache. Before it has been able to reparse the template and put it back into
the cache another thread executes generate() and asks the cache for the same
template. The second thread will get a null startEvent.

Here's the relevant part of the setup()-method:

           synchronized (cache) {
               startEvent = (StartDocument)cache.get(uri);
               if (startEvent != null) {
                   int valid = SourceValidity.UNKNOWN;
                   if (startEvent.compileTime != null) {
                       valid = startEvent.compileTime.isValid();
                   }
                   if (valid == SourceValidity.UNKNOWN && startEvent.compileTime
!= null) {
                       SourceValidity validity = inputSource.getValidity();
                       valid = startEvent.compileTime.isValid(validity);
                   }
                   if (valid != SourceValidity.VALID) {
                       cache.remove(uri);
                       regenerate = true;
                   }
               } else {
                   regenerate = true;
               }
           }
           if (regenerate) {
               Parser parser = new Parser();
               SourceUtil.parse(this.manager, this.inputSource, parser);
               startEvent = parser.getStartEvent();
               startEvent.compileTime = this.inputSource.getValidity();
               synchronized (cache) {
                   cache.put(uri, startEvent);
               }
           }

To fix this either put the 'if (regenerate)' block inside the synchronized block
or remove the 'cache.remove(uri)' line.

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.