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

Push priorities to pubgrub and solve virtual package with the strongest constraints first #10935

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

konstin
Copy link
Member

@konstin konstin commented Jan 24, 2025

We were updating package priorities in without syncing them with pubgrub, so uv and pubgrub were getting out of sync. Surprisingly, this didn't cause any apparent differences in resolution, I expected this would change at least our ecosystem cases. It's potentially breaking through any time we change something in either uv or pubgrub.

We fix this by pushing updates to pubgrub. We couldn't previously u this because the way priority updates were tracked through the decision level. Instead, we switch to tracking the packages whose derivations changed in a set, based on pubgrub-rs/pubgrub@dev...Eh2406:pubgrub:stop-prioritize. Since uv priorities don't depend on the ranges, we can speed this up further by not using this set in uv. In pubgrub, we can upstream this and use it as a correctness fix to also reprioritize when the conflict tracker changed, which is currently not handled.

I thought I had a performance regression that would be fixed by making pubgrub priorities fast by using the package ids as index. This turned out to be insufficient and the perf bottleneck had to be fixed on the pubgrub side.

Inside a package, we switch to processing the virtual package with the strongest constraint first, to avoid missing constraints:

Say we first see a; python_version ">=3.9" and then a==1; python_version ">=3.10". We would currently assign a the wrong version (e.g. a==2 ) through deciding a; python_version ">=3.9" first, then fix it up when we see a==1; python_version ">=3.10" right after.

This is a potentially breaking change in that it can change the resolution in edge cases.

@konstin konstin added bug Something isn't working performance Potential performance improvement labels Jan 24, 2025
@konstin konstin removed the performance Potential performance improvement label Jan 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant