cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Javier Puerto <jav...@apache.org>
Subject [C3] Concurrency issues with ComponentProvider
Date Wed, 14 Mar 2012 12:55:34 GMT
Hi Cocoon developers,

we are working in a project based on C3 and we found a strange behaviour
when loading the static resources. We are developing a Web 2.0 application
and therefore we have a lot of resources (js, images and css). The weird
thing is that sometimes the system is returning the wrong resources,
returning a js instead of a css or switching images...

For my tests I did a little modification in class FileReaderComponent to
see the source of the file that is being served. See attached file
"FileReaderComponent.diff".
This modification uses System.out to show the source of the file before and
after read it. The component seems to be fine, also it's very simple so it
seems to not be the cause. The patch allow me to discard the component as
cause of problem, the source passed as argument when there's too much
resources requests are wrong sometimes.

I've review how the components are instantiated and I saw a possible design
problem for ComponentProvider class.

  <bean name="org.apache.cocoon.sitemap.ComponentProvider"
class="org.apache.cocoon.sitemap.SpringComponentProvider">
    <property name="actionFactory"
ref="org.apache.cocoon.sitemap.spring.ActionFactory" />
    <property name="languageInterpreterFactory"
ref="org.apache.cocoon.sitemap.expression.LanguageInterpreterFactory" />
    <property name="pipelineComponentFactory"
ref="org.apache.cocoon.sitemap.spring.PipelineComponentFactory" />
    <property name="pipelineFactory"
ref="org.apache.cocoon.sitemap.spring.PipelineFactory" />
  </bean>

  <bean name="org.apache.cocoon.sitemap.Invocation"
class="org.apache.cocoon.sitemap.InvocationImpl" scope="prototype">
    <property name="componentProvider"
ref="org.apache.cocoon.sitemap.ComponentProvider" />
  </bean>

Above is the sitemap component configuration, the InvocationImpl is the
component that will create the different components thought the
ComponentProvider that will delegate on different factories. The problem I
see is that while the Invocation is declared as "prototype", the
ComponentProvider is a shared instance so it could be that on high demand
the methods overlaps between request. I've solved the problem declaring the
methods as "synchronized" (att. SpringComponentProvider.diff).

This will solve the problems with concurrency, but I wonder if it's the
best solution. WDYT?

It's very hard to reproduce the problem with tools like JMeter (better
reloading directly in browser). Anyways it's happend sometimes with my
current functional test plan but I can't reproduce it consistently. Also
the JMeter test plan is designed for our current web project so I can't
attach it. The functional tests is configure as:

* 30 threads
* No delay between request
* Ramp up 1s
* Infinite loop
* Random controller with 6 static requests, each request with size
assertion.

Please, tell me if you need more detailed tests or it's enough. IMO anybody
could see the problem if there's a lot of concurrent resources involved.

Salu2

Mime
View raw message