felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Jencks (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (FELIX-4984) Issues in CircularReferenceTest
Date Wed, 12 Aug 2015 15:04:46 GMT

    [ https://issues.apache.org/jira/browse/FELIX-4984?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14693635#comment-14693635

David Jencks commented on FELIX-4984:

After studying this for a while I think that what is happening is that we're remembering to
"bind later" a reference for a component that can't possibly be created from the original
request, because of cardinality constraints.  Then when it _is_ created (due to starting at
a different point in the cycle) the leftover "bind later" request is binding the same object
as the "normally working" bind, but to a different  object than we originally expected.  I'm
not entirely sure why this only happens occasionally.

I have a proposal (see patch) to only add a "bind later" request when the cardinality is otherwise
satisfied, without the missing dependency, so that if we know the component can't be created
we don't add the "bind later" request.  Do you think this is at least on the right track?
 It now occurs to me that perhaps checking _all_ the references before adding any "bind later"
requests would be safer.

> Issues in CircularReferenceTest
> -------------------------------
>                 Key: FELIX-4984
>                 URL: https://issues.apache.org/jira/browse/FELIX-4984
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>            Reporter: Pierre De Rop
>            Priority: Minor
>         Attachments: org.apache.felix.scr.integration.CircularReferenceTest.test_A11_B0n_delayed_B_first.log
> This issue is described in the dev mailing list, in http://www.mail-archive.com/dev@felix.apache.org/msg37281.html
> while working on FELIX-4955, I sometimes have the CircularReferenceTest failing.
> Everything is located in my sandbox, in http://svn.apache.org/repos/asf/felix/sandbox/pderop/dependencymanager.ds/
> To reproduce the test:
> install eclipse Mars
> install latest bndtools using "install new software" from Eclipse, and then add latest
stable release from http://dl.bintray.com/bndtools/bndtools/latest/
> install a java8 runtime (I'm using oracle java8 1.8.0_45, 64 bit version). The whole
new dependencymanager.ds project is intented to be build in java8.
> checkout my sandbox:
> $ svn checkout http://svn.apache.org/repos/asf/felix/sandbox/pderop/dependencymanager.ds
> go to "dependencymanager.ds" directory:
> $ cd dependencymanager.ds/
> due to a pending issue, you have to first build the DM bnd annotation plugin before importing
the project into eclipse. to do so, just type:
> $ ./gradlew org.apache.felix.dependencymanager.annotation:jar
> now launch eclipse and use the the dependencymanager/ds directory as the workspace dir
for Eclipse.
> switch to BndTools perpective.
> import the bndtools project into eclipse: Import -> Existing Projects into Workspace
-> Browse -> select dependencymanager.ds directory (it is proposed by default).
> normally, and hopefully, everything should compile fine. Junit tests are left in org.apache.felix.dependencymanager.ds/
directory and integration tests are located in org.apache.felix.dependencymanager.ds.itest/
> Open under Eclipse the org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/CircularReferenceTest.java
> I slightly modified it in order to dump stack traces when A component is bound multiple
times to the same B instance.
> (I believe that only delayed components are concerned by the issue).
> For example, in the test_A11_B0n_delayed_A_first() method, I added a call to "assertABoundToOneB(a)"
like this:
> {code}
>     @Test
>     public void test_A11_B0n_delayed_A_first() throws InvalidSyntaxException
>     {
>         String componentNameA = "4.1.A.1.1.dynamic";
>         final ComponentConfigurationDTO componentA = findComponentConfigurationByName(
componentNameA, ComponentConfigurationDTO.SATISFIED );
>         String componentNameB = "4.1.B.0.n.dynamic";
>         final ComponentConfigurationDTO componentB = findComponentConfigurationByName(
componentNameB, ComponentConfigurationDTO.SATISFIED );
>         delay();
>         A a = getServiceFromConfiguration(componentA, A.class);
>         assertABoundToOneB(a);
>         delay(); //async binding of a to b after circular ref detected
>         B b = getServiceFromConfiguration(componentB, B.class);
>         assertEquals( 1, b.getAs().size() );
>     }
> {code}
> the "assertABoundToOneB(a)" call does this:
> {code}
>     private void assertABoundToOneB(A a) {
>         if (a.getBs().size() != 1) {
>             System.err.println("detected problem ...");
>             a.dumpStackTracesWhenBWasBound();
>         }
>         assertEquals( 1, a.getBs().size());
>     }
> {code}
> And stacktraces will be dumped in order to determine why A was bound two times to the
same B instance.
> it's possible that you have to run several times the "CircularReferenceTest" test before
having a failure (and some stacktraces).
> Thanks.

This message was sent by Atlassian JIRA

View raw message