Karl,

Yes, I think it is possible that the class was loaded from the bundle on
another thread, because there is a bundle listener which does some
processing when the bundle moves to resolved state. Should I avoid
classloading in other threads, or is it something that can be fixed in
Felix?


Thank you...

Regards,

Rajini


On 1/15/08, Karl Pauls <[EMAIL PROTECTED]> wrote:
>
> Is it possible that the class has been loaded from the bundle before
> this test by a different thread? It looks like we could have a
> visibility issue because the classloader is created lazily outside of
> a any synchronized block...
>
> regards,
>
> Karl
>
> On Jan 15, 2008 9:07 PM, Rajini Sivaram <[EMAIL PROTECTED]>
> wrote:
> > Richard,
> >
> > I dont think this is the problem in the filtering test because I can see
> > from the logs that the class used by the service object is different
> from
> > the class used by the bundle when the lookup is done. I have a list of
> print
> > statements taken from a segment of code in Tuscany when the class
> suddenly
> > changes (and this eventually leads to the test failing). Could you tell
> me
> > what could have triggered this? I dont think there is much else going on
> in
> > the application at this point.
> >
> >
> >       Class<?> proxyInterface = bundle.loadClass(interfaceClass.getName
> ());
> >       registerProxyService(proxyInterface);
> >       debugPrint(bundle, proxyInterface);
> >
> >       Bundle[] bundles = bundleContext.getBundles();
> >       for (Bundle b : bundles) {
> >           try {
> >               if (b.getSymbolicName().startsWith("org.apache.felix"))
> > continue;
> >               Class<?> c = b.loadClass(interfaceClass.getName());
> >               debugPrint(b, c);
> >           } catch (Throwable t) {
> >           }
> >       }
> >
> > The log shows:
> >
> >     1. Class="interface conversation.service.ConversationalService"
> >       class.hashCode=1640915406  classloader="9.0"
> >       classLoader.hashCode=171182644 loaded using bundle="
> >       conversation.ConversationalClient [7]" bundle.hashCode=141559920
> >       2. Class="interface conversation.service.ConversationalService"
> >       class.hashCode=1712285199 classloader="
> >       org.apache.maven.surefire.booter.IsolatedClassLoader"
> >       classLoader.hashCode=93324688 loaded using bundle="System Bundle
> >       [0]" bundle.hashCode=992361254
> >       3. Class="interface conversation.service.ConversationalService"
> >       class.hashCode=966932898 classloader="9.0"
> >       classLoader.hashCode=1593597692 loaded using bundle="
> >       conversation.ConversationalClient [7]" bundle.hashCode=141559920
> >       4. Class="interface conversation.service.ConversationalService"
> >       class.hashCode=966932898 classloader="9.0"
> >       classLoader.hashCode=1593597692 loaded using bundle="
> >       conversation.ConversationalReferenceClient [8]"
> >       bundle.hashCode=349312210
> >       5. Class="interface conversation.service.ConversationalService"
> >       class.hashCode=966932898 classloader="9.0"
> >       classLoader.hashCode=1593597692 loaded using bundle="
> >       conversation.ConversationalService [9]"
> >       bundle.hashCode=398464960
> >
> > 1) is from the first print and 2-5 are from the loop. The hashCode of
> the
> > class and its classloader in 1) are different from 3) which were both
> the
> > return value from the same bundle.loadClass. 3-5 show the same class,
> and I
> > can see this class being used throughout the test from this point
> onwards.
> > 2. is the system bundle which doesn't export the package, but has the
> class
> > in its classpath. The bundle doing the lookup for the service is the one
> > used in 1) and 3). And it doesn't find the service because the proxy
> uses
> > the class from 1) while the class visible to the bundle when the lookup
> is
> > done is the one from 3).
> >
> > I have modified Tuscany to do a refreshPackages on PackageAdmin before
> > registering any proxy services, and I haven't seen this error since
> then.
> > But that could just be because of slowing things down.
> >
> > I am using Felix framework 1.0.1.
> >
> >
> >
> > Thank you...
> >
> > Regards,
> >
> > Rajini
> >
> >
> >
> > On 1/15/08, Richard S. Hall <[EMAIL PROTECTED]> wrote:
> > >
> > > Strange.
> > >
> > > Off the top of my head I can think of two ways for this to happen:
> > >
> > >   1. PackageA is actually available from more than one place.
> > >   2. Felix' service filtering test has a bug in it.
> > >
> > > Perhaps you could add some debugging printlns to your code to
> determine
> > > which class loaders are being used to load the service class from both
> > > your consumer and your provider, particularly in the case where it
> > > fails. If we can see that the class loaders are the same when it
> fails,
> > > then we can assume the bug is in the service filtering code.
> > >
> > > -> richard
> > >
> > > Rajini Sivaram wrote:
> > > > Hello,
> > > >
> > > > I have a test case in Apache Tuscany which fails intermittently when
> run
> > > > along with a lot of other OSGi-based tests under Felix.
> > > >
> > > > I have three bundles A, B and C with distinct packages contained
> inside
> > > > them.
> > > >
> > > > BundleA exports PackageA.
> > > > BundleB imports PackageA.
> > > >
> > > > I use the system bundleContext to register a service with interface
> > > > PackageA.ClassA. The interface class for the service is loaded using
> > > > BundleB.loadClass("PackageA.ClassA"). BundleB looks up the registry
> to
> > > find
> > > > this service (the actual service object  registered is a Java proxy
> with
> > > the
> > > > interface PackageA.ClassA).
> > > >
> > > > It works fine most of the time. BundleB finds the proxy service
> using
> > > > getServiceReferences since the provider (system bundle) does not
> have a
> > > wire
> > > > to PackageA, and the class of the object being looked up is the same
> as
> > > the
> > > > one visible to BundleB.
> > > >
> > > > But once in a while, the test does not find the proxy. Sometimes it
> > > finds a
> > > > proxy and then throws ClassCastException when BundleB typecasts the
> > > object
> > > > returned to (PackageA.ClassA). But there is only one copy of the
> class
> > > > installed into the OSGi runtime.
> > > >
> > > > There are other bundles which don't contain PackageA which are
> installed
> > > and
> > > > uninstalled while the test is running, but I am not sure if these
> should
> > > > affect BundleA/BundleB given that their import/exports are not
> satisfied
> > > by
> > > > these other bundles.
> > > >
> > > > Is there any circumstance under which the class that is visible to
> > > BundleB
> > > > would get reloaded when neither BundleB that is importing the
> package
> > > and
> > > > BundleA that is exporting the package have not been restarted? In
> other
> > > > words, is BundleB.loadClass("PackageA.ClassA") always guaranteed to
> > > return
> > > > the same class if the bundle exporting PackageA is not uninstalled,
> and
> > > no
> > > > new bundles are added which export PackageA?
> > > >
> > > >
> > > >
> > > > Thank you...
> > > >
> > > > Regards,
> > > >
> > > > Rajini
> > > >
> > > >
> > >
> >
>
>
>
> --
> Karl Pauls
> [EMAIL PROTECTED]
>

Reply via email to