feat(tvix/store): use tokio-listener for tvix-store daemon command

This allows binding on unix sockets, as well as systemd socket
activation.

Change-Id: Icf648c4fd0895468c52607deb6397b8b5928102b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11901
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: Connor Brewster <cbrewster@hey.com>
This commit is contained in:
Florian Klink 2024-06-30 22:29:11 +03:00 committed by clbot
parent f6c759de58
commit 830fdda8d4
4 changed files with 31 additions and 19 deletions

View file

@ -9,9 +9,6 @@ use serde::Deserialize;
use serde::Serialize;
use std::path::PathBuf;
use std::sync::Arc;
use tokio_listener::Listener;
use tokio_listener::SystemOptions;
use tokio_listener::UserOptions;
use tonic::transport::Server;
use tower::ServiceBuilder;
use tower_http::trace::{DefaultMakeSpan, TraceLayer};
@ -66,8 +63,9 @@ struct Cli {
enum Commands {
/// Runs the tvix-store daemon.
Daemon {
#[arg(long, short = 'l')]
listen_address: Option<String>,
/// The address to listen on.
#[clap(flatten)]
listen_args: tokio_listener::ListenerAddressLFlag,
#[arg(
long,
@ -198,7 +196,7 @@ fn default_threads() -> usize {
async fn run_cli(cli: Cli) -> Result<(), Box<dyn std::error::Error>> {
match cli.command {
Commands::Daemon {
listen_address,
listen_args,
blob_service_addr,
directory_service_addr,
path_info_service_addr,
@ -212,11 +210,6 @@ async fn run_cli(cli: Cli) -> Result<(), Box<dyn std::error::Error>> {
)
.await?;
let listen_address = listen_address
.unwrap_or_else(|| "[::]:8000".to_string())
.parse()
.unwrap();
let mut server = Server::builder().layer(
ServiceBuilder::new()
.layer(
@ -251,15 +244,21 @@ async fn run_cli(cli: Cli) -> Result<(), Box<dyn std::error::Error>> {
router = router.add_service(reflection_svc);
}
info!(listen_address=%listen_address, "starting daemon");
let listen_address = &listen_args.listen_address.unwrap_or_else(|| {
"[::]:8000"
.parse()
.expect("invalid fallback listen address")
});
let listener = Listener::bind(
&listen_address,
&SystemOptions::default(),
&UserOptions::default(),
let listener = tokio_listener::Listener::bind(
listen_address,
&Default::default(),
&listen_args.listener_options,
)
.await?;
info!(listen_address=%listen_address, "starting daemon");
router.serve_with_incoming(listener).await?;
}
Commands::Import {