Skip to content

Conversation

@lovesegfault
Copy link
Member

Motivation

Build the output reference graph and inverse output map before running
topoSort, avoiding quadratic complexity when determining which outputs
reference each other. This fixes the FIXME comment about building the
inverted map up front.

The outputGraph (StorePath → StorePathSet) maps each output to its
references, and will be reused in future commits to generate detailed
cycle error messages showing which files contain problematic references.

Adapted from Lix commit 10c04ce84.

Change-Id: Ibdd46e7b2e895bfeeebc173046d1297b41998181
Co-Authored-By: Maximilian Bosch [email protected]

Context


Add 👍 to pull requests you find important.

The Nix maintainer team uses a GitHub project board to schedule and track reviews.

Copy link
Member

@Ericson2314 Ericson2314 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK let me know what you think @lovesegfault. The original code from @Ma27 unnecessarily made its own data structures when we already had a graph data structure on hand. If you go commit-by-commit and disable whitespace, it should be fairly easy to read.

@lovesegfault
Copy link
Member Author

Nice, thanks @Ericson2314! This looks good to me :)

@Ericson2314 Ericson2314 added this pull request to the merge queue Nov 26, 2025
@xokdvium xokdvium removed this pull request from the merge queue due to a manual request Nov 26, 2025
@Ericson2314 Ericson2314 force-pushed the pre-compute-outputgraph branch from e533c4c to 5308f10 Compare November 28, 2025 00:02
@github-actions github-actions bot added the store Issues and pull requests concerning the Nix store label Nov 28, 2025
@Ericson2314
Copy link
Member

@xokdvium how is it now, with the first commit ensuring that making things by reference actually gives us value?

@Ericson2314 Ericson2314 requested a review from xokdvium November 28, 2025 02:36
Ericson2314 and others added 3 commits November 28, 2025 21:38
- No `std::function` overhead

- Don't copy if not necessary

Co-authored-by: Sergei Zimmerman <[email protected]>
… complexity

Build the inverse of `scratchOuputs` before running topoSort, avoiding
quadratic complexity when determining which outputs reference each
other. This fixes the FIXME comment about building the inverted map up
front.

Inspired by Lix commit 10c04ce84 / Change Id
Ibdd46e7b2e895bfeeebc173046d1297b41998181, but ended up being completely
different code.

Co-Authored-By: Maximilian Bosch <[email protected]>
Co-Authored-By: Bernardo Meurer Costa <[email protected]>
We can precompute the exact information we need for topo sorting and
store it in `PerhapsNeedToRegister`. Depending on how `topoSort` works,
this is easy a performance improvement or just completely harmless.

Co-Authored-By: Bernardo Meurer Costa <[email protected]>
@Ericson2314 Ericson2314 force-pushed the pre-compute-outputgraph branch from 4810718 to c33b2c5 Compare November 29, 2025 02:41
@Ericson2314 Ericson2314 added this pull request to the merge queue Nov 29, 2025
Merged via the queue into NixOS:master with commit 01dbbc9 Nov 29, 2025
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

store Issues and pull requests concerning the Nix store

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants