Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Creation of parameterized ReferenceType not thread safe

Hi Thorsten,

I raised https://bugs.eclipse.org/bugs/show_bug.cgi?id=337855 to cover
the work done.  The nightly builds are here:

http://eclipse.org/aspectj/downloads.php

see the last developer build at the top of the page.  If you could try
it and let me know (here or on the bug) how it behaves, that would be
great.  Scott - you could try this out for your issue if you have any
time, it might be related although I would have expected the same
stack trace as Thorsten reported if it was the same thing.

cheers
Andy

On 22 February 2011 00:46, Thorsten Gast <gasttor@xxxxxx> wrote:
> Hi Andy,
>
> thanks for the fix. We will have a look at this.
>
> Shall I still open a bug for this, or is it done from your side? Just give a short note.
>
> Btw: Is there a nightly release or similar, which I can test in my environment?
>
> Regards
>
> Thorsten
>
> -------- Original-Nachricht --------
>> Datum: Mon, 21 Feb 2011 12:58:21 -0800
>> Von: Andy Clement <andrew.clement@xxxxxxxxx>
>> An: aspectj-users@xxxxxxxxxxx
>> Betreff: Re: [aspectj-users] Creation of parameterized ReferenceType not thread safe
>
>> Hi Thorsten,
>>
>> Just to say I've committed some synchronization to alleviate this
>> problem.  A further thing I was concerned about was multiple threads
>> attempting type resolution on the same world, as that could lead to
>> two entries for the same type in the world (not ideal).  So I've also
>> put some synchronization code around resolution when it is building a
>> type.  All the AspectJ tests pass but I have to admit I don't have any
>> tests that exercise multiple threads playing around with one world.
>>
>> Andy
>>
>> On 19 February 2011 02:41, Thorsten Gast <gasttor@xxxxxx> wrote:
>> > Hi Andy,
>> >
>> > thanks for the fast reposnse. I will raise a bugzille on monday. I am
>> within a spring context where prototype beans are loaded via an ObjectFactory
>> bean. The exception mainly occurs on the first request after starting the
>> server and the system is under load.
>> >
>> > Thorsten
>> >
>> > -------- Original-Nachricht --------
>> >> Datum: Fri, 18 Feb 2011 15:55:04 -0800
>> >> Von: Andy Clement <andrew.clement@xxxxxxxxx>
>> >> An: aspectj-users@xxxxxxxxxxx
>> >> Betreff: Re: [aspectj-users] Creation of parameterized ReferenceType
>> not thread safe
>> >
>> >> Hi Thorsten,
>> >>
>> >> Looks like a bug.  Can you raise a bugzilla?  My opening position
>> >> would be that the AspectJ weaver is a single threaded thing. But I
>> >> know ReflectionWorlds are used in instances other than just regular
>> >> weaving (for example, in a spring setup) - are you in Spring by any
>> >> chance when you see this issue?
>> >>
>> >> cheers
>> >> Andy
>> >>
>> >> On 18 February 2011 01:45, Gast, Thorsten <thorsten.gast@xxxxxxxxxxxx>
>> >> wrote:
>> >> > Hi,
>> >> >
>> >> > I am currently struggling with an IndexOutOfBoundsException deep in
>> >> aspectj.
>> >> >
>> >> >        at java.util.ArrayList.add(ArrayList.java:352)
>> >> >        at
>> >>
>> org.aspectj.weaver.ReferenceType.addDependentType(ReferenceType.java:115)
>> >> >        at
>> >> org.aspectj.weaver.ReferenceType.<init>(ReferenceType.java:95)
>> >> >        at
>> >>
>> org.aspectj.weaver.TypeFactory.createParameterizedType(TypeFactory.java:43)
>> >> >
>> >> > After taking a deeper look into the code, I found out that the usage
>> of
>> >> TypeFactory.createParameterizedType() and in particular the
>> instantiation
>> >> of ReferenceType (line 43 of TypeFactory) is not thread safe. In a
>> short
>> >> program (see below) I could reproduce this issue, when passing the same
>> >> instance of ResolvedType.
>> >> >
>> >> > Is this a bug, or should this not happen when aspectj is used in a
>> >> proper way?
>> >> >
>> >> > Regards
>> >> >
>> >> > Thorsten
>> >> >
>> >> >
>> >> > --- sample program start ---
>> >> > import java.util.concurrent.CountDownLatch;
>> >> >
>> >> > import org.aspectj.weaver.ReferenceType;
>> >> > import org.aspectj.weaver.ResolvedType;
>> >> > import org.aspectj.weaver.TypeFactory;
>> >> > import org.aspectj.weaver.World;
>> >> > import
>> >> org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate;
>> >> > import org.aspectj.weaver.reflect.ReflectionWorld;
>> >> >
>> >> > public class Aspectj {
>> >> >
>> >> >    public static void main(String[] args) {
>> >> >        new Aspectj();
>> >> >    }
>> >> >
>> >> >    static World inAWorld = new
>> >> ReflectionWorld(Aspectj.class.getClassLoader());
>> >> >
>> >> >    static ReferenceType aBaseType;
>> >> >    static {
>> >> >        aBaseType = new ReferenceType("test", inAWorld);
>> >> >        Java15ReflectionBasedReferenceTypeDelegate delegate = new
>> >> Java15ReflectionBasedReferenceTypeDelegate();
>> >> >        delegate.initialize(aBaseType, String.class,
>> >> Aspectj.class.getClassLoader(), inAWorld);
>> >> >        aBaseType.setDelegate(delegate);
>> >> >    }
>> >> >
>> >> >    public Aspectj() {
>> >> >        int N = 25;
>> >> >        CountDownLatch startSignal = new CountDownLatch(1);
>> >> >        CountDownLatch doneSignal = new CountDownLatch(N);
>> >> >
>> >> >        for (int i = 0; i < N; ++i)
>> >> >            new Thread(new Worker(startSignal,
>> >> doneSignal)).start();
>> >> >
>> >> >        startSignal.countDown();
>> >> >        try {
>> >> >            doneSignal.await();
>> >> >        } catch  (InterruptedException e){
>> >> >            e.printStackTrace();
>> >> >        }
>> >> >    }
>> >> >
>> >> >    class Worker implements Runnable {
>> >> >        private final CountDownLatch startSignal;
>> >> >        private final CountDownLatch doneSignal;
>> >> >
>> >> >        Worker(CountDownLatch startSignal, CountDownLatch
>> doneSignal)
>> >> {
>> >> >            this.startSignal = startSignal;
>> >> >            this.doneSignal = doneSignal;
>> >> >        }
>> >> >
>> >> >        public void run() {
>> >> >            try {
>> >> >                startSignal.await();
>> >> >                doWork();
>> >> >                doneSignal.countDown();
>> >> >            } catch (InterruptedException ex) {
>> >> >                ex.printStackTrace();
>> >> >            }
>> >> >        }
>> >> >
>> >> >        void doWork() {
>> >> >            for (int i = 0; i < 10; i++) {
>> >> >                // using TypeFactory
>> >> >                TypeFactory.createParameterizedType(aBaseType,
>> >> new ResolvedType[0], inAWorld);
>> >> >
>> >> >                // or creating ReferenceTypes directly
>> >> >                //new ReferenceType(aBaseType, new
>> >> ResolvedType[0], inAWorld);
>> >> >            }
>> >> >        }
>> >> >    }
>> >> >
>> >> > }
>> >> > --- sample program end ---
>> >> >
>> >> > _______________________________________________
>> >> > aspectj-users mailing list
>> >> > aspectj-users@xxxxxxxxxxx
>> >> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
>> >> >
>> >> _______________________________________________
>> >> aspectj-users mailing list
>> >> aspectj-users@xxxxxxxxxxx
>> >> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>> >
>> > --
>> > Schon gehört? GMX hat einen genialen Phishing-Filter in die
>> > Toolbar eingebaut! http://www.gmx.net/de/go/toolbar
>> > _______________________________________________
>> > aspectj-users mailing list
>> > aspectj-users@xxxxxxxxxxx
>> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
>> >
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
> --
> Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
> belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>


Back to the top