On Sun, Aug 26, 2018 at 1:35 AM David Leangen via osgi-dev < osgi-dev@mail.osgi.org> wrote:
> > Hi, > > Thank you again for all the great tips in this thread. I have taken the > time to review concurrency, reread all the blogs, articles, and email > messages in detail, and I have done a fairly thorough review of all my > code. I have identified a lot of places where there was potential for > concurrency errors, and I made a lot of simplifications (mostly by > eliminating any clever use of concurrency or synchronization when it wasn’t > really providing any tangible benefit, and only introducing risk). I also > reviewed again the DS lifecycle, as well as Trackers. I am pretty confident > that my understanding of the concurrent issues, and consequently my system, > are now in good shape. I think I can handle the dynamics now in a robust > way (though I still don’t know how to test for it to confirm). > > However, I am experiencing one problem on startup still that baffles me. > > Take this component: > > > @Component( > factory = ..., > configurationPid = ..., > configurationPolicy = ConfigurationPolicy.REQUIRE) > public class D > implements Descriptor > { > @Reference( scope = ReferenceScope.PROTOTYPE_REQUIRED ) > private WriterFactory.JsonWriterFactory factory; > > @Activate > void activate( Configuration.Config config ) > { > ... > } > > ... > } > > > There is really nothing more to the component that this. One static > reference (which is satisfied), and a required config (which is available). > > The factory basically looks like this (called from a different component > that instantiates this tracker): > > > public class ComponentFactoryTracker > extends ServiceTracker<ComponentFactory, ComponentInstance> > { > public ConfinementAwareComponentFactoryTracker( BundleContext context, > Filter filter ) > { > super( context, filter, null ); > } > > @Override > public ComponentInstance addingService( > ServiceReference<ComponentFactory> reference ) > { > final ComponentFactory cf = context.getService( reference ); > final Dictionary<String, Object> properties = new Hashtable<>(); > properties.put( ... ); > final ComponentInstance instance = cf.newInstance( properties ); > return instance; > } > > @Override > public void removedService( ServiceReference<ComponentFactory> > reference, ComponentInstance instance ) > { > context.ungetService( reference ); > instance.dispose(); > } > } > > Fairly simple. > > The system starts up, and the D component (and others like it) also > starts. Then bouncing happens. When things finally settle down after one > bounce, D (and others like it) gets deactivated. This is where I start > pulling my hair out. **Why** does it get deactivated??? > I can't explain this either. The only suggestions I can make are: 1) Write a deactivate method, stick a breakpoint on it and look at the stack. That might give you a clue as to why and how you got there. 2) Create a demonstrator project and raise a bug against the SCR implementation. > > —> The one and only static reference is available. Check. > > —> The configuration is available. Check. > > —> The ComponentFactory services are enabled. Check. > > However, despite all the prerequisites being available, D (and others) are > getting deactivated. I even created an immediate service that references D > (and others) to ensure that somebody was calling it. Nothing. Nada. All > that I can validate is that as D (and others) get deactivated, they are > unbound from this test service. > > If I restart any bundle that causes D to refresh, then the state of the > system comes up correctly. It is only upon initial startup that this > problem occurs. > > If I try injecting some service that potentially changes startup order, > sometimes it works, but I have not yet figured out the pattern. In any > case, since the prerequisites for the service are available, I don’t see > why on Earth that should matter, anyway. Unless maybe there is a bug in SCR > for some edge case (felix version 2.0.2). > This is indeed my suspicion based on what you have described. Have you tried using a later SCR implementation, just in case it's a bug that's already been fixed? Neil > > > I am at a loss... > > > Cheers, > =David > > > > On Jul 14, 2018, at 4:05, David Leangen via osgi-dev < > osgi-dev@mail.osgi.org> wrote: > > > Hi Tim, > > What is a good way to test for robustness against this phenomenon? > > > Again, I wish to go on record as saying that bouncing does not mean that > anything is wrong, nor is it intrinsically bad. > > > Thanks. Understood. I did not mean to imply anything about “goodness” or > “badness”, but it is good to have that on record. > > So, my question was: knowing that this happens, is there a good way to > test against it? My understanding is that currently there is not. > > > Cheers, > =David > > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org > https://mail.osgi.org/mailman/listinfo/osgi-dev > > > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org > https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev