Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter use-constraint violating providers of packages #607

Merged
merged 1 commit into from
Sep 14, 2024

Conversation

laeubi
Copy link
Member

@laeubi laeubi commented May 3, 2024

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
Copy link
Member Author

laeubi commented May 3, 2024

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"

Copy link

github-actions bot commented May 3, 2024

Test Results

  660 files  ±0    660 suites  ±0   1h 17m 22s ⏱️ +13s
2 201 tests ±0  2 154 ✅ ±0   47 💤 ±0  0 ❌ ±0 
6 747 runs  ±0  6 604 ✅ ±0  143 💤 ±0  0 ❌ ±0 

Results for commit 52f09fc. ± Comparison against base commit c386b71.

♻️ This comment has been updated with latest results.

@laeubi laeubi force-pushed the filter_uses_violations branch 2 times, most recently from 21847e4 to 5b7de35 Compare May 4, 2024 08:06
@laeubi
Copy link
Member Author

laeubi commented May 4, 2024

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

@laeubi laeubi requested a review from tjwatson May 11, 2024 16:23
@laeubi laeubi force-pushed the filter_uses_violations branch 5 times, most recently from 3168237 to 09f19aa Compare June 9, 2024 05:10
@laeubi
Copy link
Member Author

laeubi commented Jun 9, 2024

Rebased and build is now green again!

@laeubi
Copy link
Member Author

laeubi commented Jun 16, 2024

@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.

@laeubi laeubi force-pushed the filter_uses_violations branch 2 times, most recently from 6e3bb41 to 23aa376 Compare September 10, 2024 09:42
@laeubi
Copy link
Member Author

laeubi commented Sep 10, 2024

I plan to merge this if there are no further comments/concerns so we have enough time to find possible issues.

@laeubi laeubi force-pushed the filter_uses_violations branch 2 times, most recently from 81e4423 to a5715d6 Compare September 13, 2024 13:38
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 laeubi merged commit b1adfa2 into eclipse-equinox:master Sep 14, 2024
26 of 27 checks passed
@iloveeclipse
Copy link
Member

This change causes API error The minor version should be incremented in version 3.21.100, since new APIs have been added since version 3.21.0.

- The non-abstract method org.eclipse.osgi.container.ModuleContainer.toString(Resource) has been added

@iloveeclipse
Copy link
Member

Fix: #673

iloveeclipse added a commit that referenced this pull request Sep 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants