On Fri, 2008-08-22 at 09:35 +0200, Thorsten Scherler wrote: > On Thu, 2008-08-21 at 19:40 -0400, Vadim Gritsenko wrote: > > On Aug 21, 2008, at 8:18 AM, Thorsten Scherler wrote: > > > > > still updating forrest to use cocoon-2.1.x and I found a problem in > > > the > > > AbstractCachingProcessingPipeline. > > > > > > I am not sure whether someone is using the cocoon cli ATM. Forrest is > > > based around this component. > > > > > > https://issues.apache.org/jira/browse/FOR-955?focusedCommentId=12624340 > > > #action_12624340 ... > > > Can somebody verify that it is a bug? Should I commit the patch? > > > > It is a bug, but with proposed change you can get a deadlock under > > some conditions (IIRC, when using parallels inclusion in the sitemap > > which ultimately pull from the same pipeline). The idea behind that > > lock is to synchronize on the main request (top most request), and not > > on any of sub-request object created during aggregation. Suitable > > alternative would be to lock against top most command line request. > > How about:
Index: src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java =================================================================== --- src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java (revision 681296) +++ src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java (working copy) @@ -36,7 +36,7 @@ import org.apache.cocoon.caching.ComponentCacheKey; import org.apache.cocoon.caching.PipelineCacheKey; import org.apache.cocoon.environment.Environment; -import org.apache.cocoon.environment.http.HttpEnvironment; +import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.transformation.Transformer; import org.apache.cocoon.util.HashUtil; import org.apache.excalibur.source.SourceValidity; @@ -192,7 +192,7 @@ } // Avoid deadlock with self (see JIRA COCOON-1985). - Object current = env.getObjectModel().get(HttpEnvironment.HTTP_REQUEST_OBJECT); + Object current = env.getObjectModel().get(ObjectModelHelper.REQUEST_OBJECT); if (lock != null && lock != current) { if (getLogger().isDebugEnabled()) { getLogger().debug("Waiting on Lock '" + lockKey + "'"); @@ -242,7 +242,7 @@ getLogger().debug("Lock EXISTS: '" + lockKey + "'"); } } else { - Object lock = env.getObjectModel().get(HttpEnvironment.HTTP_REQUEST_OBJECT); + Object lock = env.getObjectModel().get(ObjectModelHelper.REQUEST_OBJECT); try { transientStore.store(lockKey, lock); } catch (IOException e) { This way we always lock the same object. I had a look as well on COCOON-1985 and it should be compatible. Thanks for the feedback Vadim. salu2 -- Thorsten Scherler thorsten.at.apache.org Open Source Java consulting, training and solutions