eclipse-equinox / equinox

equinox
Eclipse Public License 2.0
28 stars 60 forks source link

Filter use-constraint violating providers of packages #607

Open laeubi opened 2 months ago

laeubi commented 2 months ago

If a provider is chosen for a given requirement this can imply that also other providers are now become invalid, currently the resolver simply checks the whole state and adds new permutations what is rather expensive.

This now adds an additional local filtering step that checks for the chosen provider for the requirement and discards any incompatible provider for other packages in the same resource.

As a result for a small testcase this saves 3 out of 23 (~ 10%) uses permutations.

laeubi commented 2 months ago

This is how it looks for example before the filtering:

=== remove uses violations for Import-Package: com.google.gson; version="[2.9.0,3.0.0)"
== current candidate is Export-Package: com.google.gson; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; uses:="com.google.gson.internal,com.google.gson.reflect,com.google.gson.stream"
  [?]com.google.gson 2.9.1.v20220915-1632 (UNRESOLVED)
    [!]Import-Package: com.google.gson; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; uses:="com.google.gson.internal,com.google.gson.reflect,com.google.gson.stream"
    [?]Import-Package: com.google.gson.annotations; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.annotations; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"
        Export-Package: com.google.gson.annotations; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [?]Import-Package: com.google.gson.internal; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.reflect,com.google.gson.stream"
        Export-Package: com.google.gson.internal; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="  com.google.gson,  com.google.gson.reflect,  com.google.gson.stream "
    [?]Import-Package: com.google.gson.internal.bind; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.bind; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal,com.google.gson.reflect,com.google.gson.stream"
        Export-Package: com.google.gson.internal.bind; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="  com.google.gson,  com.google.gson.internal,  com.google.gson.reflect,  com.google.gson.stream "
    [?]Import-Package: com.google.gson.internal.bind.util; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.bind.util; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"
        Export-Package: com.google.gson.internal.bind.util; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"
    [?]Import-Package: com.google.gson.internal.reflect; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson"
        Export-Package: com.google.gson.internal.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="com.google.gson"
    [?]Import-Package: com.google.gson.internal.sql; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.sql; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal.bind"
        Export-Package: com.google.gson.internal.sql; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal.bind"
    [?]Import-Package: com.google.gson.reflect; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"
        Export-Package: com.google.gson.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [?]Import-Package: com.google.gson.stream; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.stream; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"
        Export-Package: com.google.gson.stream; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [!]Import-Package: sun.misc; resolution:="optional": 
        Export-Package: sun.misc; bundle-symbolic-name="org.eclipse.osgi"; bundle-version="3.18.500.v20230801-1826"; version="0.0.0"
    [!]Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=1.7))": 
        Provide-Capability: osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0.0,1.1.0,1.2.0,1.3.0,1.4.0,1.5.0,1.6.0,1.7.0,1.8.0,9.0.0,10.0.0,11.0.0,12.0.0,13.0.0,14.0.0,15.0.0,16.0.0,17.0.0"
    [!]Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=1.7))": 
        Provide-Capability: osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0.0,1.1.0,1.2.0,1.3.0,1.4.0,1.5.0,1.6.0,1.7.0,1.8.0,9.0.0,10.0.0,11.0.0,12.0.0,13.0.0,14.0.0,15.0.0,16.0.0,17.0.0"

as one can see the provider chosen for com.google.gson makes it only possible for some other packages to choose the same provider due to its uses constraints what are the following (transitively):

 uses: com.google.gson
 uses: com.google.gson.internal
 uses: com.google.gson.reflect
 uses: com.google.gson.stream

this then results in the following filtered candidate set:

  [?]com.google.gson 2.9.1.v20220915-1632 (UNRESOLVED)
    [!]Import-Package: com.google.gson; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; uses:="com.google.gson.internal,com.google.gson.reflect,com.google.gson.stream"
    [?]Import-Package: com.google.gson.annotations; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.annotations; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"
        Export-Package: com.google.gson.annotations; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [!]Import-Package: com.google.gson.internal; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="  com.google.gson,  com.google.gson.reflect,  com.google.gson.stream "
    [?]Import-Package: com.google.gson.internal.bind; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.bind; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal,com.google.gson.reflect,com.google.gson.stream"
        Export-Package: com.google.gson.internal.bind; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="  com.google.gson,  com.google.gson.internal,  com.google.gson.reflect,  com.google.gson.stream "
    [?]Import-Package: com.google.gson.internal.bind.util; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.bind.util; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"
        Export-Package: com.google.gson.internal.bind.util; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"
    [?]Import-Package: com.google.gson.internal.reflect; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson"
        Export-Package: com.google.gson.internal.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="com.google.gson"
    [?]Import-Package: com.google.gson.internal.sql; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.internal.sql; bundle-symbolic-name="com.google.gson"; bundle-version="2.10.1.v20230109-0753"; version="2.10.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal.bind"
        Export-Package: com.google.gson.internal.sql; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"; x-internal:="true"; uses:="com.google.gson,com.google.gson.internal.bind"
    [!]Import-Package: com.google.gson.reflect; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.reflect; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [!]Import-Package: com.google.gson.stream; version="[2.9.0,3.0.0)": 
        Export-Package: com.google.gson.stream; bundle-symbolic-name="com.google.gson"; bundle-version="2.9.1.v20220915-1632"; version="2.9.1"
    [!]Import-Package: sun.misc; resolution:="optional": 
        Export-Package: sun.misc; bundle-symbolic-name="org.eclipse.osgi"; bundle-version="3.18.500.v20230801-1826"; version="0.0.0"
    [!]Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=1.7))": 
        Provide-Capability: osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0.0,1.1.0,1.2.0,1.3.0,1.4.0,1.5.0,1.6.0,1.7.0,1.8.0,9.0.0,10.0.0,11.0.0,12.0.0,13.0.0,14.0.0,15.0.0,16.0.0,17.0.0"
    [!]Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=1.7))": 
        Provide-Capability: osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0.0,1.1.0,1.2.0,1.3.0,1.4.0,1.5.0,1.6.0,1.7.0,1.8.0,9.0.0,10.0.0,11.0.0,12.0.0,13.0.0,14.0.0,15.0.0,16.0.0,17.0.0"
github-actions[bot] commented 2 months ago

Test Results

  660 files  ±0    660 suites  ±0   1h 12m 49s :stopwatch: +27s 2 195 tests ±0  2 148 :white_check_mark: ±0   47 :zzz: ±0  0 :x: ±0  6 729 runs  ±0  6 586 :white_check_mark: ±0  143 :zzz: ±0  0 :x: ±0 

Results for commit 7ddbc243. ± Comparison against base commit c8ce7365.

:recycle: This comment has been updated with latest results.

laeubi commented 2 months ago

I now added a system property to disable the feature just in case it causes problems somewhere.

laeubi commented 3 weeks ago

Rebased and build is now green again!

laeubi commented 2 weeks ago

@tjwatson I have now reworked this to pass the debugging through the logger, that way we can reuse Equinox formatting and it can be enabled/disabled by the usual debugging properties and makes the using code much cleaner.