[ https://issues.apache.org/jira/browse/FELIX-4182?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thomas Watson updated FELIX-4182: --------------------------------- Attachment: org.apache.felix.resolver.patch Possible fix. Fix for retry with less optional resources: Methods changed: ResolverImpl.resolve(ResolveContext) When rethrow!=null there was some code to try and look at the requirements from the rethrow and see if any of them came from optional resources and if so to remove them. This has issues because in most cases the ResolutionException is not getting populated with the requirements (another bug I thing). But this also has certain issues because the rethrow only holds the very last instance of rethrow for the last permutation checked. That may not really be the resource you want to throw out. This patch takes different approach by recording each 'root' resource that results in an inconsistent class space exception for a given solution. As each solution is checked it is determined if the solution results in less root resources causing inconsistencies (faultyResources). At the end if no consistent solution is found then we throw out all optional resources that are contained in the faultyResources with the assumption that the faultyResources is the smallest collection possible and that removing them as root resources will result in a possible solution for the remaining optional and mandatory resources. It is still possible that the resources removed could get pulled back in for the next attempt, but then we will not be able to remove them again and it should cause the resolve loop to end. ----------------------------------------- Fix for split package class space consistency check: Methods changed: ResolverImpl.getPackageSourcesInternal) With split packages it is possible to get duplicate sources added to the list. This change just checks for duplicates to avoid that ResolverImpl.isCompatible Changed it to take a List<Blame> for the currentBlames since multiple bundle-requirements may lead to multiple blames for the same package name (multiple sources) If there are multiple then package sources for each 'root' source is gathered for a complete list of sources for the package. This is important for cases where a bundle requires one or more bundles that provide the same package so that we can get a proper list of package sources from the perspective of the requiring bundle. ResolverImpl.checkDynamicPackageSpaceConsistency The changes are around the calls to isCompatible. Instead of looping over each requirement Blame (from either a single Import-Package or a list of Require-Bundle) the patch now considers the List<Blame> as one when calling isCompatible with the usedBlame If the List<Blame> turns out to cause a consistency issue then the code iterates over each req from the List<Blame> and sees if it can permutate it (not 100% sure if this is the right approach). Before would only permutate the first req that caused the issue, but now that we consider them all as contributing to the issue I decided to attempt to permutate all of them. > Issues with package space consistency check > ------------------------------------------- > > Key: FELIX-4182 > URL: https://issues.apache.org/jira/browse/FELIX-4182 > Project: Felix > Issue Type: Bug > Components: Resolver > Environment: All > Reporter: Thomas Watson > Attachments: org.apache.felix.resolver.patch > > > There are two issues here. I could separate this into two reports but I need > them both fixed at the same time and will be providing a patch shortly that > addresses both of the following issues: > 1) ResolverImpl.resolve(ResolveContext) fails hard if a consistent class > space cannot be found for all optional resources being resolved. It would be > nice of the resolve process could eliminate some optional resources that are > the 'roots' that caused the inconsistent class space and try again. > 2) There is a case where a false positive inconsistency is reported for > require-bundle and split packages. Here is the scenario > Bundle uses.a > Export-Package: > uses1; uses:="uses2"; A="split"; mandatory:="A", > uses2; A="split"; mandatory:="A" > Bundle uses.b > Export-Package: > uses1; uses:="uses2"; B="split"; mandatory:="B", > uses2; B="split"; mandatory:="B" > Bundle uses.d > Require-Bundle: uses.a, uses.b > In this scenario, if an attempt is made to resolve uses.d then > checkDynamicPackageSpaceConsistency method will detect that uses2 is > inconsistent for resource uses.d because it gets it from two different > sources uses.a and uses.b. You get something like the following error > message: > Uses constraint violation. Unable to resolve resource uses.d [osgi.identity; > osgi.identity="uses.d"; type="osgi.bundle"; version:Version="1.0.0"] because > it is exposed to package 'uses2' from resources uses.a [osgi.identity; > osgi.identity="uses.a"; type="osgi.bundle"; version:Version="1.0.0"] and > uses.b [osgi.identity; osgi.identity="uses.b"; type="osgi.bundle"; > version:Version="1.0.0"] via two dependency chains. > Chain 1: > uses.d [osgi.identity; osgi.identity="uses.d"; type="osgi.bundle"; > version:Version="1.0.0"] > require: (osgi.wiring.bundle=uses.a) > | > provide: osgi.wiring.bundle: uses.a > uses.a [osgi.identity; osgi.identity="uses.a"; type="osgi.bundle"; > version:Version="1.0.0"] > Chain 2: > uses.d [osgi.identity; osgi.identity="uses.d"; type="osgi.bundle"; > version:Version="1.0.0"] > require: (osgi.wiring.bundle=uses.b) > | > provide: osgi.wiring.bundle: uses.b > uses.b [osgi.identity; osgi.identity="uses.b"; type="osgi.bundle"; > version:Version="1.0.0"] > The issue is in the check for isCompatible. This method attempts to address > split packages, but only for the provider of the split package, it does not > aggregate the split sources for clients using require-bundle to gather all > the sources of the split package. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira