refactor(tvix/store): remove from_url from PathInfoService trait

We don't gain much from making this part of the trait, it's still up to
`tvix_store::pathinfoservice::from_addr` to do most of the construction.

Move it out of the trait and into the specific *Service impls directly.

This allows further refactorings in followup CLs.

Change-Id: I99b93ef4acd83637a2f4888a1e586f1ca96390dc
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10022
Tested-by: BuildkiteCI
Reviewed-by: Connor Brewster <cbrewster@hey.com>
This commit is contained in:
Florian Klink 2023-11-13 11:40:41 +02:00 committed by flokli
parent abe099b6ba
commit 8111caebc2
4 changed files with 13 additions and 31 deletions

View file

@ -24,17 +24,14 @@ impl GRPCPathInfoService {
) -> Self { ) -> Self {
Self { grpc_client } Self { grpc_client }
} }
}
#[async_trait]
impl PathInfoService for GRPCPathInfoService {
/// Constructs a [GRPCPathInfoService] from the passed [url::Url]: /// Constructs a [GRPCPathInfoService] from the passed [url::Url]:
/// - scheme has to match `grpc+*://`. /// - scheme has to match `grpc+*://`.
/// That's normally grpc+unix for unix sockets, and grpc+http(s) for the HTTP counterparts. /// That's normally grpc+unix for unix sockets, and grpc+http(s) for the HTTP counterparts.
/// - In the case of unix sockets, there must be a path, but may not be a host. /// - In the case of unix sockets, there must be a path, but may not be a host.
/// - In the case of non-unix sockets, there must be a host, but no path. /// - In the case of non-unix sockets, there must be a host, but no path.
/// The blob_service and directory_service arguments are ignored, because the gRPC service already provides answers to these questions. /// The blob_service and directory_service arguments are ignored, because the gRPC service already provides answers to these questions.
fn from_url( pub fn from_url(
url: &url::Url, url: &url::Url,
_blob_service: Arc<dyn BlobService>, _blob_service: Arc<dyn BlobService>,
_directory_service: Arc<dyn DirectoryService>, _directory_service: Arc<dyn DirectoryService>,
@ -44,7 +41,10 @@ impl PathInfoService for GRPCPathInfoService {
proto::path_info_service_client::PathInfoServiceClient::new(channel), proto::path_info_service_client::PathInfoServiceClient::new(channel),
)) ))
} }
}
#[async_trait]
impl PathInfoService for GRPCPathInfoService {
async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> { async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> {
let path_info = self let path_info = self
.grpc_client .grpc_client

View file

@ -29,15 +29,12 @@ impl MemoryPathInfoService {
directory_service, directory_service,
} }
} }
}
#[async_trait]
impl PathInfoService for MemoryPathInfoService {
/// Constructs a [MemoryPathInfoService] from the passed [url::Url]: /// Constructs a [MemoryPathInfoService] from the passed [url::Url]:
/// - scheme has to be `memory://` /// - scheme has to be `memory://`
/// - there may not be a host. /// - there may not be a host.
/// - there may not be a path. /// - there may not be a path.
fn from_url( pub fn from_url(
url: &url::Url, url: &url::Url,
blob_service: Arc<dyn BlobService>, blob_service: Arc<dyn BlobService>,
directory_service: Arc<dyn DirectoryService>, directory_service: Arc<dyn DirectoryService>,
@ -52,7 +49,10 @@ impl PathInfoService for MemoryPathInfoService {
Ok(Self::new(blob_service, directory_service)) Ok(Self::new(blob_service, directory_service))
} }
}
#[async_trait]
impl PathInfoService for MemoryPathInfoService {
async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> { async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> {
let db = self.db.read().unwrap(); let db = self.db.read().unwrap();
@ -113,7 +113,6 @@ mod tests {
use crate::tests::utils::gen_directory_service; use crate::tests::utils::gen_directory_service;
use super::MemoryPathInfoService; use super::MemoryPathInfoService;
use super::PathInfoService;
/// This uses a wrong scheme. /// This uses a wrong scheme.
#[test] #[test]

View file

@ -3,13 +3,9 @@ mod grpc;
mod memory; mod memory;
mod sled; mod sled;
use std::pin::Pin;
use std::sync::Arc;
use futures::Stream; use futures::Stream;
use std::pin::Pin;
use tonic::async_trait; use tonic::async_trait;
use tvix_castore::blobservice::BlobService;
use tvix_castore::directoryservice::DirectoryService;
use tvix_castore::proto as castorepb; use tvix_castore::proto as castorepb;
use tvix_castore::Error; use tvix_castore::Error;
@ -23,18 +19,6 @@ pub use self::sled::SledPathInfoService;
/// The base trait all PathInfo services need to implement. /// The base trait all PathInfo services need to implement.
#[async_trait] #[async_trait]
pub trait PathInfoService: Send + Sync { pub trait PathInfoService: Send + Sync {
/// Create a new instance by passing in a connection URL, as well
/// as instances of a [PathInfoService] and [DirectoryService] (as the
/// [PathInfoService] needs to talk to them).
/// TODO: check if we want to make this async, instead of lazily connecting
fn from_url(
url: &url::Url,
blob_service: Arc<dyn BlobService>,
directory_service: Arc<dyn DirectoryService>,
) -> Result<Self, Error>
where
Self: Sized;
/// Retrieve a PathInfo message by the output digest. /// Retrieve a PathInfo message by the output digest.
async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error>; async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error>;

View file

@ -49,15 +49,12 @@ impl SledPathInfoService {
directory_service, directory_service,
}) })
} }
}
#[async_trait]
impl PathInfoService for SledPathInfoService {
/// Constructs a [SledPathInfoService] from the passed [url::Url]: /// Constructs a [SledPathInfoService] from the passed [url::Url]:
/// - scheme has to be `sled://` /// - scheme has to be `sled://`
/// - there may not be a host. /// - there may not be a host.
/// - a path to the sled needs to be provided (which may not be `/`). /// - a path to the sled needs to be provided (which may not be `/`).
fn from_url( pub fn from_url(
url: &url::Url, url: &url::Url,
blob_service: Arc<dyn BlobService>, blob_service: Arc<dyn BlobService>,
directory_service: Arc<dyn DirectoryService>, directory_service: Arc<dyn DirectoryService>,
@ -86,7 +83,10 @@ impl PathInfoService for SledPathInfoService {
.map_err(|e| Error::StorageError(e.to_string())) .map_err(|e| Error::StorageError(e.to_string()))
} }
} }
}
#[async_trait]
impl PathInfoService for SledPathInfoService {
async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> { async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> {
match self.db.get(digest) { match self.db.get(digest) {
Ok(None) => Ok(None), Ok(None) => Ok(None),
@ -180,7 +180,6 @@ mod tests {
use crate::tests::utils::gen_blob_service; use crate::tests::utils::gen_blob_service;
use crate::tests::utils::gen_directory_service; use crate::tests::utils::gen_directory_service;
use super::PathInfoService;
use super::SledPathInfoService; use super::SledPathInfoService;
/// This uses a wrong scheme. /// This uses a wrong scheme.