tvl-depot/tvix/castore
Florian Klink 9498ac936e fix(tvix/castore/directory): fix graph traversal
Use a proper graph library to ensure all nodes are reachable from the
root.

We had a bit of that handrolled during add(), as well as later, which
had an annoying bug:

Redundant nodes were omitted during insert, but when returning the list
during finalize, we did not properly account they need to be introduced
before their parents are sent.

We now simply populate a petgraph DiGraph during insert (skipping
inserting nodes we already saw), and use petgraph's DfsPostOrder to
traverse the graph during finalize.

If the number of returned indices equals the total number of nodes in
the graph, all nodes are reachable from the root, we can consume the
graph and return the nodes as a vec, in the same order as the traversal
(and insertion).

Providing a regression test for the initial bug is challenging, as the
current code uses a bunch of HashSets. I manually tested ingesting a
full NixOS closure using this mechanism (via gRPC, which exposes this
problem, as it validates twice), and it now works.

Change-Id: Ic1d5e3e981f2993cc08c5c6b60ad895e578326dc
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11418
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Connor Brewster <cbrewster@hey.com>
Tested-by: BuildkiteCI
2024-04-15 14:47:12 +00:00
..
docs docs(tvix/castore/blobstore): reorganize docs 2024-02-06 18:28:00 +00:00
protos docs(tvix/castore/directorysvc): K/V is not necessarily flat 2024-02-20 09:17:38 +00:00
src fix(tvix/castore/directory): fix graph traversal 2024-04-15 14:47:12 +00:00
build.rs feat(tvix/castore): derive Eq and Hash automatically 2024-03-20 21:19:02 +00:00
Cargo.toml fix(tvix/castore/directory): fix graph traversal 2024-04-15 14:47:12 +00:00
default.nix feat(tvix/castore/directory): add bigtable backend 2024-04-09 15:50:34 +00:00