1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-15 06:52:43 +01:00
Commit graph

4847 commits

Author SHA1 Message Date
John Ericson
99cb85cd37 Revert "If a substitute closure is incomplete, build dependencies, then retry the substituter"
As summarized in
https://github.com/NixOS/nix/issues/77#issuecomment-2843228280 the
motivation is that the complicated retry logic this introduced was
making the cleanup task #12628 harder to accomplish. It was not easy to
ascertain just what policy / semantics the extra control-flow was
implementing, in order to figure out a different way to implementing it
either.

After talking to Eelco about it, he decided we could just....get rid of
the feature entirely! It's a bit scary removing a decade+ old feature,
but I think he is right. See the release notes for more explanation.

This reverts commit 299141ecbd.

Co-authored-by: Eelco Dolstra <edolstra@gmail.com>
2025-05-14 20:16:40 -04:00
John Ericson
f70796309d
Merge pull request #13193 from xokdvium/lru-cache
libutil: Less unnecessary copying in `LRUCache`
2025-05-14 19:29:53 -04:00
John Ericson
d7481b4b63 Factor out resolveStoreConfig
Leverage #10766 to show how we can now resolve a store configuration
without actually opening the store for that resolved configuration.

Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2025-05-14 18:30:25 -04:00
Sergei Zimmerman
cd61e922ff
libutil: Use heterogeneous lookup for LRUCache
This gets rid of some ugly std::string_view -> std::string
conversions, which are an eye-sore and lead to extra copying.
2025-05-14 21:42:35 +00:00
John Ericson
d972f9e2e2 Split out store-open.hh and store-registration.hh
The existing header is a bit too big. Now the following use-cases are
separated, and get their own headers:

- Using or implementing an arbitrary store: remaining `store-api.hh`

  This is closer to just being about the `Store` (and `StoreConfig`)
  classes, as one would expect.

- Opening a store from a textual description: `store-open.hh`

  Opening an aribtrary store implementation like this requires some sort
  of store registration mechanism to exists, but the caller doesn't need
  to know how it works. This just exposes the functions which use such a
  mechanism, without exposing the mechanism itself

- Registering a store implementation: `store-registration.hh`

  This requires understanding how the mechanism actually works, and the
  mechanism in question involves templated machinery in headers we
  rather not expose to things that don't need it, as it would slow down
  compilation for no reason.
2025-05-14 16:07:57 -04:00
Jörg Thalheim
e088ab3eaf
Merge pull request #13154 from obsidiansystems/split-store-config
Stores no longer inherit from their configs
2025-05-14 21:08:40 +02:00
Sergei Zimmerman
20a724d131
docs: Fix miscellaneous typos and formatting issues 2025-05-13 22:20:11 +00:00
John Ericson
934918ba16 Stores no longer inherit from their configs
Fix #10766

See that ticket for details.

Progress (I hope!) towards #11139.

Co-Authored-By: Sergei Zimmerman <xokdvium@proton.me>
2025-05-13 15:56:35 -04:00
Jörg Thalheim
0f985fea11
Merge pull request #13138 from NixOS/register-builtin-builders
Register builtin builders
2025-05-13 08:50:19 +02:00
Eelco Dolstra
5a84237209 Improve build failure error messages
They're now laid out in a more readable way, and they shows the output
paths (if known).
2025-05-12 15:06:54 +02:00
Eelco Dolstra
060c34b664 Attempt to fix macOS build 2025-05-06 08:50:14 +02:00
Eelco Dolstra
f59ccb468e Simplify Implementations registration 2025-05-05 08:41:23 +02:00
Eelco Dolstra
1479305001 Simplify RegisterBuiltinBuilder 2025-05-05 08:16:09 +02:00
Eelco Dolstra
c7a84b9160 Pass tmpDirInSandbox to the builtin builders 2025-05-04 22:19:34 +02:00
Eelco Dolstra
fe0124fe17 Put the builder context in a struct 2025-05-04 22:14:11 +02:00
Eelco Dolstra
40bbad3be5 Allow dynamic registration of builtin builders 2025-05-04 22:09:45 +02:00
Jörg Thalheim
469a6371ec
Merge pull request #13121 from tomberek/tomberek.redirect_http
fix: allow redirected HTTP uploads
2025-05-03 09:33:19 +02:00
Sergei Zimmerman
ebb836d499
Use transparent comparators for std::set<std::string> (NFC)
This patch finally applies the transition to std::less<>,
which is a transparent comparator. There's no functional
change and string lookups in sets are now more efficient
and don't produce temporaries (e.g. set.find(std::string_view{"key"})).
2025-05-02 17:43:02 +00:00
Sergei Zimmerman
5278cd2396
libstore: Introduce WorkerProto::FeatureSet alias
Unfortunately Feature is just an alias to `std::string`
and not a new-type, so a ton of code relies on it being
exactly a `std::string`.

Using transparent comparators just for StringSet necessitates
using it here as well.
2025-05-02 17:40:34 +00:00
Sergei Zimmerman
55815ec225
treewide: Use PathSet alias consistently instead of std::set<Path> 2025-05-02 17:40:31 +00:00
Sergei Zimmerman
d8c97d8073
treewide: Use StringSet alias consistently instead of std::set<std::string>
The intention is to switch to transparent comparators from N3657 for
ordered set containers for strings and using the alias consistently
would simplify things.
2025-05-02 17:40:29 +00:00
Thomas Bereknyei
90deb665eb fix: allow redirected HTTP uploads
When a PUT is redirected, some of the data can be sent by curl before headers are read. This means the subsequent PUT operation needs to seek back to origin.
2025-05-01 11:11:49 -04:00
Jörg Thalheim
979d5a7cae Drop fs alias in favour of std::filesystem
Since we dropped fs::symlink_exists, we no longer have a need for the fs
namespace. Having less abstractions makes it easier to lookup the
functions in reference documentations.
2025-05-01 14:24:34 +02:00
Jörg Thalheim
5b59be914d Replace symlink_exists with pathExists
As it turns out the orignal implementation of symlink_exists cannot be
used in Nix because it did now std::filesystem::filesystem_error.
The new implementation fixes that but is now actually the same as
pathExists except for the path type.
2025-05-01 14:22:35 +02:00
Jörg Thalheim
1c4496f4e5 replace all instances of std::filesystem::directory_iterator with DirectoryIterator 2025-05-01 11:54:26 +02:00
Philipp Otterbein
788be3f964 bugfix in getInteger(const nlohmann::json &) and add bounds checks
improve error messages, too
2025-04-30 01:38:48 +02:00
John Ericson
46030181d4 Delete dead code
We had multiple copies of some static functions after splitting out
`DerivationBuilder` by mistake.
2025-04-28 11:19:36 -04:00
Robert Hensing
8a1c40b927
Merge pull request #13065 from roberth/escapeShellArg
Rename `shellEscape` -> `escapeShellArgAlways`
2025-04-23 23:35:15 +02:00
Robert Hensing
1e5b1d9973 Rename shellEscape -> escapeShellArgAlways
This name is close to the Nixpkgs lib function `escapeShellArg`,
making it easier to find.

A friendlier function with the same behavior as lib could be added
later.
2025-04-23 22:56:07 +02:00
Eelco Dolstra
d07541be29 DerivationBuilder: Fix compiler warning
Fixes

  ../src/libstore/unix/build/derivation-builder.cc:1130:86: warning: the compiler can assume that the address of ‘nix::DerivationBuilderParams::drv’ will never be NULL [-Waddress]
   1130 |     if (useChroot && settings.preBuildHook != "" && dynamic_cast<const Derivation *>(&drv)) {
        |                                                                                        ^~~~

Assuming this check was left over from the time `drv` could be a
`BasicDerivation`.
2025-04-23 17:28:09 +02:00
John Ericson
155411397d
Merge pull request #13055 from obsidiansystems/inlined-resolvedFinished
Inline `DerivationGoal::resolvedFinished`
2025-04-20 19:11:38 -04:00
John Ericson
54b7ccc466
Merge pull request #13053 from obsidiansystems/no-more-local-derivation-goal
Get rid of `LocalDerivationGoal`
2025-04-20 18:50:05 -04:00
John Ericson
16f640a9b2 Inline DerivationGoal::resolvedFinished
`resolvedDrvGoal` can just become a local variable!
2025-04-20 18:32:19 -04:00
Robert Hensing
15fa95f925
Merge pull request #13052 from rhendric/rhendric/increase-429-delay
libstore: increase retry delay for 429
2025-04-21 00:31:15 +02:00
John Ericson
4e586149df Get rid of LocalDerivationGoal
I split it out before to try to separate the building logic, but now we
have the much better `DerivationBuilder` abstraction for that. With that
change, I think `LocalDerivationGoal` has outlived its usefulness.

We just inline it back into `DerivationGoal`, and do so with minimal
`#ifdef` for Windows.

Note that the order of statements in `~DerivationGoal` is different than
it was after the `~LocalDerivationGoal` split, but it is *restored* to
the way it original was before --- evidently I did the split slightly
wrong, but nobody noticed, probably because the order doesn't actually
matter.

Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2025-04-20 18:09:41 -04:00
Robert Hensing
047f2bc1af refactor: Extract RETRY_TIME constants in filetransfer 2025-04-20 23:29:22 +02:00
Ryan Hendrickson
85420b8537 libstore: increase retry delay for 429
A 429 (Too Many Requests) error should not be retried after a quarter of
a second; that's just silly. GitHub recommends a minute.
2025-04-20 14:49:03 -04:00
John Ericson
5eeeb44f79 Remove double indirection from DerivationBuilder params
Now that `DerivationBuilder` is created after the underlying data has
already been initialized, we can just refer this data normally, with a
direct reference.

Only `parsedDrv` takes a (borrowing) pointer, because independent of
initialization the derivation may or may not have structured attrs.
2025-04-18 12:26:05 -04:00
John Ericson
2b2ea218d9 Delay constructing a DerivationBuilder until we're about to build
This makes the simplification in the following commit possible.
2025-04-18 12:26:05 -04:00
John Ericson
27907e6cac Add documentation for DerivationBuilder::{parsedDrv, drvOptions} 2025-04-18 12:26:05 -04:00
John Ericson
9792d6bbd9 Move DerivationBuilder to its own file/header
The building logic is now free of the scheduling logic!

(The interface between them is just what is in the new header. This
makes it much easier to audit, and shrink over time.)
2025-04-16 18:59:17 -04:00
John Ericson
6c2a7fdc49 Copy local-derivation-goal.cc to derivation-builder.{cc,hh}
This is done to prior to splitting, just like
05cc5a8587 for
68f4c728ec.
2025-04-16 18:59:17 -04:00
John Ericson
d98c0dbe99 Start separating scheduling from building
We have a new `DerivationBuilder` struct, and `DerivationBuilderParams`
`DerivationBuilderCallbacks` supporting it.

`LocalDerivationGoal` doesn't subclass any of these, so we are ready to
now move them out to a new file!
2025-04-16 17:54:56 -04:00
John Ericson
f81c06accf Gut LocalDerivationGoal::tryLocalBuild
Now, most of it is in two new functions:
`LocalDerivationGoal::{,un}repareBuild`.

This might seems like a step backwards from coroutines --- now we have
more functions, and are stuck with class vars --- but I don't think it
needs to be.

There's a few options here:

- (Re)introduce coroutines for the isolated building logic. We could use the
  same coroutines types, or simpler ones specialized to this use-case.
  The `tryLocalBuild` caller can still use `Goal::Co`, and just will
  manually "pump" this inner coroutine.

- Return closures from each step. This is sort of like coroutines by
  hand, but it still allows us to stop writing down the local variables
  in each type.

  Being able to fully-use RAII again would be very nice!

- Keep top-level first-order functions like now, but make more
  functional. Instead of having one state object (`DerivationBuilder`)
  for all steps (setup, run, teardown), we can have separate structs for
  the live variables at each point we consume and return.

  This at least avoids "are these variables active at this time?"
  questions, but doesn't give us the full benefit of RAII as we must
  manually ensure FIFO create/destroy orders still.

One thing to note is that by keeping the `outputLock` unlocking in
`tryLocalBuild`, we are arguably uncovering a rebuild scheduling vs
building distinction, as the output locks are pretty squarely a
scheduling concern. It's nice that the builder doesn't need to know
about them at all.
2025-04-16 17:39:45 -04:00
John Ericson
ae7f411a18 Remove some unused includes
This is unreleated to the other commits in this PR.
2025-04-16 17:39:22 -04:00
John Ericson
e83ef7a477 Make appendLogTailErrorMsg as class method after all
The other parameters it took were somewhat implementation-specific.
2025-04-16 15:40:59 -04:00
Jörg Thalheim
89ba6dff66
Merge pull request #13032 from obsidiansystems/more-outputs-test
Some checks failed
CI / eval (push) Has been cancelled
CI / tests ${{ matrix.scenario }} (darwin, macos-14, on macos) (push) Has been cancelled
CI / tests ${{ matrix.scenario }} (linux, ubuntu-24.04, on ubuntu) (push) Has been cancelled
CI / Check Docker secrets present for installer tests (push) Has been cancelled
CI / vm_tests (push) Has been cancelled
CI / installer test ${{ matrix.scenario }} (darwin, macos-14, on macos) (push) Has been cancelled
CI / installer test ${{ matrix.scenario }} (linux, ubuntu-24.04, on ubuntu) (push) Has been cancelled
CI / docker_push_image (push) Has been cancelled
CI / flake_regressions (push) Has been cancelled
Improve derivation "advanced attrs" test, fix almost-bug
2025-04-15 19:08:35 +02:00
John Ericson
32409dd7d7 Remove stray assignment side affect in lambda
This was almost a bug! It wasn't simply because another assignment would
clobber it later.
2025-04-15 12:29:17 -04:00
John Ericson
d8be4f618f Scrap ParsedDerivation for parts
Only a much smaller `StructuredAttrs` remains, the rest is is now moved
to `DerivationOptions`.

This gets us quite close to `std::optional<StructuredAttrs>` and
`DerivationOptions` being included in `Derivation` as fields.
2025-04-14 16:14:41 -04:00
John Ericson
1e31b60043 Limit ParsedDerivation just to the derivation's environment
This moves us towards getting rid of `ParsedDerivation` and just having
`DerivationOptions`.

Co-Authored-By: HaeNoe <git@haenoe.party>
2025-04-14 15:46:55 -04:00