lix/src
John Ericson 37fca662b0 Make KeyedBuildResult, BuildResult like before, and fix bug another way
In https://github.com/NixOS/nix/pull/6311#discussion_r834863823, I
realized since derivation goals' wanted outputs can "grow" due to
overlapping dependencies (See `DerivationGoal::addWantedOutputs`, called
by `Worker::makeDerivationGoalCommon`), the previous bug fix had an
unfortunate side effect of causing more pointless rebuilds.

In paticular, we have this situation:

1. Goal made from `DerivedPath::Built { foo, {a} }`.

2. Goal gives on on substituting, starts building.

3. Goal made from `DerivedPath::Built { foo, {b} }`, in fact is just
   modified original goal.

4. Though the goal had gotten as far as building, so all outputs were
   going to be produced, `addWantedOutputs` no longer knows that and so
   the goal is flagged to be restarted.

This might sound far-fetched with input-addressed drvs, where we usually
basically have all our goals "planned out" before we start doing
anything, but with CA derivation goals and especially RFC 92, where *drv
resolution* means goals are created after some building is completed, it
is more likely to happen.

So the first thing to do was restore the clearing of `wantedOutputs` we
used to do, and then filter the outputs in `buildPathsWithResults` to
only get the ones we care about.

But fix also has its own side effect in that the `DerivedPath` in the
`BuildResult` in `DerivationGoal` cannot be trusted; it is merely the
*first* `DerivedPath` for which this goal was originally created.

To remedy this, I made `BuildResult` be like it was before, and instead
made `KeyedBuildResult` be a subclass wit the path. Only
`buildPathsWithResults` returns `KeyedBuildResult`s, everything else
just becomes like it was before, where the "key" is unambiguous from
context.

I think separating the "primary key" field(s) from the other fields is
good practical in general anyways. (I would like to do the same thing
for `ValidPathInfo`.) Among other things, it allows constructions like
`std::map<Key, ThingWithKey>` where doesn't contain duplicate keys and
just precludes the possibility of those duplicate keys being out of
sync.

We might leverage the above someday to overload `buildPathsWithResults`
to take a *set* of return a *map* per the above.

-----

Unfortunately, we need to avoid C++20 strictness on designated
initializers.

(BTW
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2287r1.html
this offers some new syntax for this use-case. Hopefully this will be
adopted and we can eventually use it.)

No having that yet, maybe it would be better to not make
`KeyedBuildResult` a subclass to just avoid this.

Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2023-04-15 11:01:31 -04:00
..
build-remote Move enabled experimental feature to libutil struct 2023-03-20 11:05:22 -04:00
libcmd Legacy vs non-legacy to_string/parse for DerivedPath 2023-04-14 20:45:11 -04:00
libexpr Merge pull request #8170 from tweag/fix-aarch64-build 2023-04-11 12:35:23 +02:00
libfetchers Finish converting existing comments for internal API docs (#8146) 2023-04-07 13:55:28 +00:00
libmain Finish converting existing comments for internal API docs (#8146) 2023-04-07 13:55:28 +00:00
libstore Make KeyedBuildResult, BuildResult like before, and fix bug another way 2023-04-15 11:01:31 -04:00
libutil Merge pull request #8176 from tweag/rename-confusing-write-method 2023-04-14 10:44:36 +02:00
nix Start cross-referencing experimental features 2023-04-14 07:45:08 -04:00
nix-build Move enabled experimental feature to libutil struct 2023-03-20 11:05:22 -04:00
nix-channel Factor out the generation of the profile/channel directory 2023-03-23 10:22:42 +01:00
nix-collect-garbage Fix nix-collect-garbage -d with the new profile location 2023-03-07 13:08:04 +01:00
nix-copy-closure Remove FormatOrString and remaining uses of format() 2023-03-02 15:57:54 +01:00
nix-env Ensure all headers have #pragma once and are in API docs 2023-03-31 23:19:44 -04:00
nix-instantiate Revert to copyStore = true for nix-instantiate and nix-env 2022-08-23 14:40:27 +02:00
nix-store nix-store.cc: Refactor, remove qDefault 2023-04-03 18:45:20 +02:00
resolve-system-dependencies Remove FormatOrString and remaining uses of format() 2023-03-02 15:57:54 +01:00
toml11 Replace cpptoml with toml11 2021-12-17 22:03:33 +01:00