From 91bd7ce73ab7eacaf995090014f67391624531c1 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 6 Aug 2020 03:01:57 +0100 Subject: refactor(tvix): Use absl::btree_map for DerivationOutputs This container implementation is much faster than std::map. We have stuck to an ordered container because it's unclear whether the accesses of this field (of which there are *many*) are actually ordering dependent. Also includes an Arbitrary implementation for absl::btree_map (for any K, V that are also Arbitrary). Change-Id: I04f58ca0ce32b9ae1759313b01508b0e44bae793 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1683 Reviewed-by: glittershark Tested-by: BuildkiteCI --- third_party/nix/src/libstore/derivations.cc | 5 +++-- third_party/nix/src/libstore/derivations.hh | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) (limited to 'third_party/nix/src/libstore') diff --git a/third_party/nix/src/libstore/derivations.cc b/third_party/nix/src/libstore/derivations.cc index 007c268bab2a..adfc6fc05fc1 100644 --- a/third_party/nix/src/libstore/derivations.cc +++ b/third_party/nix/src/libstore/derivations.cc @@ -40,8 +40,9 @@ BasicDerivation BasicDerivation::from_proto( result.builder = proto_derivation->builder().path(); store.assertStorePath(result.builder); - result.outputs.insert(proto_derivation->outputs().begin(), - proto_derivation->outputs().end()); + for (auto [k, v] : proto_derivation->outputs()) { + result.outputs.emplace(k, v); + } result.inputSrcs.insert(proto_derivation->input_sources().paths().begin(), proto_derivation->input_sources().paths().end()); diff --git a/third_party/nix/src/libstore/derivations.hh b/third_party/nix/src/libstore/derivations.hh index 38877780e0c1..63527149d8a0 100644 --- a/third_party/nix/src/libstore/derivations.hh +++ b/third_party/nix/src/libstore/derivations.hh @@ -2,6 +2,8 @@ #include +#include + #include "libproto/worker.pb.h" #include "libstore/store-api.hh" #include "libutil/hash.hh" @@ -35,16 +37,16 @@ struct DerivationOutput { void parseHashInfo(bool& recursive, Hash& hash) const; }; -// TODO(grfn): change to absl::flat_hash_map -typedef std::map DerivationOutputs; +// TODO(tazjin): Determine whether this actually needs to be ordered. +using DerivationOutputs = absl::btree_map; /* For inputs that are sub-derivations, we specify exactly which output IDs we are interested in. */ // TODO(grfn): change to absl::flat_hash_map -typedef std::map DerivationInputs; +using DerivationInputs = std::map; // TODO(grfn): change to absl::flat_hash_map -typedef std::map StringPairs; +using StringPairs = std::map; struct BasicDerivation { DerivationOutputs outputs; /* keyed on symbolic IDs */ @@ -54,7 +56,7 @@ struct BasicDerivation { Strings args; StringPairs env; - BasicDerivation(){}; + BasicDerivation() = default; // Convert the given proto derivation to a BasicDerivation in the given // nix::Store. -- cgit 1.4.1