Hi David,

Excellent.

I'm glad to confirm that the issue is resolved, and my DM loader is now
running seamlessly.
I'm observing an overall gain of 16% compared to the previous 5.0.0.
(but this has to be taken with care,because I only made a quick test).

I did not have time but I guess I could observe a better performance gain
on a bigger host with more cpu (I only have four); since synchronization
cost is usually proportional to the number of available cores and as I
understand your fix is now based on java.util.concurrent jdk tools.


many thanks
/Pierre

On Tue, May 19, 2015 at 1:57 PM, David Bosschaert <
david.bosscha...@gmail.com> wrote:

> Thanks Pierre for submitting a unit test to FELIX-4866 that helped me
> enormously in identifying the issue.
>
> I have fixed the bug in my code (without degrading performance) and at
> least your concurrency test, my concurrency tests and all the
> framework unit tests now consistently pass. I would be very interested
> in hearing whether your bigger test suit also still behaves as
> expected.
>
> Best regards,
>
> David
>
> On 14 May 2015 at 22:53, Pierre De Rop <pierre.de...@gmail.com> wrote:
> > the threadump did not help.
> > I will  investigate (may be a bug somewhere in my part; if this is the
> > case, I would be sorry to make all this noise).
> >
> > hope to let you know soon.
> >
> > by the way, do you know how to run the SCR integration tests with the
> > framework from the trunk ? I know that there are some SCR integration
> tests
> > that are doing some load tests, and I would be interested to know if they
> > are also ok with the framework from the trunk ?
> >
> > cheers;
> > /Pierre
> >
> >
> > On Thu, May 14, 2015 at 10:06 PM, David Bosschaert <
> > david.bosscha...@gmail.com> wrote:
> >
> >> Hi Pierre,
> >>
> >> It would indeed be useful to find out more about why your test is
> >> hanging. Maybe analysing a threaddump might give some more
> >> information?
> >>
> >> Cheers,
> >>
> >> David
> >>
> >> On 14 May 2015 at 19:54, Pierre De Rop <pierre.de...@gmail.com> wrote:
> >> > Thanks David; I just gave a try, and indeed the parallel test passed.
> I
> >> > observed a gain of around 7/10%. The tool is described in [1].
> >> >
> >> > But I only have 4 cores on my laptop and I will make more tests in my
> lab
> >> > at work (next week) where we have some servers having 32 or even 128
> >> > processors. This will give a better idea of the gain because the more
> >> > processor you have, the more synchronization is costly, so I could
> >> possibly
> >> > observe a better performance gain.
> >> >
> >> > Now, I'm sorry but I think that there is still a problem (I don't know
> >> > where): when using more threads, the parallel test does not complete
> and
> >> > stops with a timeout message, indicating that the number of expected
> >> > components are not created after a timeout delay of 1 minute.
> >> >
> >> > So, I just committed a modified version of the tool in the sandbox
> which
> >> > can now take a -Dthreads option in order to configure the number of
> >> > threads. With -Dthreads=4, its OK. But with -Dthreads=10, then test
> does
> >> > not complete and ends with a timeout:
> >> >
> >> > $ java -Dthreads=10 -server -jar bin/felix.jar
> >> >
> >> > g! Starting benchmarks (each tested bundle will add/remove 630
> components
> >> > during bundle activation).
> >> >
> >> >         [Starting benchmarks with no processing done in components
> start
> >> > methods]
> >> >
> >> > Benchmarking bundle:
> >> >
> org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel
> >> > .................................................Could not start
> >> components
> >> > timely: current start latch=2, stop latch=630
> >> >
> >> > My current understanding of this is that some components are still
> >> awaiting
> >> > for unsatisfied service dependencies, just like if a service tracker
> >> would
> >> > have missed a service registration.
> >> >
> >> > I ran the same test during two hours with the previous framework
> version,
> >> > and did not observe any problems.
> >> >
> >> > I wonder if someone else do have another tool in order to perform
> another
> >> > kind of load test, just to see if some problems are also observed.
> >> >
> >> > -> from  my side, I will do the following: in the past, the benchmark
> >> tool
> >> > supported not only dependencymanager, but also Felix SCR and iPojo.
> So, I
> >> > will reintroduce Felix SCR in the benchmark and will check if I also
> >> > observe the problem (with -Dthreads=10).
> >> >
> >> > I will let you know.
> >> >
> >> > cheers;
> >> > /Pierre
> >> >
> >> > [1]
> >> >
> >>
> http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.benchmark/README
> >> >
> >> > On Thu, May 14, 2015 at 3:41 PM, David Bosschaert <
> >> > david.bosscha...@gmail.com> wrote:
> >> >
> >> >> I've fixed this now in
> >> >> svn.apache.org/viewvc?view=revision&revision=1679367
> >> >>
> >> >> Pierre, your loadtest now runs to completion - thanks for reporting
> >> >> this issue! I can see that the results for the parallel tests are a
> >> >> little bit different than before, but I'm not sure how to read them
> so
> >> >> I'll leave the interpretation of that to you :)
> >> >>
> >> >> Cheers,
> >> >>
> >> >> David
> >> >>
> >> >> On 14 May 2015 at 14:38, David Bosschaert <
> david.bosscha...@gmail.com>
> >> >> wrote:
> >> >> > I think I know what this is. I had some additional changes exactly
> in
> >> >> > this area that I simply forgot to apply this morning. I should
> have it
> >> >> > fixed sometime today.
> >> >> >
> >> >> > Cheers,
> >> >> >
> >> >> > David
> >> >> >
> >> >> > On 14 May 2015 at 14:03, David Bosschaert <
> david.bosscha...@gmail.com
> >> >
> >> >> wrote:
> >> >> >> Hi Pierre,
> >> >> >>
> >> >> >> I'll take a look today.
> >> >> >>
> >> >> >> Cheers,
> >> >> >>
> >> >> >> David
> >> >> >>
> >> >> >> On 14 May 2015 at 14:00, Pierre De Rop <pierre.de...@gmail.com>
> >> wrote:
> >> >> >>> I just committed the benchmark tool in
> >> >> >>> http://svn.apache.org/viewvc/felix/sandbox/pderop/loadtest/, if
> you
> >> >> can
> >> >> >>> take a look.
> >> >> >>>
> >> >> >>> To run the scenario:
> >> >> >>>
> >> >> >>> - install jdk8:
> >> >> >>>
> >> >> >>> [nxuser@nx0012 pderop]$ java -version
> >> >> >>> java version "1.8.0_40"
> >> >> >>> Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
> >> >> >>> Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
> >> >> >>>
> >> >> >>> - checkout the loadtest from
> >> >> >>> http://svn.apache.org/viewvc/felix/sandbox/pderop/loadtest/
> >> >> >>>
> >> >> >>> - go the the "loadtest" directory and start the test, just like
> >> this:
> >> >> >>>
> >> >> >>> $ java -server -jar bin/felix.jar
> >> >> >>> Welcome to Apache Felix Gogo
> >> >> >>>
> >> >> >>> g! Starting benchmarks (each tested bundle will add/remove 630
> >> >> components
> >> >> >>> during bundle activation).
> >> >> >>>
> >> >> >>>         [Starting benchmarks with no processing done in
> components
> >> >> start
> >> >> >>> methods]
> >> >> >>>
> >> >> >>> Benchmarking bundle:
> >> >> >>> org.apache.felix.dependencymanager.benchmark.dependencymanager
> >> >> >>> ..................................................
> >> >> >>> -> results in nanos: [139,129,744 | 143,957,687 | 152,157,581 |
> >> >> 319,631,722
> >> >> >>> | 919,838,078]
> >> >> >>>
> >> >> >>> Benchmarking bundle:
> >> >> >>>
> >> >>
> org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel
> >> .
> >> >> >>>
> >> >> >>>
> >> >> >>> Here, the first
> >> >> >>> "org.apache.felix.dependencymanager.benchmark.dependencymanager"
> >> test
> >> >> >>> (single-threaded) passes OK. But the next one hangs
> >> >> >>>
> >> >>
> >>
> (org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel).
> >> >> >>> it uses a fork join pool with size=4.
> >> >> >>>
> >> >> >>> and when typing "log warn", we see:
> >> >> >>>
> >> >> >>> "log warn"
> >> >> >>>
> >> >> >>> 2015.05.14 13:56:10 ERROR - Bundle:
> >> >> >>>
> >> >>
> org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel
> >> -
> >> >> >>> [ForkJoinPool-1-worker-3] Error processing tasks -
> >> >> >>> java.util.ConcurrentModificationException
> >> >> >>>         at
> >> java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
> >> >> >>>         at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
> >> >> >>>         at
> >> >> java.util.AbstractCollection.addAll(AbstractCollection.java:343)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:245)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:212)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:189)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.ServiceRegistry.getServiceReferences(ServiceRegistry.java:269)
> >> >> >>>         at
> >> >> >>>
> >> org.apache.felix.framework.Felix.getServiceReferences(Felix.java:3577)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.Felix.getAllowedServiceReferences(Felix.java:3655)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.framework.BundleContextImpl.getServiceReferences(BundleContextImpl.java:434)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.tracker.ServiceTracker.getInitialReferences(ServiceTracker.java:422)
> >> >> >>>         at
> >> >> >>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:375)
> >> >> >>>         at
> >> >> >>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:319)
> >> >> >>>         at
> >> >> >>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:295)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.impl.ServiceDependencyImpl.start(ServiceDependencyImpl.java:226)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.startDependencies(ComponentImpl.java:657)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.performTransition(ComponentImpl.java:535)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.handleChange(ComponentImpl.java:492)
> >> >> >>>         at
> >> >> >>>
> >> org.apache.felix.dm.impl.ComponentImpl.access$5(ComponentImpl.java:482)
> >> >> >>>         at
> >> >> >>>
> org.apache.felix.dm.impl.ComponentImpl$3.run(ComponentImpl.java:227)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> org.apache.felix.dm.impl.DispatchExecutor.runTask(DispatchExecutor.java:182)
> >> >> >>>         at
> >> >> >>>
> >> >>
> org.apache.felix.dm.impl.DispatchExecutor.run(DispatchExecutor.java:165)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
> >> >> >>>         at
> >> >> java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
> >> >> >>>         at
> >> >> >>>
> java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1689)
> >> >> >>>         at
> >> >> >>>
> >> >>
> >>
> java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
> >> >> >>>
> >> >> >>>
> >> >> >>> (I will investigate also in my code to check if the problem does
> not
> >> >> come
> >> >> >>> from me ?)
> >> >> >>>
> >> >> >>> cheers;
> >> >> >>> /Pierre
> >> >> >>>
> >> >> >>>
> >> >> >>> On Thu, May 14, 2015 at 1:47 PM, Pierre De Rop <
> >> pierre.de...@gmail.com
> >> >> >
> >> >> >>> wrote:
> >> >> >>>
> >> >> >>>> Hi David,
> >> >> >>>>
> >> >> >>>> I don't know if it's me (a bug in my benchmark tool) or if if
> there
> >> >> is a
> >> >> >>>> regression somewhere in the framework, by my parallel test does
> not
> >> >> pass
> >> >> >>>> anymore.
> >> >> >>>>
> >> >> >>>> The test first starts with a single-threaded scenario, which
> >> passes OK
> >> >> >>>>
> (org.apache.felix.dependencymanager.benchmark.dependencymanager),
> >> >> then when
> >> >> >>>> the parallel test starts
> >> >> >>>>
> >> >>
> >>
> (org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel)
> >> >> >>>> it suddenly hangs, and when I type "log warn" under the gogo
> >> shell, I
> >> >> see
> >> >> >>>> the following exception:
> >> >> >>>>
> >> >> >>>> (I'm using java8):
> >> >> >>>>
> >> >> >>>> $ java -server -Xmx4g -Xms4g -jar bin/felix.jar
> >> >> >>>> ____________________________
> >> >> >>>> Welcome to Apache Felix Gogo
> >> >> >>>>
> >> >> >>>> Benchmarking bundle:
> >> >> >>>>
> >> >>
> org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel
> >> .
> >> >> >>>>
> >> >> >>>> (here, the dependencymanager.parallel test hangs and when I type
> >> "log
> >> >> >>>> warn", I see this:)
> >> >> >>>>
> >> >> >>>> g! log warn
> >> >> >>>> 2015.05.14 13:31:03 ERROR - Bundle:
> >> >> >>>>
> >> >>
> org.apache.felix.dependencymanager.benchmark.dependencymanager.parallel
> >> -
> >> >> >>>> [ForkJoinPool-1-worker-3] Error processing tasks -
> >> >> >>>> java.util.ConcurrentModificationException
> >> >> >>>>         at
> >> java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
> >> >> >>>>         at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
> >> >> >>>>         at
> >> >> java.util.AbstractCollection.addAll(AbstractCollection.java:343)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:245)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:212)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.capabilityset.CapabilitySet.match(CapabilitySet.java:189)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.ServiceRegistry.getServiceReferences(ServiceRegistry.java:269)
> >> >> >>>>         at
> >> >> >>>>
> >> org.apache.felix.framework.Felix.getServiceReferences(Felix.java:3577)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.Felix.getAllowedServiceReferences(Felix.java:3655)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.framework.BundleContextImpl.getServiceReferences(BundleContextImpl.java:434)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.tracker.ServiceTracker.getInitialReferences(ServiceTracker.java:422)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:375)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:319)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> org.apache.felix.dm.tracker.ServiceTracker.open(ServiceTracker.java:295)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.impl.ServiceDependencyImpl.start(ServiceDependencyImpl.java:226)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.startDependencies(ComponentImpl.java:657)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.performTransition(ComponentImpl.java:535)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.impl.ComponentImpl.handleChange(ComponentImpl.java:492)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> org.apache.felix.dm.impl.ComponentImpl.access$5(ComponentImpl.java:482)
> >> >> >>>>         at
> >> >> >>>>
> >> org.apache.felix.dm.impl.ComponentImpl$3.run(ComponentImpl.java:227)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> org.apache.felix.dm.impl.DispatchExecutor.runTask(DispatchExecutor.java:182)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> org.apache.felix.dm.impl.DispatchExecutor.run(DispatchExecutor.java:165)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
> >> >> >>>>         at
> >> >> java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
> >> >> >>>>         at
> >> >> >>>>
> java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1689)
> >> >> >>>>         at
> >> >> >>>>
> >> >>
> >>
> java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
> >> >> >>>>
> >> >> >>>> (If I configure my threadpool to 1, I have no problems, but with
> >> >> >>>> threadpool=4, then I have the problem)
> >> >> >>>>
> >> >> >>>> I will investigate, but Ideally, may be it would be helpful if
> you
> >> >> could
> >> >> >>>> also run the test by yourself; so I will commit soon something
> to
> >> >> reproduce
> >> >> >>>> the problem in my sandbox.
> >> >> >>>>
> >> >> >>>> cheers;
> >> >> >>>> /Pierre
> >> >> >>>>
> >> >> >>>> On Thu, May 14, 2015 at 11:11 AM, David Bosschaert <
> >> >> >>>> david.bosscha...@gmail.com> wrote:
> >> >> >>>>
> >> >> >>>>> I've committed this now in
> >> >> >>>>> http://svn.apache.org/viewvc?view=revision&revision=1679327
> >> >> >>>>>
> >> >> >>>>> Curious to see what others are measuring. My tests were
> focused on
> >> >> >>>>> multiple bundles/threads obtaining the same service, as that's
> >> were I
> >> >> >>>>> saw a bit of contention.
> >> >> >>>>>
> >> >> >>>>> Cheers,
> >> >> >>>>>
> >> >> >>>>> David
> >> >> >>>>>
> >> >> >>>>> On 13 May 2015 at 15:10, Pierre De Rop <pierre.de...@gmail.com
> >
> >> >> wrote:
> >> >> >>>>> > Hi David,
> >> >> >>>>> >
> >> >> >>>>> > I'm looking forward to test your improvements using the
> >> >> >>>>> dependencymanager
> >> >> >>>>> > benchmark tool ([1]).
> >> >> >>>>> >
> >> >> >>>>> >
> >> >> >>>>> > [1]
> >> >> >>>>> >
> >> >> >>>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.benchmark/
> >> >> >>>>> >
> >> >> >>>>> > /Pierre
> >> >> >>>>> >
> >> >> >>>>> > On Wed, May 13, 2015 at 3:02 PM, David Bosschaert <
> >> >> >>>>> > david.bosscha...@gmail.com> wrote:
> >> >> >>>>> >
> >> >> >>>>> >> I have implemented the performance improvements that I was
> >> >> thinking of
> >> >> >>>>> >> using Java 5 concurrency tools, they can be viewed at [1].
> >> >> >>>>> >>
> >> >> >>>>> >> I wrote a little performance test suite [2] that tests
> >> >> multithreaded
> >> >> >>>>> >> service registry performance (10 threads) from single /
> >> multiple
> >> >> >>>>> >> bundles with either singleton services and Prototype Service
> >> >> Factory
> >> >> >>>>> >> services and the results are quite impressive. I'm getting
> >> >> performance
> >> >> >>>>> >> improvements compared to the current trunk from 8 times
> better
> >> >> than
> >> >> >>>>> >> the original (800%) to more than 30 times better (3000%).
> >> >> >>>>> >>
> >> >> >>>>> >> Carsten has already reviewed the code (thanks Carsten!) and
> I'm
> >> >> >>>>> >> planning to commit it to Felix tomorrow if nobody objects.
> >> >> >>>>> >>
> >> >> >>>>> >> Cheers,
> >> >> >>>>> >>
> >> >> >>>>> >> David
> >> >> >>>>> >>
> >> >> >>>>> >> [1]
> >> >> >>>>> >>
> >> >> >>>>>
> >> >>
> >>
> https://github.com/bosschaert/felix/commit/e6a1b06c6e66d9c98e6d81b91ef7003c8e725450
> >> >> >>>>> >> [2]
> >> >> >>>>> >>
> >> >> >>>>>
> >> >>
> >>
> https://github.com/bosschaert/coderthoughts/tree/master/service-registry-perftest/srperf
> >> >> >>>>> >>
> >> >> >>>>> >> On 23 March 2015 at 15:39, Richard S. Hall <
> >> he...@ungoverned.org>
> >> >> >>>>> wrote:
> >> >> >>>>> >> > On 3/23/15 10:17 , David Bosschaert wrote:
> >> >> >>>>> >> >>
> >> >> >>>>> >> >> On 23 March 2015 at 13:39, Richard S. Hall <
> >> >> he...@ungoverned.org>
> >> >> >>>>> >> wrote:
> >> >> >>>>> >> >>>
> >> >> >>>>> >> >>> On 3/23/15 03:55 , Guillaume Nodet wrote:
> >> >> >>>>> >> >>>>
> >> >> >>>>> >> >>>> There's a call to interrupt() in
> >> Felix#acquireBundleLock(),
> >> >> not
> >> >> >>>>> sure
> >> >> >>>>> >> if
> >> >> >>>>> >> >>>> it
> >> >> >>>>> >> >>>> can be the culprit though.
> >> >> >>>>> >> >>>> Interrupts could also be caused by a bundle being
> shutdown
> >> >> while
> >> >> >>>>> one
> >> >> >>>>> >> of
> >> >> >>>>> >> >>>> its
> >> >> >>>>> >> >>>> thread is waiting for a service, which should is a
> valid
> >> use
> >> >> case
> >> >> >>>>> >> imho.
> >> >> >>>>> >> >>>> Anyway, I think sanely reacting to a thread being
> >> interrupted
> >> >> >>>>> would be
> >> >> >>>>> >> >>>> good.
> >> >> >>>>> >> >>>
> >> >> >>>>> >> >>>
> >> >> >>>>> >> >>> Yes, threads can be interrupted if they are holding a
> >> bundle
> >> >> lock
> >> >> >>>>> and
> >> >> >>>>> >> the
> >> >> >>>>> >> >>> global lock holder needs the bundle lock.
> >> >> >>>>> >> >>>
> >> >> >>>>> >> >>> I admit that I do not recall why we ignore the interrupt
> >> >> here, but
> >> >> >>>>> >> didn't
> >> >> >>>>> >> >>> we
> >> >> >>>>> >> >>> implement service lookup so that a bundle lock wasn't
> >> >> necessary? I
> >> >> >>>>> >> >>> thought
> >> >> >>>>> >> >>> we just checked for the validity of the bundle context
> >> before
> >> >> >>>>> returning
> >> >> >>>>> >> >>> or
> >> >> >>>>> >> >>> something. Perhaps we felt there was no reason to be
> >> >> interrupted in
> >> >> >>>>> >> that
> >> >> >>>>> >> >>> case. I really don't know.
> >> >> >>>>> >> >>
> >> >> >>>>> >> >> I think that the Service Registry could be rewritten to
> be
> >> >> >>>>> completely
> >> >> >>>>> >> >> free of synchronized blocks using the Java 5 concurrency
> >> >> libraries,
> >> >> >>>>> >> >
> >> >> >>>>> >> >
> >> >> >>>>> >> > Well, that just moves the sync blocks to the library, but
> >> yeah
> >> >> sure.
> >> >> >>>>> >> >
> >> >> >>>>> >> >> which I think would really be a better approach. There is
> >> too
> >> >> much
> >> >> >>>>> >> >> locking going on in the current SR implementation IMHO.
> >> >> >>>>> >> >
> >> >> >>>>> >> >
> >> >> >>>>> >> > I don't really think there is too much, but it is
> >> complicated.
> >> >> >>>>> >> > Unfortunately, it is complicated to make sure that locks
> >> aren't
> >> >> held
> >> >> >>>>> >> while
> >> >> >>>>> >> > do service lookups and this is complicated because you can
> >> run
> >> >> into
> >> >> >>>>> >> cycles,
> >> >> >>>>> >> > etc.
> >> >> >>>>> >> >
> >> >> >>>>> >> > But feel free to try to simplify it.
> >> >> >>>>> >> >
> >> >> >>>>> >> >>
> >> >> >>>>> >> >> This brings the question: can we move to Java 5 (or Java
> 6)
> >> >> for the
> >> >> >>>>> >> >> Framework codebase? AFAIK we're currently still JDK 1.4
> >> >> compatible
> >> >> >>>>> but
> >> >> >>>>> >> >> I would be surprised if there is anyone who still needs a
> >> JDK
> >> >> that
> >> >> >>>>> >> >> went end-of-life 7 years ago.
> >> >> >>>>> >> >
> >> >> >>>>> >> >
> >> >> >>>>> >> > At this point, it doesn't really matter to me.
> >> >> >>>>> >> >
> >> >> >>>>> >> > -> richard
> >> >> >>>>> >> >
> >> >> >>>>> >> >>
> >> >> >>>>> >> >> Best regards,
> >> >> >>>>> >> >>
> >> >> >>>>> >> >> David
> >> >> >>>>> >> >
> >> >> >>>>> >> >
> >> >> >>>>> >>
> >> >> >>>>>
> >> >> >>>>
> >> >> >>>>
> >> >>
> >>
>

Reply via email to