Hi Javier,
that's the first time, I've heard of concurrency issues in C3.
That's not to say there cannot be any, just that it's probably a rare
case or you're stressing the system more than anyone else has yet.
Some thoughts top off my head:
- providers and factories should be singletons, as they should not have
any state (ie. member variables)
- the invocation must be a prototype, as it has a state
- if "synchronized" reliably fixes the problem, then there is a problem
with accessing the same, stateful resource from different threads
I cannot look into this right now, but I'll sure do this evening.
Are you using trunk or a certain build?
I might be able to reproduce this on my own, but a reduced version (ie a
controller and sitemap) for your setup would certainly help.
Steven
Am 14.03.2012 13:55, schrieb Javier Puerto:
> 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