refactor(tvix): remove usage of async-recursion

Rust 1.77 supports async recursion as long as there is some form of
indirection (ie. `Box::pin`). This removes the need to use the
async-recursion crate.

Change-Id: Ic9613ab7f32016f0103032a861edff92e2fb8b41
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11596
Reviewed-by: flokli <flokli@flokli.de>
Autosubmit: Connor Brewster <cbrewster@hey.com>
Tested-by: BuildkiteCI
This commit is contained in:
Connor Brewster 2024-05-06 10:53:52 -05:00 committed by clbot
parent 01a4a2399c
commit da9bc274f3
8 changed files with 19 additions and 68 deletions

View file

@ -1,4 +1,3 @@
use async_recursion::async_recursion;
use nix_compat::nar::reader::r#async as nar_reader;
use tokio::{io::AsyncBufRead, sync::mpsc, try_join};
use tvix_castore::{
@ -54,10 +53,9 @@ where
Ok(node.rename("".into()))
}
#[async_recursion]
async fn produce_nar_inner<'a: 'async_recursion, 'r: 'async_recursion, BS>(
async fn produce_nar_inner<BS>(
blob_service: BS,
node: nar_reader::Node<'a, 'r>,
node: nar_reader::Node<'_, '_>,
path: PathBuf,
tx: mpsc::Sender<Result<IngestionEntry, Error>>,
) -> Result<IngestionEntry, Error>
@ -93,8 +91,13 @@ where
path.try_push(&entry.name)
.expect("Tvix bug: failed to join name");
let entry =
produce_nar_inner(blob_service.clone(), entry.node, path, tx.clone()).await?;
let entry = Box::pin(produce_nar_inner(
blob_service.clone(),
entry.node,
path,
tx.clone(),
))
.await?;
tx.send(Ok(entry)).await.map_err(|e| {
Error::IO(std::io::Error::new(std::io::ErrorKind::BrokenPipe, e))

View file

@ -1,7 +1,6 @@
use crate::utils::AsyncIoBridge;
use super::RenderError;
use async_recursion::async_recursion;
use count_write::CountWrite;
use nix_compat::nar::writer::r#async as nar_writer;
use sha2::{Digest, Sha256};
@ -72,9 +71,8 @@ where
/// Process an intermediate node in the structure.
/// This consumes the node.
#[async_recursion]
async fn walk_node<BS, DS>(
nar_node: nar_writer::Node<'async_recursion, '_>,
nar_node: nar_writer::Node<'_, '_>,
proto_node: &castorepb::node::Node,
blob_service: BS,
directory_service: DS,
@ -164,9 +162,13 @@ where
.await
.map_err(RenderError::NARWriterError)?;
(blob_service, directory_service) =
walk_node(child_node, &proto_node, blob_service, directory_service)
.await?;
(blob_service, directory_service) = Box::pin(walk_node(
child_node,
&proto_node,
blob_service,
directory_service,
))
.await?;
}
// close the directory