about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2022-12-28T15·40+0100
committerflokli <flokli@flokli.de>2022-12-30T15·21+0000
commit58f5ff2c173b6c64e3ffb1d2cd4d840e0dcf38c3 (patch)
treeaf3e28b373a54e50b3e72a803eae779a633a9f20
parentd22a9c8610f2cd1bf0e021ec1f46e6200ed4a28f (diff)
feat(tvix/store): initial dummy implementation r/5554
This replaces the hello world example from tvix-store with an actual
gRPC endpoint, implementing all of BlobService, DirectoryService and
PathInfoService.

All RPC methods currently respond with the unimplemented gRPC status.

Co-Authored-By: Márton Boros <martonboros@gmail.com>
Change-Id: Ieba333cca44dc1e3f2ffbe676ba7a99e672b9bfb
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7664
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
-rw-r--r--tvix/Cargo.lock20
-rw-r--r--tvix/Cargo.nix44
-rw-r--r--tvix/store/Cargo.toml3
-rw-r--r--tvix/store/src/dummy_blob_service.rs34
-rw-r--r--tvix/store/src/dummy_directory_service.rs28
-rw-r--r--tvix/store/src/dummy_path_info_service.rs26
-rw-r--r--tvix/store/src/main.rs42
7 files changed, 175 insertions, 22 deletions
diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock
index a79c6d6135..35aeb3aa4f 100644
--- a/tvix/Cargo.lock
+++ b/tvix/Cargo.lock
@@ -290,9 +290,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.0.27"
+version = "4.0.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0acbd8d28a0a60d7108d7ae850af6ba34cf2d1257fc646980e5f97ce14275966"
+checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39"
 dependencies = [
  "bitflags",
  "clap_derive",
@@ -884,9 +884,9 @@ dependencies = [
 
 [[package]]
 name = "is-terminal"
-version = "0.4.0"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aae5bc6e2eb41c9def29a3e0f1306382807764b9b53112030eff57435667352d"
+checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189"
 dependencies = [
  "hermit-abi 0.2.6",
  "io-lifetimes",
@@ -1045,7 +1045,7 @@ dependencies = [
 name = "nix-cli"
 version = "0.1.0"
 dependencies = [
- "clap 4.0.27",
+ "clap 4.0.32",
  "tempfile",
 ]
 
@@ -1553,9 +1553,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
 [[package]]
 name = "rustix"
-version = "0.36.3"
+version = "0.36.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b1fbb4dfc4eb1d390c02df47760bb19a84bb80b301ecc947ab5406394d8223e"
+checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549"
 dependencies = [
  "bitflags",
  "errno",
@@ -1889,6 +1889,7 @@ dependencies = [
  "libc",
  "memchr",
  "mio",
+ "num_cpus",
  "pin-project-lite",
  "socket2",
  "tokio-macros",
@@ -2090,7 +2091,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
 name = "tvix-cli"
 version = "0.1.0"
 dependencies = [
- "clap 4.0.27",
+ "clap 4.0.32",
  "dirs",
  "rustyline",
  "smol_str",
@@ -2145,11 +2146,14 @@ dependencies = [
  "anyhow",
  "blake3",
  "data-encoding",
+ "clap 4.0.32",
  "lazy_static",
  "prost",
  "prost-build",
  "test-case",
  "thiserror",
+ "tokio",
+ "tokio-stream",
  "tonic",
  "tonic-build",
 ]
diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix
index 89185708f8..2487f8abff 100644
--- a/tvix/Cargo.nix
+++ b/tvix/Cargo.nix
@@ -932,12 +932,12 @@ rec {
         };
         resolvedDefaultFeatures = [ "std" ];
       };
-      "clap 4.0.27" = rec {
+      "clap 4.0.32" = rec {
         crateName = "clap";
-        version = "4.0.27";
+        version = "4.0.32";
         edition = "2021";
         crateBin = [ ];
-        sha256 = "0rjr4wacx5sz1sc4dikz4p8z4k53dfpm1s3sil8dfq0aib9dijqa";
+        sha256 = "0fcsz3zggk0g0y76vv7v7ivn72p1v980h2yhi0zf9y9mr45p1nx7";
         dependencies = [
           {
             name = "bitflags";
@@ -2580,9 +2580,9 @@ rec {
       };
       "is-terminal" = rec {
         crateName = "is-terminal";
-        version = "0.4.0";
+        version = "0.4.2";
         edition = "2018";
-        sha256 = "0b9mcxb46mzz1q1i4cdmp5j7g042ccqg3q5357prs75l5rpbrrda";
+        sha256 = "12c11c8iv2wwyadzajzffmy1fy9nphdpvdj54d367k0c234bdpr8";
         authors = [
           "softprops <d.tangren@gmail.com>"
           "Dan Gohman <dev@sunfishcode.online>"
@@ -2600,14 +2600,14 @@ rec {
           {
             name = "rustix";
             packageId = "rustix";
-            target = { target, features }: (!((target."windows" or false) || ("hermit" == target."os")));
+            target = { target, features }: (!((target."windows" or false) || ("hermit" == target."os") || ("unknown" == target."os")));
             features = [ "termios" ];
           }
           {
             name = "windows-sys";
             packageId = "windows-sys";
             target = { target, features }: (target."windows" or false);
-            features = [ "Win32_Foundation" "Win32_System_Console" ];
+            features = [ "Win32_Foundation" "Win32_Storage_FileSystem" "Win32_System_Console" ];
           }
         ];
 
@@ -3003,7 +3003,7 @@ rec {
         dependencies = [
           {
             name = "clap";
-            packageId = "clap 4.0.27";
+            packageId = "clap 4.0.32";
           }
           {
             name = "tempfile";
@@ -4370,9 +4370,9 @@ rec {
       };
       "rustix" = rec {
         crateName = "rustix";
-        version = "0.36.3";
+        version = "0.36.6";
         edition = "2018";
-        sha256 = "0gi2v2a66h5mgaacq7ih1fw4pa0rpdh7gx1dq28d7cafzi6vn7qb";
+        sha256 = "0ja5vcjlfc10d97dgdz57c7spv1nrm4jdqgdqhlw7il2nrywzsjg";
         authors = [
           "Dan Gohman <dev@sunfishcode.online>"
           "Jakub Konka <kubkon@jakubkonka.com>"
@@ -4472,6 +4472,7 @@ rec {
           "libc_errno" = [ "dep:libc_errno" ];
           "once_cell" = [ "dep:once_cell" ];
           "os_pipe" = [ "io-lifetimes/os_pipe" ];
+          "param" = [ "fs" ];
           "procfs" = [ "once_cell" "itoa" "fs" ];
           "rustc-dep-of-std" = [ "core" "alloc" "compiler_builtins" "linux-raw-sys/rustc-dep-of-std" "bitflags/rustc-dep-of-std" ];
           "std" = [ "io-lifetimes" ];
@@ -5332,6 +5333,11 @@ rec {
             optional = true;
           }
           {
+            name = "num_cpus";
+            packageId = "num_cpus";
+            optional = true;
+          }
+          {
             name = "pin-project-lite";
             packageId = "pin-project-lite";
           }
@@ -5399,7 +5405,7 @@ rec {
           "tracing" = [ "dep:tracing" ];
           "windows-sys" = [ "dep:windows-sys" ];
         };
-        resolvedDefaultFeatures = [ "bytes" "default" "io-std" "io-util" "libc" "macros" "memchr" "mio" "net" "rt" "socket2" "sync" "time" "tokio-macros" "windows-sys" ];
+        resolvedDefaultFeatures = [ "bytes" "default" "io-std" "io-util" "libc" "macros" "memchr" "mio" "net" "num_cpus" "rt" "rt-multi-thread" "socket2" "sync" "time" "tokio-macros" "windows-sys" ];
       };
       "tokio-io-timeout" = rec {
         crateName = "tokio-io-timeout";
@@ -6176,7 +6182,7 @@ rec {
         dependencies = [
           {
             name = "clap";
-            packageId = "clap 4.0.27";
+            packageId = "clap 4.0.32";
             features = [ "derive" "env" ];
           }
           {
@@ -6390,6 +6396,11 @@ rec {
             features = [ "rayon" "std" ];
           }
           {
+            name = "clap";
+            packageId = "clap 4.0.32";
+            features = [ "derive" "env" ];
+          }
+          {
             name = "data-encoding";
             packageId = "data-encoding";
           }
@@ -6406,6 +6417,15 @@ rec {
             packageId = "thiserror";
           }
           {
+            name = "tokio";
+            packageId = "tokio";
+            features = [ "rt-multi-thread" ];
+          }
+          {
+            name = "tokio-stream";
+            packageId = "tokio-stream";
+          }
+          {
             name = "tonic";
             packageId = "tonic";
           }
diff --git a/tvix/store/Cargo.toml b/tvix/store/Cargo.toml
index ee8c1191ee..5cae4e0dfc 100644
--- a/tvix/store/Cargo.toml
+++ b/tvix/store/Cargo.toml
@@ -8,8 +8,11 @@ anyhow = "1.0.68"
 blake3 = { version = "1.3.1", features = ["rayon", "std"] }
 data-encoding = "2.3.3"
 lazy_static = "1.4.0"
+clap = { version = "4.0", features = ["derive", "env"] }
 prost = "0.11.2"
 thiserror = "1.0.38"
+tokio = { version = "1.23.0", features = ["rt-multi-thread"] }
+tokio-stream = "0.1.11"
 tonic = "0.8.2"
 
 [build-dependencies]
diff --git a/tvix/store/src/dummy_blob_service.rs b/tvix/store/src/dummy_blob_service.rs
new file mode 100644
index 0000000000..7731ea3344
--- /dev/null
+++ b/tvix/store/src/dummy_blob_service.rs
@@ -0,0 +1,34 @@
+use tokio_stream::wrappers::ReceiverStream;
+
+use crate::proto::blob_service_server::BlobService;
+use crate::proto::BlobChunk;
+use crate::proto::BlobMeta;
+use crate::proto::PutBlobResponse;
+use crate::proto::ReadBlobRequest;
+use crate::proto::StatBlobRequest;
+use tonic::{Request, Response, Result, Status, Streaming};
+
+pub struct DummyBlobService {}
+
+#[tonic::async_trait]
+impl BlobService for DummyBlobService {
+    type ReadStream = ReceiverStream<Result<BlobChunk>>;
+
+    async fn stat(&self, _request: Request<StatBlobRequest>) -> Result<Response<BlobMeta>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+
+    async fn read(
+        &self,
+        _request: Request<ReadBlobRequest>,
+    ) -> Result<Response<Self::ReadStream>, Status> {
+        Err(Status::unimplemented("not implemented"))
+    }
+
+    async fn put(
+        &self,
+        _request: Request<Streaming<BlobChunk>>,
+    ) -> Result<Response<PutBlobResponse>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+}
diff --git a/tvix/store/src/dummy_directory_service.rs b/tvix/store/src/dummy_directory_service.rs
new file mode 100644
index 0000000000..e9b54d85af
--- /dev/null
+++ b/tvix/store/src/dummy_directory_service.rs
@@ -0,0 +1,28 @@
+use tokio_stream::wrappers::ReceiverStream;
+
+use crate::proto::directory_service_server::DirectoryService;
+use crate::proto::Directory;
+use crate::proto::GetDirectoryRequest;
+use crate::proto::PutDirectoryResponse;
+use tonic::{Request, Response, Result, Status, Streaming};
+
+pub struct DummyDirectoryService {}
+
+#[tonic::async_trait]
+impl DirectoryService for DummyDirectoryService {
+    type GetStream = ReceiverStream<Result<Directory>>;
+
+    async fn get(
+        &self,
+        _request: Request<GetDirectoryRequest>,
+    ) -> Result<Response<Self::GetStream>, Status> {
+        Err(Status::unimplemented("not implemented"))
+    }
+
+    async fn put(
+        &self,
+        _request: Request<Streaming<Directory>>,
+    ) -> Result<Response<PutDirectoryResponse>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+}
diff --git a/tvix/store/src/dummy_path_info_service.rs b/tvix/store/src/dummy_path_info_service.rs
new file mode 100644
index 0000000000..3bc99ad334
--- /dev/null
+++ b/tvix/store/src/dummy_path_info_service.rs
@@ -0,0 +1,26 @@
+use crate::proto::path_info_service_server::PathInfoService;
+use crate::proto::CalculateNarResponse;
+use crate::proto::GetPathInfoRequest;
+use crate::proto::Node;
+use crate::proto::PathInfo;
+use tonic::{Request, Response, Result, Status};
+
+pub struct DummyPathInfoService {}
+
+#[tonic::async_trait]
+impl PathInfoService for DummyPathInfoService {
+    async fn get(&self, _request: Request<GetPathInfoRequest>) -> Result<Response<PathInfo>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+
+    async fn put(&self, _request: Request<PathInfo>) -> Result<Response<PathInfo>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+
+    async fn calculate_nar(
+        &self,
+        _request: Request<Node>,
+    ) -> Result<Response<CalculateNarResponse>> {
+        Err(Status::unimplemented("not implemented"))
+    }
+}
diff --git a/tvix/store/src/main.rs b/tvix/store/src/main.rs
index c7823b87e4..cc9002438b 100644
--- a/tvix/store/src/main.rs
+++ b/tvix/store/src/main.rs
@@ -1,3 +1,13 @@
+use crate::proto::blob_service_server::BlobServiceServer;
+use crate::proto::directory_service_server::DirectoryServiceServer;
+use crate::proto::path_info_service_server::PathInfoServiceServer;
+
+use clap::Parser;
+use tonic::{transport::Server, Result};
+
+mod dummy_blob_service;
+mod dummy_directory_service;
+mod dummy_path_info_service;
 mod nixbase32;
 mod nixpath;
 mod proto;
@@ -5,6 +15,34 @@ mod proto;
 #[cfg(test)]
 mod tests;
 
-fn main() {
-    println!("Hello, world!");
+#[derive(Parser)]
+#[command(author, version, about, long_about = None)]
+struct Cli {
+    #[clap(long, short = 'l')]
+    listen_address: Option<String>,
+}
+
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+    let cli = Cli::parse();
+    let listen_address = cli
+        .listen_address
+        .unwrap_or("[::]:8000".to_string())
+        .parse()
+        .unwrap();
+
+    let blob_service = dummy_blob_service::DummyBlobService {};
+    let directory_service = dummy_directory_service::DummyDirectoryService {};
+    let path_info_service = dummy_path_info_service::DummyPathInfoService {};
+
+    println!("tvix-store listening on {}", listen_address);
+
+    Server::builder()
+        .add_service(BlobServiceServer::new(blob_service))
+        .add_service(DirectoryServiceServer::new(directory_service))
+        .add_service(PathInfoServiceServer::new(path_info_service))
+        .serve(listen_address)
+        .await?;
+
+    Ok(())
 }