diff options
author | Griffin Smith <grfn@gws.fyi> | 2020-08-05T03·06-0400 |
---|---|---|
committer | glittershark <grfn@gws.fyi> | 2020-08-05T22·28+0000 |
commit | ea488b570535b1cea5cfec74aa908af92202fcd1 (patch) | |
tree | 26a7efd68a6a485f8cf6dfa9938243154e79914c /third_party/nix/src/libstore/rpc-store.cc | |
parent | f9df9b47339f3583741ccec9760dd8f3934bdee4 (diff) |
feat(3p/nix): Implement FindRoots, CollectGarbage r/1600
Implement the RPC client and server handlers for the FindRoots and CollectGarbage RPC calls Change-Id: Ifa5d582c6a33bd1e7661ac2fc860505ef404dad0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1656 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
Diffstat (limited to 'third_party/nix/src/libstore/rpc-store.cc')
-rw-r--r-- | third_party/nix/src/libstore/rpc-store.cc | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/third_party/nix/src/libstore/rpc-store.cc b/third_party/nix/src/libstore/rpc-store.cc index 0b57127610ad..751eb449006d 100644 --- a/third_party/nix/src/libstore/rpc-store.cc +++ b/third_party/nix/src/libstore/rpc-store.cc @@ -418,11 +418,36 @@ void RpcStore::syncWithGC() { } Roots RpcStore::findRoots(bool censor) { - throw Unsupported(absl::StrCat("Not implemented ", __func__)); + ClientContext ctx; + proto::FindRootsResponse response; + SuccessOrThrow(stub_->FindRoots(&ctx, kEmpty, &response)); + Roots result; + + for (const auto& [target, links] : response.roots()) { + auto link_paths = FillFrom<std::unordered_set<std::string>>(links.paths()); + result.insert({target, link_paths}); + } + + return result; } void RpcStore::collectGarbage(const GCOptions& options, GCResults& results) { - throw Unsupported(absl::StrCat("Not implemented ", __func__)); + ClientContext ctx; + proto::CollectGarbageRequest request; + request.set_action(options.ActionToProto()); + for (const auto& path : options.pathsToDelete) { + request.add_paths_to_delete(path); + } + request.set_ignore_liveness(options.ignoreLiveness); + request.set_max_freed(options.maxFreed); + + proto::CollectGarbageResponse response; + SuccessOrThrow(stub_->CollectGarbage(&ctx, request, &response)); + + for (const auto& path : response.deleted_paths()) { + results.paths.insert(path); + } + results.bytesFreed = response.bytes_freed(); } void RpcStore::optimiseStore() { |