Hi folks,

Just had a look, the stack seems to show some code that ain't in Stripes (at
least not in the 1.5.x branch at the time I write this email). Found this in
the stack trace :

net.sourceforge.stripes.controller.NameBasedActionResolverHelper.rescanFor
(NameBasedActionResolverHelper.java:217)

My guess is that you're using a modified action resolver (probably from
JRebel) which attempts to reload the beans while incoming requests trigger
bean class lookups at the same time. Hence the concurrent modification
exception : request handling thread is iterating over UrlBindingFactory's
classCache map at the same time JRebel's action resolver changes the map
content.

Stripes is supposed to scan for action beans once and only once, before
being ready to handle requests, so using unsynchronized maps interlally in
UrlBindingFactory is good design. Otoh, it doesn't offer thread-safe action
reload.

To fix the problem, we could synchronize access to the maps, or use
ConcurrentHashMap.

Yee (or anybody willing to see this fixed), you can demo the problem by
writing a unit test that accesses UrlBindingFactory concurrently (via
several threads). Then, you can fix by synchronizing where appropriate.
Last, we need to see what's the performance penalty.

IMHO this ain't a critical bug at all : stop using your browser while JRebel
does the reload and you won't have any exception, and anyway JRebel ain't no
production software as far as I know, so it's only a minor hassle. Still, if
you want to give it a shot : this would be a better design that allow to
write really reloadable action resolvers :P

Cheers

Remi



2011/2/11 samuel baudouin <osenseij...@gmail.com>

> Hi all, Yee
>
> From your stack and your code, it seems that the problem comes from
> one of the Stripes class...
> When this exception occurs is it always at the same point? Is the
> stack always the same?
>
> While I never encountered the problem, here is a way that could help you :
> You could use a load tester program such as JMeter (don't forget to
> make it share the session across the different virtual users).
> It would probably not reproduce the problem but would certainly make
> your life easy when testing with/without the different components.
>
> On your IDE, you could then set up an exception breakpoint on that
> ConcurrentModificationException and when raised pause the whole JVM
> (ie pause all the threads -- see breakpoint properties in Eclipse).
> From here, you can see where the different threads are at, and
> hopefully see where the double modifications is done.
>
> You would probably need to have the sources of Stripes and JRebel
> attached to your project (not in your project but just as a source
> lookup for Eclipse) in order to browse to the different classes.
>
> I know this is a bit of a bazooka to kill a fly, but this kind of
> "random" exception could be particularly tricky to pin point.
> If you have the time, the necessity, and most importantly not found a
> work around, this is how you could go...
>
> Regards,
> Sam
>
> On Fri, Feb 11, 2011 at 3:37 AM, Samuel Santos <sama...@gmail.com> wrote:
> > Hi Yee and Nikolaos,
> >
> > We do not use JRebel and have come across the same issue several times,
> so
> > it's surely a Stripes issue.
> > While we get the exception logged, it's transparent to the client, the
> > application does not crash and the client never sees an error.
> > This issue is very rare and only happens when you open multiple tabs at
> once
> > as Yee pointed out.
> >
> > --
> > Samuel Santos
> > http://www.samaxes.com/
> >
> >
> > On Thu, Feb 10, 2011 at 3:00 PM, Nikolaos Giannopoulos
> > <nikol...@brightminds.org> wrote:
> >>
> >> Yee,
> >>
> >> Well then... turn off JRebel and attempt to reproduce the bug... if you
> >> can't then it isn't Stripes.  Right?
> >>
> >> I know its tempting to keep JRebel engaged all the time and I recall the
> >> time I hit a bug in JRebel and thought it was one in Stripes... it took
> >> me a long time to consider simply turning off JRebel... but if you
> >> already suspect JRebel then flip it off and attempt to reproduce.
> >>
> >> --Nikolaos
> >>
> >>
> >>
> >> Yee wrote:
> >> > Hi Nokolaos,
> >> >
> >> > The bug has already been reported to JRebel. Stripes plugin for JRebel
> >> > was
> >> > created by third party, so it could take a while for it to be fixed.
> >> >
> >> > My concern here is to ascertain whether
> ConcurrentModificationException
> >> > error is
> >> > a bug in Stripes - or caused by the bug in JRebel.
> >> >
> >> > Cheers,
> >> > Yee
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> ------------------------------------------------------------------------------
> >> > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio
> >> > XE:
> >> > Pinpoint memory and threading errors before they happen.
> >> > Find and fix more than 250 security defects in the development cycle.
> >> > Locate bottlenecks in serial and parallel code that limit performance.
> >> > http://p.sf.net/sfu/intel-dev2devfeb
> >> > _______________________________________________
> >> > Stripes-users mailing list
> >> > Stripes-users@lists.sourceforge.net
> >> > https://lists.sourceforge.net/lists/listinfo/stripes-users
> >> >
> >> >
> >>
> >>
> >>
> >>
> ------------------------------------------------------------------------------
> >> The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio
> XE:
> >> Pinpoint memory and threading errors before they happen.
> >> Find and fix more than 250 security defects in the development cycle.
> >> Locate bottlenecks in serial and parallel code that limit performance.
> >> http://p.sf.net/sfu/intel-dev2devfeb
> >> _______________________________________________
> >> Stripes-users mailing list
> >> Stripes-users@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/stripes-users
> >
> >
> >
> ------------------------------------------------------------------------------
> > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
> > Pinpoint memory and threading errors before they happen.
> > Find and fix more than 250 security defects in the development cycle.
> > Locate bottlenecks in serial and parallel code that limit performance.
> > http://p.sf.net/sfu/intel-dev2devfeb
> > _______________________________________________
> > Stripes-users mailing list
> > Stripes-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/stripes-users
> >
> >
>
>
>
> --
> Samuel Baudouin
>
>
> ------------------------------------------------------------------------------
> The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
> Pinpoint memory and threading errors before they happen.
> Find and fix more than 250 security defects in the development cycle.
> Locate bottlenecks in serial and parallel code that limit performance.
> http://p.sf.net/sfu/intel-dev2devfeb
> _______________________________________________
> Stripes-users mailing list
> Stripes-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/stripes-users
>
------------------------------------------------------------------------------
The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
Pinpoint memory and threading errors before they happen.
Find and fix more than 250 security defects in the development cycle.
Locate bottlenecks in serial and parallel code that limit performance.
http://p.sf.net/sfu/intel-dev2devfeb
_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users

Reply via email to