Skip to content

path-info: implement --filter-substitutable#7587

Draft
nrdxp wants to merge 1 commit intoNixOS:masterfrom
nrdxp:path-info-substitutes
Draft

path-info: implement --filter-substitutable#7587
nrdxp wants to merge 1 commit intoNixOS:masterfrom
nrdxp:path-info-substitutes

Conversation

@nrdxp
Copy link

@nrdxp nrdxp commented Jan 11, 2023

Fixes #3946

Alternative to #7526 which implements the same logic in the new cli instead of the legacy nix-store

Checklist for maintainers

Maintainers: tick if completed or explain if not relevant

  • agreed on idea
  • agreed on implementation strategy
  • tests, as appropriate
    • functional tests - tests/**.sh
    • unit tests - src/*/tests
    • integration tests - tests/nixos/*
  • documentation in the manual
  • code and comments are self-explanatory
  • commit message explains why the change was made
  • new feature or bug fix: updated release notes

@nrdxp
Copy link
Author

nrdxp commented Jan 12, 2023

@roberth, it seems this implementation is fast, but it suffers from only every querying the official cache (cache.nixos.org). Trying to nail down why exactly that is has been sort of a PITA. Do you happen to have any insight into that?

Update
Scratch that, I found a fix by manually running queryValidPaths on each substituter

Comment on lines 127 to 130
substitutablePaths.find(store->followLinksToStorePath(storePathS)) ==
substitutablePaths.end()
? v["substitutable"] = false
: v["substitutable"] = true;
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
substitutablePaths.find(store->followLinksToStorePath(storePathS)) ==
substitutablePaths.end()
? v["substitutable"] = false
: v["substitutable"] = true;
v["substitutable"] = (bool) substitutablePaths.count(store->followLinksToStorePath(storePathS));

Copy link
Member

Choose a reason for hiding this comment

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

Maybe instead of a substitutable bool, it should return an array of substituters?

Copy link
Author

Choose a reason for hiding this comment

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

Good idea

Copy link
Author

Choose a reason for hiding this comment

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

So now that I've figured out why Store::querySubstitutablePaths wasn't working: #7587 (comment), I'm not sure how to easily do this. If I stick with defining the logic myself it should be easy though.

Attempts at using querySubstitutablePathInfos result in much slower queries which is why I moved away from that implementation. One possibility would be to add a flag to queryMissing to ignore the local store, but that would break the API.

@nrdxp
Copy link
Author

nrdxp commented Jan 23, 2023

I'm starting to think that I am just gonna have to make a new sub-command for this functionality, as the BuiltPathsCommand doesn't seem like the right choice. It completely removes paths that don't exist locally from the input, which is sorta counterproductive to what we want here.

Also have some async refactor work here that I'd like to include, but that might be better off as a separate PR.

edit
So I think I'd like to do something like this in a new subcommand:
divnix/nix-uncached#1

Running all queries asynchronously is faster than waiting to query subsequent caches based on results from previous caches in my benchmarks so far. In addition, returning a json of uncached output dependencies seems like the right move so that they can be easily passed to a build command.

I've also opted to filter out derivations with preferLocalBuild since these will likely never be pulled from a cache anyway. It can save hundreds of queries in some cases (like a NixOS system closure).

@domenkozar
Copy link
Member

That's awesome work @nrdxp

});

addFlag({
.longName = "query-substitutes",
Copy link
Member

Choose a reason for hiding this comment

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

Maybe this should be named --filter-substitutable or something like that? Since it doesn't really query what the substitutes are.

Fixes NixOS#3946

Filters out any paths from the output which are already available in
the configured substituters. Useful in CI environments, to avoid builds
that are already cached.
@fricklerhandwerk
Copy link
Contributor

@nrdxp please add a release note.

@tomberek
Copy link
Contributor

Oops… misclick.

@tomberek tomberek closed this Feb 11, 2023
@tomberek tomberek reopened this Feb 11, 2023
@fricklerhandwerk fricklerhandwerk added feature Feature request or proposal new-cli Relating to the "nix" command labels Mar 3, 2023
@edolstra edolstra removed their assignment Apr 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Feature request or proposal new-cli Relating to the "nix" command

Projects

None yet

Development

Successfully merging this pull request may close these issues.

support building only drvs that lack substitutes (aka nix-build-uncached)

5 participants