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

Reply via email to