From 17849c5c0033fa1909f0403b5d5e6a5e018b7fee Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Tue, 19 Mar 2024 12:12:03 +0200 Subject: [PATCH] feat(tvix/castore/directory): add bigtable backend This adds a Directory service using https://cloud.google.com/bigtable/docs/ as a K/V store. Directory (closures) are put in individual keys. We don't do any bucketed upload of directory closures (yet), as castore/ fs does query individually, does not request recursively (and buffers). This will be addressed by store composition at some point. Change-Id: I7fada45bf386a78b7ec93be38c5f03879a2a6e22 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11212 Tested-by: BuildkiteCI Reviewed-by: Connor Brewster Autosubmit: flokli --- tvix/Cargo.lock | 565 +++++- tvix/Cargo.nix | 1788 ++++++++++++++++- tvix/castore/Cargo.toml | 11 + tvix/castore/default.nix | 4 + tvix/castore/src/directoryservice/bigtable.rs | 355 ++++ .../castore/src/directoryservice/from_addr.rs | 48 +- tvix/castore/src/directoryservice/mod.rs | 6 + .../castore/src/directoryservice/tests/mod.rs | 1 + .../src/directoryservice/tests/utils.rs | 1 + tvix/crate-hashes.json | 3 +- tvix/default.nix | 5 + tvix/shell.nix | 2 + 12 files changed, 2767 insertions(+), 22 deletions(-) create mode 100644 tvix/castore/src/directoryservice/bigtable.rs diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock index 3ead9befe..2c39c2bad 100644 --- a/tvix/Cargo.lock +++ b/tvix/Cargo.lock @@ -119,6 +119,19 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-channel" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +dependencies = [ + "concurrent-queue", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compression" version = "0.4.6" @@ -134,6 +147,63 @@ dependencies = [ "xz2", ] +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8" +dependencies = [ + "async-channel", + "async-io", + "async-lock 3.3.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 5.2.0", + "futures-lite", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "async-recursion" version = "1.0.5" @@ -145,6 +215,24 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -167,6 +255,12 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + [[package]] name = "async-tempfile" version = "0.4.0" @@ -188,6 +282,12 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -321,6 +421,29 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bigtable_rs" +version = "0.2.9" +source = "git+https://github.com/flokli/bigtable_rs?rev=0af404741dfc40eb9fa99cf4d4140a09c5c20df7#0af404741dfc40eb9fa99cf4d4140a09c5c20df7" +dependencies = [ + "gcp_auth", + "http 0.2.11", + "log", + "prost 0.12.3", + "prost-build", + "prost-types", + "prost-wkt", + "prost-wkt-build", + "prost-wkt-types", + "serde", + "serde_with", + "thiserror", + "tokio", + "tonic 0.11.0", + "tonic-build", + "tower", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -378,6 +501,22 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel", + "async-lock 3.3.0", + "async-task", + "fastrand", + "futures-io", + "futures-lite", + "piper", + "tracing", +] + [[package]] name = "bstr" version = "1.9.0" @@ -468,8 +607,10 @@ checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.0", ] @@ -573,6 +714,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -739,6 +889,41 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.76", + "quote 1.0.35", + "strsim", + "syn 2.0.48", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote 1.0.35", + "syn 2.0.48", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -755,6 +940,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "diff" version = "0.1.13" @@ -890,6 +1085,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" +dependencies = [ + "serde", +] + [[package]] name = "errno" version = "0.3.8" @@ -910,6 +1114,54 @@ dependencies = [ "str-buf", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", +] + [[package]] name = "fastcdc" version = "3.1.0" @@ -1066,6 +1318,19 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -1122,6 +1387,31 @@ dependencies = [ "byteorder", ] +[[package]] +name = "gcp_auth" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de2c71ea685b88a1aa50e9fb66fe0e1cb29d755f58cca41fb8c91ef604d4f4d4" +dependencies = [ + "async-trait", + "base64", + "chrono", + "home", + "hyper 0.14.28", + "hyper-rustls", + "ring", + "rustls 0.21.10", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", + "which 5.0.0", +] + [[package]] name = "genawaiter" version = "0.99.1" @@ -1238,6 +1528,12 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hex-literal" version = "0.4.1" @@ -1381,6 +1677,7 @@ dependencies = [ "http 0.2.11", "hyper 0.14.28", "rustls 0.21.10", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -1436,6 +1733,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -1478,6 +1781,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -1488,6 +1792,7 @@ checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", ] [[package]] @@ -1499,6 +1804,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "inventory" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" + [[package]] name = "ipnet" version = "2.9.0" @@ -1924,6 +2235,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.18" @@ -2104,6 +2421,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.11.2" @@ -2206,6 +2529,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -2256,6 +2590,26 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "polling" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2356,10 +2710,12 @@ dependencies = [ "prettyplease", "prost 0.12.3", "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", "regex", "syn 2.0.48", "tempfile", - "which", + "which 4.4.2", ] [[package]] @@ -2397,6 +2753,72 @@ dependencies = [ "prost 0.12.3", ] +[[package]] +name = "prost-wkt" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d8ef9c3f0f1dab910d2b7e2c24a8e4322e122eba6d7a1921eeebcebbc046c40" +dependencies = [ + "chrono", + "inventory", + "prost 0.12.3", + "serde", + "serde_derive", + "serde_json", + "typetag", +] + +[[package]] +name = "prost-wkt-build" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b31cae9a54ca84fee1504740a82eebf2479532905e106f63ca0c3bc8d780321" +dependencies = [ + "heck", + "prost 0.12.3", + "prost-build", + "prost-types", + "quote 1.0.35", +] + +[[package]] +name = "prost-wkt-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435be4a8704091b4c5fb1d79799de7f2dbff53af05edf29385237f8cf7ab37ee" +dependencies = [ + "chrono", + "prost 0.12.3", + "prost-build", + "prost-types", + "prost-wkt", + "prost-wkt-build", + "regex", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.4.2", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "10.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0194e6e1966c23cc5fd988714f85b18d548d773e81965413555d96569931833d" +dependencies = [ + "pulldown-cmark", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -2959,18 +3381,18 @@ checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2 1.0.76", "quote 1.0.35", @@ -2998,6 +3420,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" +dependencies = [ + "percent-encoding", + "serde", + "thiserror", +] + [[package]] name = "serde_spanned" version = "0.6.5" @@ -3019,6 +3452,36 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +dependencies = [ + "darling", + "proc-macro2 1.0.76", + "quote 1.0.35", + "syn 2.0.48", +] + [[package]] name = "sha1" version = "0.10.6" @@ -3386,6 +3849,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -3739,6 +4233,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -3831,8 +4335,10 @@ dependencies = [ name = "tvix-castore" version = "0.1.0" dependencies = [ + "async-process", "async-stream", "async-tempfile", + "bigtable_rs", "blake3", "bstr", "bytes", @@ -3851,6 +4357,9 @@ dependencies = [ "prost-build", "rstest", "rstest_reuse", + "serde", + "serde_qs", + "serde_with", "sled", "tempfile", "thiserror", @@ -4045,12 +4554,45 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typetag" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "661d18414ec032a49ece2d56eee03636e43c4e8d577047ab334c0ba892e29aaf" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac73887f47b9312552aa90ef477927ff014d63d1920ca8037c6c1951eab64bb1" +dependencies = [ + "proc-macro2 1.0.76", + "quote 1.0.35", + "syn 2.0.48", +] + [[package]] name = "unarray" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -4363,6 +4905,19 @@ dependencies = [ "rustix", ] +[[package]] +name = "which" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix index 34f0b6f99..a0cd0b999 100644 --- a/tvix/Cargo.nix +++ b/tvix/Cargo.nix @@ -412,6 +412,46 @@ rec { "zeroize" = [ "dep:zeroize" ]; }; }; + "async-channel" = rec { + crateName = "async-channel"; + version = "2.2.0"; + edition = "2021"; + sha256 = "1hzhkbrlmgbrrwb1d5aba5f03p42s6z80g5p38s127c27nj470pj"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "concurrent-queue"; + packageId = "concurrent-queue"; + usesDefaultFeatures = false; + } + { + name = "event-listener"; + packageId = "event-listener 5.2.0"; + usesDefaultFeatures = false; + } + { + name = "event-listener-strategy"; + packageId = "event-listener-strategy 0.5.0"; + usesDefaultFeatures = false; + } + { + name = "futures-core"; + packageId = "futures-core"; + usesDefaultFeatures = false; + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "concurrent-queue/std" "event-listener/std" "event-listener-strategy/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "async-compression" = rec { crateName = "async-compression"; version = "0.4.6"; @@ -480,6 +520,184 @@ rec { }; resolvedDefaultFeatures = [ "bzip2" "flate2" "gzip" "tokio" "xz" "xz2" ]; }; + "async-io" = rec { + crateName = "async-io"; + version = "2.3.2"; + edition = "2021"; + sha256 = "110847w0ycfhklm3i928avd28x7lf9amblr2wjngi8ngk7sv1k6w"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "async-lock"; + packageId = "async-lock 3.3.0"; + } + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "concurrent-queue"; + packageId = "concurrent-queue"; + } + { + name = "futures-io"; + packageId = "futures-io"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "futures-lite"; + packageId = "futures-lite"; + usesDefaultFeatures = false; + } + { + name = "parking"; + packageId = "parking"; + } + { + name = "polling"; + packageId = "polling"; + } + { + name = "rustix"; + packageId = "rustix"; + usesDefaultFeatures = false; + features = [ "fs" "net" "std" ]; + } + { + name = "slab"; + packageId = "slab"; + } + { + name = "tracing"; + packageId = "tracing"; + usesDefaultFeatures = false; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.52.0"; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Foundation" ]; + } + ]; + + }; + "async-lock 2.8.0" = rec { + crateName = "async-lock"; + version = "2.8.0"; + edition = "2018"; + sha256 = "0asq5xdzgp3d5m82y5rg7a0k9q0g95jy6mgc7ivl334x7qlp4wi8"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "event-listener"; + packageId = "event-listener 2.5.3"; + } + ]; + + }; + "async-lock 3.3.0" = rec { + crateName = "async-lock"; + version = "3.3.0"; + edition = "2021"; + sha256 = "0yxflkfw46rad4lv86f59b5z555dlfmg1riz1n8830rgi0qb8d6h"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "event-listener"; + packageId = "event-listener 4.0.3"; + usesDefaultFeatures = false; + } + { + name = "event-listener-strategy"; + packageId = "event-listener-strategy 0.4.0"; + usesDefaultFeatures = false; + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "event-listener/std" "event-listener-strategy/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "async-process" = rec { + crateName = "async-process"; + version = "2.1.0"; + edition = "2021"; + sha256 = "1j0cfac9p3kq5dclfzlz6jv5l29kwflh9nvr3ivmdg8ih3v3q7j5"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "async-channel"; + packageId = "async-channel"; + target = { target, features }: (target."windows" or false); + } + { + name = "async-io"; + packageId = "async-io"; + target = { target, features }: (target."unix" or false); + } + { + name = "async-lock"; + packageId = "async-lock 3.3.0"; + } + { + name = "async-signal"; + packageId = "async-signal"; + target = { target, features }: (target."unix" or false); + } + { + name = "blocking"; + packageId = "blocking"; + target = { target, features }: (target."windows" or false); + } + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "event-listener"; + packageId = "event-listener 5.2.0"; + } + { + name = "futures-lite"; + packageId = "futures-lite"; + } + { + name = "rustix"; + packageId = "rustix"; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + features = [ "std" "fs" ]; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.52.0"; + usesDefaultFeatures = false; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Foundation" "Win32_System_Threading" ]; + } + ]; + devDependencies = [ + { + name = "async-io"; + packageId = "async-io"; + } + ]; + + }; "async-recursion" = rec { crateName = "async-recursion"; version = "1.0.5"; @@ -508,6 +726,76 @@ rec { } ]; + }; + "async-signal" = rec { + crateName = "async-signal"; + version = "0.2.5"; + edition = "2018"; + sha256 = "1i9466hiqghhmljjnn83a8vnxi8z013xga03f59c89d2cl7xjiwy"; + authors = [ + "John Nunley " + ]; + dependencies = [ + { + name = "async-io"; + packageId = "async-io"; + target = { target, features }: (target."unix" or false); + } + { + name = "async-lock"; + packageId = "async-lock 2.8.0"; + target = { target, features }: (target."windows" or false); + } + { + name = "atomic-waker"; + packageId = "atomic-waker"; + target = { target, features }: (target."windows" or false); + } + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "futures-core"; + packageId = "futures-core"; + } + { + name = "futures-io"; + packageId = "futures-io"; + target = { target, features }: (target."unix" or false); + } + { + name = "rustix"; + packageId = "rustix"; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + features = [ "process" "std" ]; + } + { + name = "signal-hook-registry"; + packageId = "signal-hook-registry"; + target = { target, features }: (target."unix" or false); + } + { + name = "slab"; + packageId = "slab"; + target = { target, features }: (target."windows" or false); + } + { + name = "windows-sys"; + packageId = "windows-sys 0.48.0"; + usesDefaultFeatures = false; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Foundation" "Win32_System_Console" ]; + } + ]; + devDependencies = [ + { + name = "async-io"; + packageId = "async-io"; + } + ]; + }; "async-stream" = rec { crateName = "async-stream"; @@ -559,6 +847,20 @@ rec { ]; }; + "async-task" = rec { + crateName = "async-task"; + version = "4.7.0"; + edition = "2018"; + sha256 = "16975vx6aqy5yf16fs9xz5vx1zq8mwkzfmykvcilc1j7b6c6xczv"; + authors = [ + "Stjepan Glavina " + ]; + features = { + "default" = [ "std" ]; + "portable-atomic" = [ "dep:portable-atomic" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "async-tempfile" = rec { crateName = "async-tempfile"; version = "0.4.0"; @@ -619,6 +921,19 @@ rec { ]; }; + "atomic-waker" = rec { + crateName = "atomic-waker"; + version = "1.1.2"; + edition = "2018"; + sha256 = "1h5av1lw56m0jf0fd3bchxq8a30xv0b4wv8s4zkp4s0i7mfvs18m"; + authors = [ + "Stjepan Glavina " + "Contributors to futures-rs" + ]; + features = { + "portable-atomic" = [ "dep:portable-atomic" ]; + }; + }; "autocfg" = rec { crateName = "autocfg"; version = "1.1.0"; @@ -1162,6 +1477,94 @@ rec { }; resolvedDefaultFeatures = [ "alloc" ]; }; + "bigtable_rs" = rec { + crateName = "bigtable_rs"; + version = "0.2.9"; + edition = "2021"; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/flokli/bigtable_rs"; + rev = "0af404741dfc40eb9fa99cf4d4140a09c5c20df7"; + sha256 = "1njjam1lx2xlnm7a41lga8601vmjgqz0fvc77x24gd04pc7avxll"; + }; + authors = [ + "Fuyang Liu " + ]; + dependencies = [ + { + name = "gcp_auth"; + packageId = "gcp_auth"; + } + { + name = "http"; + packageId = "http 0.2.11"; + } + { + name = "log"; + packageId = "log"; + } + { + name = "prost"; + packageId = "prost 0.12.3"; + } + { + name = "prost-types"; + packageId = "prost-types"; + } + { + name = "prost-wkt"; + packageId = "prost-wkt"; + } + { + name = "prost-wkt-types"; + packageId = "prost-wkt-types"; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde_with"; + packageId = "serde_with"; + features = [ "base64" ]; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + { + name = "tokio"; + packageId = "tokio"; + features = [ "rt-multi-thread" ]; + } + { + name = "tonic"; + packageId = "tonic 0.11.0"; + features = [ "tls" "transport" ]; + } + { + name = "tower"; + packageId = "tower"; + } + ]; + buildDependencies = [ + { + name = "prost-build"; + packageId = "prost-build"; + } + { + name = "prost-wkt-build"; + packageId = "prost-wkt-build"; + } + { + name = "tonic-build"; + packageId = "tonic-build"; + features = [ "cleanup-markdown" ]; + } + ]; + + }; "bit-set" = rec { crateName = "bit-set"; version = "0.5.3"; @@ -1316,6 +1719,61 @@ rec { } ]; + }; + "blocking" = rec { + crateName = "blocking"; + version = "1.5.1"; + edition = "2018"; + sha256 = "064i3d6b8ln34fgdw49nmx9m36bwi3r3nv8c9xhcrpf4ilz92dva"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "async-channel"; + packageId = "async-channel"; + } + { + name = "async-lock"; + packageId = "async-lock 3.3.0"; + target = { target, features }: (!(builtins.elem "wasm" target."family")); + } + { + name = "async-task"; + packageId = "async-task"; + } + { + name = "fastrand"; + packageId = "fastrand"; + } + { + name = "futures-io"; + packageId = "futures-io"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "futures-lite"; + packageId = "futures-lite"; + usesDefaultFeatures = false; + } + { + name = "piper"; + packageId = "piper"; + } + { + name = "tracing"; + packageId = "tracing"; + usesDefaultFeatures = false; + } + ]; + devDependencies = [ + { + name = "futures-lite"; + packageId = "futures-lite"; + } + ]; + }; "bstr" = rec { crateName = "bstr"; @@ -1543,6 +2001,12 @@ rec { target = { target, features }: (target."unix" or false); features = [ "fallback" ]; } + { + name = "js-sys"; + packageId = "js-sys"; + optional = true; + target = { target, features }: (("wasm32" == target."arch" or null) && (!(("emscripten" == target."os" or null) || ("wasi" == target."os" or null)))); + } { name = "num-traits"; packageId = "num-traits"; @@ -1554,6 +2018,12 @@ rec { optional = true; usesDefaultFeatures = false; } + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + optional = true; + target = { target, features }: (("wasm32" == target."arch" or null) && (!(("emscripten" == target."os" or null) || ("wasi" == target."os" or null)))); + } { name = "windows-targets"; packageId = "windows-targets 0.52.0"; @@ -1584,7 +2054,7 @@ rec { "winapi" = [ "windows-targets" ]; "windows-targets" = [ "dep:windows-targets" ]; }; - resolvedDefaultFeatures = [ "alloc" "android-tzdata" "clock" "iana-time-zone" "now" "serde" "std" "winapi" "windows-targets" ]; + resolvedDefaultFeatures = [ "alloc" "android-tzdata" "clock" "default" "iana-time-zone" "js-sys" "now" "oldtime" "serde" "std" "wasm-bindgen" "wasmbind" "winapi" "windows-targets" ]; }; "ciborium" = rec { crateName = "ciborium"; @@ -1838,6 +2308,30 @@ rec { sha256 = "1ix7w85kwvyybwi2jdkl3yva2r2bvdcc3ka2grjfzfgrapqimgxc"; }; + "concurrent-queue" = rec { + crateName = "concurrent-queue"; + version = "2.4.0"; + edition = "2018"; + sha256 = "0qvk23ynj311adb4z7v89wk3bs65blps4n24q8rgl23vjk6lhq6i"; + authors = [ + "Stjepan Glavina " + "Taiki Endo " + "John Nunley " + ]; + dependencies = [ + { + name = "crossbeam-utils"; + packageId = "crossbeam-utils"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "std" ]; + "loom" = [ "dep:loom" ]; + "portable-atomic" = [ "dep:portable-atomic" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "const-oid" = rec { crateName = "const-oid"; version = "0.9.6"; @@ -2311,6 +2805,98 @@ rec { } ]; + }; + "darling" = rec { + crateName = "darling"; + version = "0.20.8"; + edition = "2018"; + sha256 = "14a38qsi9104kvk1z11rqj0bnz1866dyhnvgvbgzz17d2g6nzqsl"; + authors = [ + "Ted Driggs " + ]; + dependencies = [ + { + name = "darling_core"; + packageId = "darling_core"; + } + { + name = "darling_macro"; + packageId = "darling_macro"; + } + ]; + features = { + "default" = [ "suggestions" ]; + "diagnostics" = [ "darling_core/diagnostics" ]; + "suggestions" = [ "darling_core/suggestions" ]; + }; + resolvedDefaultFeatures = [ "default" "suggestions" ]; + }; + "darling_core" = rec { + crateName = "darling_core"; + version = "0.20.8"; + edition = "2018"; + sha256 = "03x7s149p06xfwcq0lgkk4yxh6jf7jckny18nzp1yyk87b1g2b4w"; + authors = [ + "Ted Driggs " + ]; + dependencies = [ + { + name = "fnv"; + packageId = "fnv"; + } + { + name = "ident_case"; + packageId = "ident_case"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2 1.0.76"; + } + { + name = "quote"; + packageId = "quote 1.0.35"; + } + { + name = "strsim"; + packageId = "strsim"; + optional = true; + } + { + name = "syn"; + packageId = "syn 2.0.48"; + features = [ "full" "extra-traits" ]; + } + ]; + features = { + "strsim" = [ "dep:strsim" ]; + "suggestions" = [ "strsim" ]; + }; + resolvedDefaultFeatures = [ "strsim" "suggestions" ]; + }; + "darling_macro" = rec { + crateName = "darling_macro"; + version = "0.20.8"; + edition = "2018"; + sha256 = "0gwkz0cjfy3fgcc1zmm7azzhj5qpja34s0cklcria4l38sjyss56"; + procMacro = true; + authors = [ + "Ted Driggs " + ]; + dependencies = [ + { + name = "darling_core"; + packageId = "darling_core"; + } + { + name = "quote"; + packageId = "quote 1.0.35"; + } + { + name = "syn"; + packageId = "syn 2.0.48"; + } + ]; + }; "data-encoding" = rec { crateName = "data-encoding"; @@ -2361,6 +2947,39 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "oid" "std" "zeroize" ]; }; + "deranged" = rec { + crateName = "deranged"; + version = "0.3.11"; + edition = "2021"; + sha256 = "1d1ibqqnr5qdrpw8rclwrf1myn3wf0dygl04idf4j2s49ah6yaxl"; + authors = [ + "Jacob Pratt " + ]; + dependencies = [ + { + name = "powerfmt"; + packageId = "powerfmt"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "std" ]; + "num" = [ "dep:num-traits" ]; + "powerfmt" = [ "dep:powerfmt" ]; + "quickcheck" = [ "dep:quickcheck" "alloc" ]; + "rand" = [ "dep:rand" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "powerfmt" "serde" "std" ]; + }; "diff" = rec { crateName = "diff"; version = "0.1.13"; @@ -2725,6 +3344,28 @@ rec { sha256 = "1malmx5f4lkfvqasz319lq6gb3ddg19yzf9s8cykfsgzdmyq0hsl"; }; + "erased-serde" = rec { + crateName = "erased-serde"; + version = "0.4.4"; + edition = "2021"; + sha256 = "1lx0si6iljzmfpblhn4b0ip3kw2yv4vjyca0riqz3ix311q80wrb"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + } + ]; + features = { + "alloc" = [ "serde/alloc" ]; + "default" = [ "std" ]; + "std" = [ "alloc" "serde/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" ]; + }; "errno" = rec { crateName = "errno"; version = "0.3.8"; @@ -2786,6 +3427,136 @@ rec { ]; features = { }; }; + "event-listener 2.5.3" = rec { + crateName = "event-listener"; + version = "2.5.3"; + edition = "2018"; + sha256 = "1q4w3pndc518crld6zsqvvpy9lkzwahp2zgza9kbzmmqh9gif1h2"; + authors = [ + "Stjepan Glavina " + ]; + + }; + "event-listener 4.0.3" = rec { + crateName = "event-listener"; + version = "4.0.3"; + edition = "2021"; + sha256 = "0vk4smw1vf871vi76af1zn7w69jg3zmpjddpby2qq91bkg21bck7"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "concurrent-queue"; + packageId = "concurrent-queue"; + usesDefaultFeatures = false; + } + { + name = "parking"; + packageId = "parking"; + optional = true; + target = { target, features }: (!(builtins.elem "wasm" target."family")); + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "parking" = [ "dep:parking" ]; + "portable-atomic" = [ "portable-atomic-util" "portable_atomic_crate" ]; + "portable-atomic-util" = [ "dep:portable-atomic-util" ]; + "portable_atomic_crate" = [ "dep:portable_atomic_crate" ]; + "std" = [ "concurrent-queue/std" "parking" ]; + }; + resolvedDefaultFeatures = [ "parking" "std" ]; + }; + "event-listener 5.2.0" = rec { + crateName = "event-listener"; + version = "5.2.0"; + edition = "2021"; + sha256 = "14fcnjgpfl22645nhc3hzkdq3a1v0srqacc3kfassg7sjj8vhprb"; + authors = [ + "Stjepan Glavina " + ]; + dependencies = [ + { + name = "concurrent-queue"; + packageId = "concurrent-queue"; + usesDefaultFeatures = false; + } + { + name = "parking"; + packageId = "parking"; + optional = true; + target = { target, features }: (!(builtins.elem "wasm" target."family")); + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "parking" = [ "dep:parking" ]; + "portable-atomic" = [ "portable-atomic-util" "portable_atomic_crate" ]; + "portable-atomic-util" = [ "dep:portable-atomic-util" ]; + "portable_atomic_crate" = [ "dep:portable_atomic_crate" ]; + "std" = [ "concurrent-queue/std" "parking" ]; + }; + resolvedDefaultFeatures = [ "default" "parking" "std" ]; + }; + "event-listener-strategy 0.4.0" = rec { + crateName = "event-listener-strategy"; + version = "0.4.0"; + edition = "2018"; + sha256 = "1lwprdjqp2ibbxhgm9khw7s7y7k4xiqj5i5yprqiks6mnrq4v3lm"; + authors = [ + "John Nunley " + ]; + dependencies = [ + { + name = "event-listener"; + packageId = "event-listener 4.0.3"; + usesDefaultFeatures = false; + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "event-listener/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "event-listener-strategy 0.5.0" = rec { + crateName = "event-listener-strategy"; + version = "0.5.0"; + edition = "2021"; + sha256 = "148jflvjrq0zrr3dx3srv88jksj1klm4amy3b9fifjdpm75azvgy"; + authors = [ + "John Nunley " + ]; + dependencies = [ + { + name = "event-listener"; + packageId = "event-listener 5.2.0"; + usesDefaultFeatures = false; + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "event-listener/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "fastcdc" = rec { crateName = "fastcdc"; version = "3.1.0"; @@ -3280,6 +4051,53 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; + "futures-lite" = rec { + crateName = "futures-lite"; + version = "2.3.0"; + edition = "2021"; + sha256 = "19gk4my8zhfym6gwnpdjiyv2hw8cc098skkbkhryjdaf0yspwljj"; + authors = [ + "Stjepan Glavina " + "Contributors to futures-rs" + ]; + dependencies = [ + { + name = "fastrand"; + packageId = "fastrand"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "futures-core"; + packageId = "futures-core"; + usesDefaultFeatures = false; + } + { + name = "futures-io"; + packageId = "futures-io"; + optional = true; + } + { + name = "parking"; + packageId = "parking"; + optional = true; + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + } + ]; + features = { + "default" = [ "race" "std" ]; + "fastrand" = [ "dep:fastrand" ]; + "futures-io" = [ "dep:futures-io" ]; + "memchr" = [ "dep:memchr" ]; + "parking" = [ "dep:parking" ]; + "race" = [ "fastrand" ]; + "std" = [ "alloc" "fastrand/std" "futures-io" "parking" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "fastrand" "futures-io" "parking" "race" "std" ]; + }; "futures-macro" = rec { crateName = "futures-macro"; version = "0.3.30"; @@ -3441,6 +4259,100 @@ rec { ]; }; + "gcp_auth" = rec { + crateName = "gcp_auth"; + version = "0.10.0"; + edition = "2021"; + sha256 = "1m7lsh2gc7n9p0gs9k2qbxsrvchw1vz6dyz9a2ma322vd3m72b6y"; + dependencies = [ + { + name = "async-trait"; + packageId = "async-trait"; + } + { + name = "base64"; + packageId = "base64"; + } + { + name = "chrono"; + packageId = "chrono"; + features = [ "serde" ]; + } + { + name = "home"; + packageId = "home"; + } + { + name = "hyper"; + packageId = "hyper 0.14.28"; + features = [ "client" "runtime" "http2" ]; + } + { + name = "hyper-rustls"; + packageId = "hyper-rustls"; + usesDefaultFeatures = false; + features = [ "tokio-runtime" "http1" "http2" ]; + } + { + name = "ring"; + packageId = "ring"; + } + { + name = "rustls"; + packageId = "rustls 0.21.10"; + } + { + name = "rustls-pemfile"; + packageId = "rustls-pemfile 1.0.4"; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" "rc" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + { + name = "tokio"; + packageId = "tokio"; + features = [ "fs" "sync" ]; + } + { + name = "tracing"; + packageId = "tracing"; + } + { + name = "tracing-futures"; + packageId = "tracing-futures"; + } + { + name = "url"; + packageId = "url"; + } + { + name = "which"; + packageId = "which 5.0.0"; + } + ]; + devDependencies = [ + { + name = "tokio"; + packageId = "tokio"; + features = [ "macros" "parking_lot" "rt-multi-thread" ]; + } + ]; + features = { + "default" = [ "hyper-rustls/rustls-native-certs" ]; + "webpki-roots" = [ "hyper-rustls/webpki-roots" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; "genawaiter" = rec { crateName = "genawaiter"; version = "0.99.1"; @@ -3802,6 +4714,21 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; + "hex" = rec { + crateName = "hex"; + version = "0.4.3"; + edition = "2018"; + sha256 = "0w1a4davm1lgzpamwnba907aysmlrnygbqmfis2mqjx5m552a93z"; + authors = [ + "KokaKiwi " + ]; + features = { + "default" = [ "std" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" ]; + }; "hex-literal" = rec { crateName = "hex-literal"; version = "0.4.1"; @@ -4231,6 +5158,11 @@ rec { packageId = "rustls 0.21.10"; usesDefaultFeatures = false; } + { + name = "rustls-native-certs"; + packageId = "rustls-native-certs 0.6.3"; + optional = true; + } { name = "tokio"; packageId = "tokio"; @@ -4273,6 +5205,7 @@ rec { "webpki-roots" = [ "dep:webpki-roots" ]; "webpki-tokio" = [ "tokio-runtime" "webpki-roots" ]; }; + resolvedDefaultFeatures = [ "http1" "http2" "rustls-native-certs" "tokio-runtime" ]; }; "hyper-timeout" = rec { crateName = "hyper-timeout"; @@ -4451,6 +5384,16 @@ rec { } ]; + }; + "ident_case" = rec { + crateName = "ident_case"; + version = "1.0.1"; + edition = "2015"; + sha256 = "0fac21q6pwns8gh1hz3nbq15j8fi441ncl6w4vlnd1cmc55kiq5r"; + authors = [ + "Ted Driggs " + ]; + }; "idna" = rec { crateName = "idna"; @@ -4579,6 +5522,12 @@ rec { usesDefaultFeatures = false; features = [ "raw" ]; } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + } ]; buildDependencies = [ { @@ -4594,6 +5543,7 @@ rec { "serde" = [ "dep:serde" ]; "serde-1" = [ "serde" ]; }; + resolvedDefaultFeatures = [ "serde" "serde-1" "std" ]; }; "indexmap 2.1.0" = rec { crateName = "indexmap"; @@ -4612,6 +5562,12 @@ rec { usesDefaultFeatures = false; features = [ "raw" ]; } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + } ]; features = { "arbitrary" = [ "dep:arbitrary" ]; @@ -4621,7 +5577,7 @@ rec { "rustc-rayon" = [ "dep:rustc-rayon" ]; "serde" = [ "dep:serde" ]; }; - resolvedDefaultFeatures = [ "default" "std" ]; + resolvedDefaultFeatures = [ "default" "serde" "std" ]; }; "instant" = rec { crateName = "instant"; @@ -4645,6 +5601,16 @@ rec { "web-sys" = [ "dep:web-sys" ]; }; }; + "inventory" = rec { + crateName = "inventory"; + version = "0.3.15"; + edition = "2021"; + sha256 = "0rspmi9qxz9hkajg4dx5hhwmcd3n3qw107hl3050hrs1izbd6n7r"; + authors = [ + "David Tolnay " + ]; + + }; "ipnet" = rec { crateName = "ipnet"; version = "2.9.0"; @@ -5124,7 +6090,7 @@ rec { "default" = [ "std" "general" "errno" ]; "rustc-dep-of-std" = [ "core" "compiler_builtins" "no_std" ]; }; - resolvedDefaultFeatures = [ "elf" "errno" "general" "ioctl" "no_std" "std" ]; + resolvedDefaultFeatures = [ "elf" "errno" "general" "if_ether" "ioctl" "net" "netlink" "no_std" "prctl" "std" "xdp" ]; }; "litrs" = rec { crateName = "litrs"; @@ -5924,6 +6890,16 @@ rec { "serde" = [ "dep:serde" ]; }; }; + "num-conv" = rec { + crateName = "num-conv"; + version = "0.1.0"; + edition = "2021"; + sha256 = "1ndiyg82q73783jq18isi71a7mjh56wxrk52rlvyx0mi5z9ibmai"; + authors = [ + "Jacob Pratt " + ]; + + }; "num-traits" = rec { crateName = "num-traits"; version = "0.2.18"; @@ -6583,6 +7559,19 @@ rec { ]; }; + "parking" = rec { + crateName = "parking"; + version = "2.2.0"; + edition = "2018"; + sha256 = "1blwbkq6im1hfxp5wlbr475mw98rsyc0bbr2d5n16m38z253p0dv"; + authors = [ + "Stjepan Glavina " + "The Rust Project Developers" + ]; + features = { + "loom" = [ "dep:loom" ]; + }; + }; "parking_lot 0.11.2" = rec { crateName = "parking_lot"; version = "0.11.2"; @@ -6835,6 +7824,41 @@ rec { ]; }; + "piper" = rec { + crateName = "piper"; + version = "0.2.1"; + edition = "2018"; + sha256 = "1m45fkdq7q5l9mv3b0ra10qwm0kb67rjp2q8y91958gbqjqk33b6"; + authors = [ + "Stjepan Glavina " + "John Nunley " + ]; + dependencies = [ + { + name = "atomic-waker"; + packageId = "atomic-waker"; + } + { + name = "fastrand"; + packageId = "fastrand"; + usesDefaultFeatures = false; + } + { + name = "futures-io"; + packageId = "futures-io"; + optional = true; + } + ]; + features = { + "default" = [ "std" ]; + "futures-io" = [ "dep:futures-io" ]; + "portable-atomic" = [ "atomic-waker/portable-atomic" "portable_atomic_crate" "portable-atomic-util" ]; + "portable-atomic-util" = [ "dep:portable-atomic-util" ]; + "portable_atomic_crate" = [ "dep:portable_atomic_crate" ]; + "std" = [ "fastrand/std" "futures-io" ]; + }; + resolvedDefaultFeatures = [ "default" "futures-io" "std" ]; + }; "pkcs8" = rec { crateName = "pkcs8"; version = "0.10.2"; @@ -6983,6 +8007,65 @@ rec { "image" = [ "dep:image" ]; }; }; + "polling" = rec { + crateName = "polling"; + version = "3.4.0"; + edition = "2021"; + sha256 = "052am20b5r03nwhpnjw86rv3dwsdabvb07anv3fqxfbs65r4w19h"; + authors = [ + "Stjepan Glavina " + "John Nunley " + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "concurrent-queue"; + packageId = "concurrent-queue"; + target = { target, features }: (target."windows" or false); + } + { + name = "pin-project-lite"; + packageId = "pin-project-lite"; + target = { target, features }: (target."windows" or false); + } + { + name = "rustix"; + packageId = "rustix"; + usesDefaultFeatures = false; + target = { target, features }: ((target."unix" or false) || ("fuchsia" == target."os" or null) || ("vxworks" == target."os" or null)); + features = [ "event" "fs" "pipe" "process" "std" "time" ]; + } + { + name = "tracing"; + packageId = "tracing"; + usesDefaultFeatures = false; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.52.0"; + target = { target, features }: (target."windows" or false); + features = [ "Wdk_Foundation" "Wdk_Storage_FileSystem" "Win32_Foundation" "Win32_Networking_WinSock" "Win32_Security" "Win32_Storage_FileSystem" "Win32_System_IO" "Win32_System_LibraryLoader" "Win32_System_Threading" "Win32_System_WindowsProgramming" ]; + } + ]; + + }; + "powerfmt" = rec { + crateName = "powerfmt"; + version = "0.2.0"; + edition = "2021"; + sha256 = "14ckj2xdpkhv3h6l5sdmb9f1d57z8hbfpdldjc2vl5givq2y77j3"; + authors = [ + "Jacob Pratt " + ]; + features = { + "default" = [ "std" "macros" ]; + "macros" = [ "dep:powerfmt-macros" ]; + "std" = [ "alloc" ]; + }; + }; "ppv-lite86" = rec { crateName = "ppv-lite86"; version = "0.2.17"; @@ -7300,6 +8383,17 @@ rec { packageId = "prost-types"; usesDefaultFeatures = false; } + { + name = "pulldown-cmark"; + packageId = "pulldown-cmark"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "pulldown-cmark-to-cmark"; + packageId = "pulldown-cmark-to-cmark"; + optional = true; + } { name = "regex"; packageId = "regex"; @@ -7318,7 +8412,7 @@ rec { } { name = "which"; - packageId = "which"; + packageId = "which 4.4.2"; } ]; features = { @@ -7330,7 +8424,7 @@ rec { "pulldown-cmark-to-cmark" = [ "dep:pulldown-cmark-to-cmark" ]; "syn" = [ "dep:syn" ]; }; - resolvedDefaultFeatures = [ "default" "format" "prettyplease" "syn" ]; + resolvedDefaultFeatures = [ "cleanup-markdown" "default" "format" "prettyplease" "pulldown-cmark" "pulldown-cmark-to-cmark" "syn" ]; }; "prost-derive 0.11.9" = rec { crateName = "prost-derive"; @@ -7432,6 +8526,197 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; + "prost-wkt" = rec { + crateName = "prost-wkt"; + version = "0.5.0"; + edition = "2021"; + sha256 = "0h3c0jyfpg7f3s9a3mx6xcif28j3ir5c5qmps88bknpiy31zk3jd"; + authors = [ + "fdeantoni " + ]; + dependencies = [ + { + name = "chrono"; + packageId = "chrono"; + usesDefaultFeatures = false; + features = [ "serde" ]; + } + { + name = "inventory"; + packageId = "inventory"; + } + { + name = "prost"; + packageId = "prost 0.12.3"; + } + { + name = "serde"; + packageId = "serde"; + } + { + name = "serde_derive"; + packageId = "serde_derive"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "typetag"; + packageId = "typetag"; + } + ]; + + }; + "prost-wkt-build" = rec { + crateName = "prost-wkt-build"; + version = "0.5.0"; + edition = "2021"; + sha256 = "0883g26vrhx07kv0dq85559pj95zxs10lx042pp4za2clplwlcav"; + authors = [ + "fdeantoni " + ]; + dependencies = [ + { + name = "heck"; + packageId = "heck"; + } + { + name = "prost"; + packageId = "prost 0.12.3"; + } + { + name = "prost-build"; + packageId = "prost-build"; + } + { + name = "prost-types"; + packageId = "prost-types"; + } + { + name = "quote"; + packageId = "quote 1.0.35"; + } + ]; + + }; + "prost-wkt-types" = rec { + crateName = "prost-wkt-types"; + version = "0.5.0"; + edition = "2021"; + sha256 = "1vipmgvqqzr3hn9z5v85mx9zznzjwyfpjy8xzg2v94a0f2lf8ns3"; + authors = [ + "fdeantoni " + ]; + dependencies = [ + { + name = "chrono"; + packageId = "chrono"; + usesDefaultFeatures = false; + features = [ "serde" ]; + } + { + name = "prost"; + packageId = "prost 0.12.3"; + } + { + name = "prost-wkt"; + packageId = "prost-wkt"; + } + { + name = "serde"; + packageId = "serde"; + } + { + name = "serde_derive"; + packageId = "serde_derive"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + ]; + buildDependencies = [ + { + name = "prost"; + packageId = "prost 0.12.3"; + } + { + name = "prost-build"; + packageId = "prost-build"; + } + { + name = "prost-types"; + packageId = "prost-types"; + } + { + name = "prost-wkt-build"; + packageId = "prost-wkt-build"; + } + { + name = "regex"; + packageId = "regex"; + } + ]; + features = { + "default" = [ "std" ]; + "protobuf-src" = [ "dep:protobuf-src" ]; + "protox" = [ "dep:protox" ]; + "vendored-protoc" = [ "protobuf-src" ]; + "vendored-protox" = [ "protox" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "pulldown-cmark" = rec { + crateName = "pulldown-cmark"; + version = "0.9.6"; + edition = "2021"; + crateBin = [ ]; + sha256 = "0av876a31qvqhy7gzdg134zn4s10smlyi744mz9vrllkf906n82p"; + authors = [ + "Raph Levien " + "Marcus Klaas de Vries " + ]; + dependencies = [ + { + name = "bitflags"; + packageId = "bitflags 2.4.2"; + } + { + name = "memchr"; + packageId = "memchr"; + } + { + name = "unicase"; + packageId = "unicase"; + } + ]; + features = { + "default" = [ "getopts" ]; + "getopts" = [ "dep:getopts" ]; + "serde" = [ "dep:serde" ]; + }; + }; + "pulldown-cmark-to-cmark" = rec { + crateName = "pulldown-cmark-to-cmark"; + version = "10.0.4"; + edition = "2018"; + sha256 = "0gc366cmd5jxal9m95l17rvqsm4dn62lywc8v5gwq8vcjvhyd501"; + authors = [ + "Sebastian Thiel " + "Dylan Owen " + "Alessandro Ogier " + "Zixian Cai <2891235+caizixian@users.noreply.github.com>" + ]; + dependencies = [ + { + name = "pulldown-cmark"; + packageId = "pulldown-cmark"; + usesDefaultFeatures = false; + } + ]; + + }; "quick-error" = rec { crateName = "quick-error"; version = "1.2.3"; @@ -8651,7 +9936,7 @@ rec { "thread" = [ "linux-raw-sys/prctl" ]; "use-libc" = [ "libc_errno" "libc" ]; }; - resolvedDefaultFeatures = [ "alloc" "default" "fs" "std" "termios" "use-libc-auxv" ]; + resolvedDefaultFeatures = [ "alloc" "default" "event" "fs" "net" "pipe" "process" "std" "termios" "time" "use-libc-auxv" ]; }; "rustls 0.21.10" = rec { crateName = "rustls"; @@ -9235,9 +10520,9 @@ rec { }; "serde" = rec { crateName = "serde"; - version = "1.0.195"; + version = "1.0.197"; edition = "2018"; - sha256 = "00kbc86kgaihpza0zdglcd2qq5468yg0dvvdmkli2y660bs1s9k3"; + sha256 = "1qjcxqd3p4yh5cmmax9q4ics1zy34j5ij32cvjj5dc5rw5rwic9z"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -9269,9 +10554,9 @@ rec { }; "serde_derive" = rec { crateName = "serde_derive"; - version = "1.0.195"; + version = "1.0.197"; edition = "2015"; - sha256 = "0b7ag1qm9q3fgwlmyk2ap5gjbqa9vyf2wfmj4xish6yq0f38zzj6"; + sha256 = "02v1x0sdv8qy06lpr6by4ar1n3jz3hmab15cgimpzhgd895v7c3y"; procMacro = true; authors = [ "Erick Tryzelaar " @@ -9281,14 +10566,20 @@ rec { { name = "proc-macro2"; packageId = "proc-macro2 1.0.76"; + usesDefaultFeatures = false; + features = [ "proc-macro" ]; } { name = "quote"; packageId = "quote 1.0.35"; + usesDefaultFeatures = false; + features = [ "proc-macro" ]; } { name = "syn"; packageId = "syn 2.0.48"; + usesDefaultFeatures = false; + features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } ]; features = { }; @@ -9332,7 +10623,7 @@ rec { "preserve_order" = [ "indexmap" "std" ]; "std" = [ "serde/std" ]; }; - resolvedDefaultFeatures = [ "default" "raw_value" "std" ]; + resolvedDefaultFeatures = [ "alloc" "default" "raw_value" "std" ]; }; "serde_path_to_error" = rec { crateName = "serde_path_to_error"; @@ -9354,6 +10645,44 @@ rec { ]; }; + "serde_qs" = rec { + crateName = "serde_qs"; + version = "0.12.0"; + edition = "2018"; + sha256 = "031kgpxbqkkxnql0k7sd80lyp98x7jc92311chrkc7k5d1as6c84"; + authors = [ + "Sam Scott " + ]; + dependencies = [ + { + name = "percent-encoding"; + packageId = "percent-encoding"; + } + { + name = "serde"; + packageId = "serde"; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + ]; + features = { + "actix-web2" = [ "dep:actix-web2" ]; + "actix-web3" = [ "dep:actix-web3" ]; + "actix-web4" = [ "dep:actix-web4" ]; + "actix2" = [ "actix-web2" "futures" ]; + "actix3" = [ "actix-web3" "futures" ]; + "actix4" = [ "actix-web4" "futures" ]; + "axum" = [ "axum-framework" "futures" ]; + "axum-framework" = [ "dep:axum-framework" ]; + "futures" = [ "dep:futures" ]; + "tracing" = [ "dep:tracing" ]; + "warp" = [ "futures" "tracing" "warp-framework" ]; + "warp-framework" = [ "dep:warp-framework" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; "serde_spanned" = rec { crateName = "serde_spanned"; version = "0.6.5"; @@ -9405,6 +10734,143 @@ rec { ]; }; + "serde_with" = rec { + crateName = "serde_with"; + version = "3.7.0"; + edition = "2021"; + sha256 = "16jn72cij27fxjafcsma1z5p587xkk8wqhp2yv98zy5vc7iv107f"; + authors = [ + "Jonas Bushart" + "Marcin Kaźmierczak" + ]; + dependencies = [ + { + name = "base64"; + packageId = "base64"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "chrono"; + packageId = "chrono"; + rename = "chrono_0_4"; + optional = true; + usesDefaultFeatures = false; + features = [ "serde" ]; + } + { + name = "hex"; + packageId = "hex"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "indexmap"; + packageId = "indexmap 1.9.3"; + rename = "indexmap_1"; + optional = true; + usesDefaultFeatures = false; + features = [ "serde-1" ]; + } + { + name = "indexmap"; + packageId = "indexmap 2.1.0"; + rename = "indexmap_2"; + optional = true; + usesDefaultFeatures = false; + features = [ "serde" ]; + } + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + } + { + name = "serde_derive"; + packageId = "serde_derive"; + } + { + name = "serde_json"; + packageId = "serde_json"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "serde_with_macros"; + packageId = "serde_with_macros"; + optional = true; + } + { + name = "time"; + packageId = "time"; + rename = "time_0_3"; + optional = true; + usesDefaultFeatures = false; + } + ]; + devDependencies = [ + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + features = [ "preserve_order" ]; + } + ]; + features = { + "alloc" = [ "serde/alloc" "base64?/alloc" "chrono_0_4?/alloc" "hex?/alloc" "serde_json?/alloc" "time_0_3?/alloc" ]; + "base64" = [ "dep:base64" "alloc" ]; + "chrono" = [ "chrono_0_4" ]; + "chrono_0_4" = [ "dep:chrono_0_4" ]; + "default" = [ "std" "macros" ]; + "guide" = [ "dep:doc-comment" "dep:document-features" "macros" "std" ]; + "hashbrown_0_14" = [ "dep:hashbrown_0_14" "alloc" ]; + "hex" = [ "dep:hex" "alloc" ]; + "indexmap" = [ "indexmap_1" ]; + "indexmap_1" = [ "dep:indexmap_1" "alloc" ]; + "indexmap_2" = [ "dep:indexmap_2" "alloc" ]; + "json" = [ "dep:serde_json" "alloc" ]; + "macros" = [ "dep:serde_with_macros" ]; + "schemars_0_8" = [ "dep:schemars_0_8" "std" "serde_with_macros?/schemars_0_8" ]; + "std" = [ "alloc" "serde/std" "chrono_0_4?/clock" "chrono_0_4?/std" "indexmap_1?/std" "indexmap_2?/std" "time_0_3?/serde-well-known" "time_0_3?/std" ]; + "time_0_3" = [ "dep:time_0_3" ]; + }; + resolvedDefaultFeatures = [ "alloc" "base64" "default" "macros" "std" ]; + }; + "serde_with_macros" = rec { + crateName = "serde_with_macros"; + version = "3.7.0"; + edition = "2021"; + sha256 = "0mbnika5bw1mvgnl50rs7wfzj7dwxzgwqxnq6656694j38bdqqb5"; + procMacro = true; + authors = [ + "Jonas Bushart" + ]; + dependencies = [ + { + name = "darling"; + packageId = "darling"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2 1.0.76"; + } + { + name = "quote"; + packageId = "quote 1.0.35"; + } + { + name = "syn"; + packageId = "syn 2.0.48"; + features = [ "extra-traits" "full" "parsing" ]; + } + ]; + features = { }; + }; "sha1" = rec { crateName = "sha1"; version = "0.10.6"; @@ -10394,6 +11860,120 @@ rec { ]; features = { }; }; + "time" = rec { + crateName = "time"; + version = "0.3.34"; + edition = "2021"; + sha256 = "0jc7wgprzqjhzd0nqkbmdlnjwyddnswmjw86ni2vq55v45jqn968"; + authors = [ + "Jacob Pratt " + "Time contributors" + ]; + dependencies = [ + { + name = "deranged"; + packageId = "deranged"; + usesDefaultFeatures = false; + features = [ "powerfmt" ]; + } + { + name = "itoa"; + packageId = "itoa"; + optional = true; + } + { + name = "num-conv"; + packageId = "num-conv"; + } + { + name = "powerfmt"; + packageId = "powerfmt"; + usesDefaultFeatures = false; + } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "time-core"; + packageId = "time-core"; + } + { + name = "time-macros"; + packageId = "time-macros"; + optional = true; + } + ]; + devDependencies = [ + { + name = "num-conv"; + packageId = "num-conv"; + } + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + { + name = "time-macros"; + packageId = "time-macros"; + } + ]; + features = { + "alloc" = [ "serde?/alloc" ]; + "default" = [ "std" ]; + "formatting" = [ "dep:itoa" "std" "time-macros?/formatting" ]; + "large-dates" = [ "time-macros?/large-dates" ]; + "local-offset" = [ "std" "dep:libc" "dep:num_threads" ]; + "macros" = [ "dep:time-macros" ]; + "parsing" = [ "time-macros?/parsing" ]; + "quickcheck" = [ "dep:quickcheck" "alloc" "deranged/quickcheck" ]; + "rand" = [ "dep:rand" "deranged/rand" ]; + "serde" = [ "dep:serde" "time-macros?/serde" "deranged/serde" ]; + "serde-human-readable" = [ "serde" "formatting" "parsing" ]; + "serde-well-known" = [ "serde" "formatting" "parsing" ]; + "std" = [ "alloc" "deranged/std" ]; + "wasm-bindgen" = [ "dep:js-sys" ]; + }; + resolvedDefaultFeatures = [ "alloc" "formatting" "parsing" "serde" "serde-well-known" "std" ]; + }; + "time-core" = rec { + crateName = "time-core"; + version = "0.1.2"; + edition = "2021"; + sha256 = "1wx3qizcihw6z151hywfzzyd1y5dl804ydyxci6qm07vbakpr4pg"; + authors = [ + "Jacob Pratt " + "Time contributors" + ]; + + }; + "time-macros" = rec { + crateName = "time-macros"; + version = "0.2.17"; + edition = "2021"; + sha256 = "0x3pahhk2751c6kqqq9dk6lz0gydbnxr44q01wpjlrz687ps78vv"; + procMacro = true; + authors = [ + "Jacob Pratt " + "Time contributors" + ]; + dependencies = [ + { + name = "num-conv"; + packageId = "num-conv"; + } + { + name = "time-core"; + packageId = "time-core"; + } + ]; + features = { }; + resolvedDefaultFeatures = [ "formatting" "parsing" "serde" ]; + }; "tinytemplate" = rec { crateName = "tinytemplate"; version = "1.2.1"; @@ -11432,7 +13012,7 @@ rec { "prost" = [ "prost-build" ]; "prost-build" = [ "dep:prost-build" ]; }; - resolvedDefaultFeatures = [ "default" "prost" "prost-build" "transport" ]; + resolvedDefaultFeatures = [ "cleanup-markdown" "default" "prost" "prost-build" "transport" ]; }; "tonic-reflection" = rec { crateName = "tonic-reflection"; @@ -11734,6 +13314,42 @@ rec { }; resolvedDefaultFeatures = [ "default" "once_cell" "std" "valuable" ]; }; + "tracing-futures" = rec { + crateName = "tracing-futures"; + version = "0.2.5"; + edition = "2018"; + sha256 = "1wimg0iwa2ldq7xv98lvivvf3q9ykfminig8r1bs0ig22np9bl4p"; + authors = [ + "Eliza Weisman " + "Tokio Contributors " + ]; + dependencies = [ + { + name = "pin-project"; + packageId = "pin-project"; + optional = true; + } + { + name = "tracing"; + packageId = "tracing"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "std-future" "std" ]; + "futures" = [ "dep:futures" ]; + "futures-01" = [ "futures_01" "std" ]; + "futures-03" = [ "std-future" "futures" "futures-task" "std" ]; + "futures-task" = [ "dep:futures-task" ]; + "futures_01" = [ "dep:futures_01" ]; + "pin-project" = [ "dep:pin-project" ]; + "std" = [ "tracing/std" ]; + "std-future" = [ "pin-project" ]; + "tokio" = [ "dep:tokio" ]; + "tokio-executor" = [ "dep:tokio-executor" ]; + }; + resolvedDefaultFeatures = [ "default" "pin-project" "std" "std-future" ]; + }; "tracing-log" = rec { crateName = "tracing-log"; version = "0.2.0"; @@ -12142,6 +13758,11 @@ rec { name = "async-tempfile"; packageId = "async-tempfile"; } + { + name = "bigtable_rs"; + packageId = "bigtable_rs"; + optional = true; + } { name = "blake3"; packageId = "blake3"; @@ -12203,6 +13824,19 @@ rec { name = "prost"; packageId = "prost 0.12.3"; } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde_qs"; + packageId = "serde_qs"; + } + { + name = "serde_with"; + packageId = "serde_with"; + } { name = "sled"; packageId = "sled"; @@ -12297,6 +13931,10 @@ rec { } ]; devDependencies = [ + { + name = "async-process"; + packageId = "async-process"; + } { name = "hex-literal"; packageId = "hex-literal"; @@ -12319,7 +13957,7 @@ rec { } ]; features = { - "cloud" = [ "object_store/aws" "object_store/azure" "object_store/gcp" ]; + "cloud" = [ "dep:bigtable_rs" "object_store/aws" "object_store/azure" "object_store/gcp" ]; "fs" = [ "dep:libc" "dep:fuse-backend-rs" ]; "fuse" = [ "fs" ]; "tonic-reflection" = [ "dep:tonic-reflection" ]; @@ -13036,6 +14674,70 @@ rec { "scale_info" = [ "scale-info/derive" ]; }; }; + "typetag" = rec { + crateName = "typetag"; + version = "0.2.16"; + edition = "2021"; + sha256 = "1bwswa9ah2sc6fmlfw2pim73rr1n6vhfwmidrsga8cn09r0ih7b6"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "erased-serde"; + packageId = "erased-serde"; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + { + name = "inventory"; + packageId = "inventory"; + } + { + name = "once_cell"; + packageId = "once_cell"; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + features = [ "alloc" "derive" ]; + } + { + name = "typetag-impl"; + packageId = "typetag-impl"; + } + ]; + + }; + "typetag-impl" = rec { + crateName = "typetag-impl"; + version = "0.2.16"; + edition = "2021"; + sha256 = "1cabnvm526bcgh1sh34js5ils0gz4xwlgvwhm992acdr8xzqhwxc"; + procMacro = true; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2 1.0.76"; + } + { + name = "quote"; + packageId = "quote 1.0.35"; + } + { + name = "syn"; + packageId = "syn 2.0.48"; + features = [ "full" ]; + } + ]; + + }; "unarray" = rec { crateName = "unarray"; version = "0.1.4"; @@ -13043,6 +14745,22 @@ rec { sha256 = "154smf048k84prsdgh09nkm2n0w0336v84jd4zikyn6v6jrqbspa"; }; + "unicase" = rec { + crateName = "unicase"; + version = "2.7.0"; + edition = "2015"; + sha256 = "12gd74j79f94k4clxpf06l99wiv4p30wjr0qm04ihqk9zgdd9lpp"; + authors = [ + "Sean McArthur " + ]; + buildDependencies = [ + { + name = "version_check"; + packageId = "version_check"; + } + ]; + features = { }; + }; "unicode-bidi" = rec { crateName = "unicode-bidi"; version = "0.3.15"; @@ -14258,7 +15976,7 @@ rec { ]; }; - "which" = rec { + "which 4.4.2" = rec { crateName = "which"; version = "4.4.2"; edition = "2021"; @@ -14292,6 +16010,46 @@ rec { "regex" = [ "dep:regex" ]; }; }; + "which 5.0.0" = rec { + crateName = "which"; + version = "5.0.0"; + edition = "2021"; + sha256 = "053fpbczryyn8lcbpkvwl8v2rzld0pr30r5lh1cxv87kjs2ymwwv"; + authors = [ + "Harry Fei " + ]; + dependencies = [ + { + name = "either"; + packageId = "either"; + } + { + name = "home"; + packageId = "home"; + target = { target, features }: ((target."windows" or false) || (target."unix" or false) || ("redox" == target."os" or null)); + } + { + name = "once_cell"; + packageId = "once_cell"; + target = { target, features }: (target."windows" or false); + } + { + name = "rustix"; + packageId = "rustix"; + usesDefaultFeatures = false; + features = [ "fs" "std" ]; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.48.0"; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Storage_FileSystem" "Win32_Foundation" ]; + } + ]; + features = { + "regex" = [ "dep:regex" ]; + }; + }; "winapi" = rec { crateName = "winapi"; version = "0.3.9"; @@ -14910,7 +16668,7 @@ rec { "Win32_Web" = [ "Win32" ]; "Win32_Web_InternetExplorer" = [ "Win32_Web" ]; }; - resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_NetworkManagement" "Win32_NetworkManagement_IpHelper" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Security_Authentication" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_Security_Cryptography" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Com" "Win32_System_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_Memory" "Win32_System_Threading" "Win32_UI" "Win32_UI_Shell" "default" ]; + resolvedDefaultFeatures = [ "Wdk" "Wdk_Foundation" "Wdk_Storage" "Wdk_Storage_FileSystem" "Win32" "Win32_Foundation" "Win32_NetworkManagement" "Win32_NetworkManagement_IpHelper" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Security_Authentication" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_Security_Cryptography" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Com" "Win32_System_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_IO" "Win32_System_LibraryLoader" "Win32_System_Memory" "Win32_System_Threading" "Win32_System_WindowsProgramming" "Win32_UI" "Win32_UI_Shell" "default" ]; }; "windows-targets 0.48.5" = rec { crateName = "windows-targets"; diff --git a/tvix/castore/Cargo.toml b/tvix/castore/Cargo.toml index 652b72a9f..02a79882b 100644 --- a/tvix/castore/Cargo.toml +++ b/tvix/castore/Cargo.toml @@ -29,6 +29,15 @@ tracing = "0.1.37" url = "2.4.0" walkdir = "2.4.0" zstd = "0.13.0" +serde = { version = "1.0.197", features = [ "derive" ] } +serde_with = "3.7.0" +serde_qs = "0.12.0" + +[dependencies.bigtable_rs] +optional = true +# https://github.com/liufuyang/bigtable_rs/pull/72 +git = "https://github.com/flokli/bigtable_rs" +rev = "0af404741dfc40eb9fa99cf4d4140a09c5c20df7" [dependencies.fuse-backend-rs] optional = true @@ -71,6 +80,7 @@ prost-build = "0.12.1" tonic-build = "0.11.0" [dev-dependencies] +async-process = "2.1.0" rstest = "0.18.2" tempfile = "3.3.0" tokio-retry = "0.3.0" @@ -80,6 +90,7 @@ rstest_reuse = "0.6.0" [features] default = [] cloud = [ + "dep:bigtable_rs", "object_store/aws", "object_store/azure", "object_store/gcp", diff --git a/tvix/castore/default.nix b/tvix/castore/default.nix index efa4da59c..edc20ac79 100644 --- a/tvix/castore/default.nix +++ b/tvix/castore/default.nix @@ -4,5 +4,9 @@ depot.tvix.crates.workspaceMembers.tvix-castore.build.override { runTests = true; testPreRun = '' export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt; + export PATH="$PATH:${pkgs.lib.makeBinPath [pkgs.cbtemulator pkgs.google-cloud-bigtable-tool]}" ''; + + # enable some optional features. + features = [ "default" "cloud" ]; } diff --git a/tvix/castore/src/directoryservice/bigtable.rs b/tvix/castore/src/directoryservice/bigtable.rs new file mode 100644 index 000000000..372135628 --- /dev/null +++ b/tvix/castore/src/directoryservice/bigtable.rs @@ -0,0 +1,355 @@ +use bigtable_rs::{bigtable, google::bigtable::v2 as bigtable_v2}; +use bytes::Bytes; +use data_encoding::HEXLOWER; +use futures::stream::BoxStream; +use prost::Message; +use serde::{Deserialize, Serialize}; +use serde_with::{serde_as, DurationSeconds}; +use tonic::async_trait; +use tracing::{instrument, trace, warn}; + +use super::{utils::traverse_directory, DirectoryPutter, DirectoryService, SimplePutter}; +use crate::{proto, B3Digest, Error}; + +/// There should not be more than 10 MiB in a single cell. +/// https://cloud.google.com/bigtable/docs/schema-design#cells +const CELL_SIZE_LIMIT: u64 = 10 * 1024 * 1024; + +/// Provides a [DirectoryService] implementation using +/// [Bigtable](https://cloud.google.com/bigtable/docs/) +/// as an underlying K/V store. +/// +/// # Data format +/// We use Bigtable as a plain K/V store. +/// The row key is the digest of the directory, in hexlower. +/// Inside the row, we currently have a single column/cell, again using the +/// hexlower directory digest. +/// Its value is the Directory message, serialized in canonical protobuf. +/// We currently only populate this column. +/// +/// In the future, we might want to introduce "bucketing", essentially storing +/// all directories inserted via `put_multiple_start` in a batched form. +/// This will prevent looking up intermediate Directories, which are not +/// directly at the root, so rely on store composition. +#[derive(Clone)] +pub struct BigtableDirectoryService { + client: bigtable::BigTable, + params: BigtableParameters, + + #[cfg(test)] + #[allow(dead_code)] + /// Holds the temporary directory containing the unix socket, and the + /// spawned emulator process. + emulator: std::sync::Arc<(tempfile::TempDir, async_process::Child)>, +} + +/// Represents configuration of [BigtableDirectoryService]. +/// This currently conflates both connect parameters and data model/client +/// behaviour parameters. +#[serde_as] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct BigtableParameters { + project_id: String, + instance_name: String, + #[serde(default)] + is_read_only: bool, + #[serde(default = "default_channel_size")] + channel_size: usize, + + #[serde_as(as = "Option>")] + #[serde(default = "default_timeout")] + timeout: Option, + table_name: String, + family_name: String, + + #[serde(default = "default_app_profile_id")] + app_profile_id: String, +} + +fn default_app_profile_id() -> String { + "default".to_owned() +} + +fn default_channel_size() -> usize { + 4 +} + +fn default_timeout() -> Option { + Some(std::time::Duration::from_secs(4)) +} + +impl BigtableDirectoryService { + #[cfg(not(test))] + pub async fn connect(params: BigtableParameters) -> Result { + let connection = bigtable::BigTableConnection::new( + ¶ms.project_id, + ¶ms.instance_name, + params.is_read_only, + params.channel_size, + params.timeout, + ) + .await?; + + Ok(Self { + client: connection.client(), + params, + }) + } + + #[cfg(test)] + pub async fn connect(params: BigtableParameters) -> Result { + use std::time::Duration; + + use async_process::{Command, Stdio}; + use tempfile::TempDir; + use tokio_retry::{strategy::ExponentialBackoff, Retry}; + + let tmpdir = TempDir::new().unwrap(); + + let socket_path = tmpdir.path().join("cbtemulator.sock"); + + let emulator_process = Command::new("cbtemulator") + .arg("-address") + .arg(socket_path.clone()) + .stderr(Stdio::piped()) + .stdout(Stdio::piped()) + .kill_on_drop(true) + .spawn() + .expect("failed to spwan emulator"); + + Retry::spawn( + ExponentialBackoff::from_millis(20).max_delay(Duration::from_secs(1)), + || async { + if socket_path.exists() { + Ok(()) + } else { + Err(()) + } + }, + ) + .await + .expect("failed to wait for socket"); + + // populate the emulator + for cmd in &[ + vec!["createtable", ¶ms.table_name], + vec!["createfamily", ¶ms.table_name, ¶ms.family_name], + ] { + Command::new("cbt") + .args({ + let mut args = vec![ + "-instance", + ¶ms.instance_name, + "-project", + ¶ms.project_id, + ]; + args.extend_from_slice(cmd); + args + }) + .env( + "BIGTABLE_EMULATOR_HOST", + format!("unix://{}", socket_path.to_string_lossy()), + ) + .output() + .await + .expect("failed to run cbt setup command"); + } + + let connection = bigtable_rs::bigtable::BigTableConnection::new_with_emulator( + &format!("unix://{}", socket_path.to_string_lossy()), + ¶ms.project_id, + ¶ms.instance_name, + params.is_read_only, + params.timeout, + )?; + + Ok(Self { + client: connection.client(), + params, + emulator: (tmpdir, emulator_process).into(), + }) + } +} + +/// Derives the row/column key for a given blake3 digest. +/// We use hexlower encoding, also because it can't be misinterpreted as RE2. +fn derive_directory_key(digest: &B3Digest) -> String { + HEXLOWER.encode(digest.as_slice()) +} + +#[async_trait] +impl DirectoryService for BigtableDirectoryService { + #[instrument(skip(self, digest), err, fields(directory.digest = %digest))] + async fn get(&self, digest: &B3Digest) -> Result, Error> { + let mut client = self.client.clone(); + let directory_key = derive_directory_key(digest); + + let request = bigtable_v2::ReadRowsRequest { + app_profile_id: self.params.app_profile_id.to_string(), + table_name: client.get_full_table_name(&self.params.table_name), + rows_limit: 1, + rows: Some(bigtable_v2::RowSet { + row_keys: vec![directory_key.clone().into()], + row_ranges: vec![], + }), + // Filter selected family name, and column qualifier matching our digest. + // This is to ensure we don't fail once we start bucketing. + filter: Some(bigtable_v2::RowFilter { + filter: Some(bigtable_v2::row_filter::Filter::Chain( + bigtable_v2::row_filter::Chain { + filters: vec![ + bigtable_v2::RowFilter { + filter: Some( + bigtable_v2::row_filter::Filter::FamilyNameRegexFilter( + self.params.family_name.to_string(), + ), + ), + }, + bigtable_v2::RowFilter { + filter: Some( + bigtable_v2::row_filter::Filter::ColumnQualifierRegexFilter( + directory_key.clone().into(), + ), + ), + }, + ], + }, + )), + }), + ..Default::default() + }; + + let mut response = client + .read_rows(request) + .await + .map_err(|e| Error::StorageError(format!("unable to read rows: {}", e)))?; + + if response.len() != 1 { + if response.len() > 1 { + // This shouldn't happen, we limit number of rows to 1 + return Err(Error::StorageError( + "got more than one row from bigtable".into(), + )); + } + // else, this is simply a "not found". + return Ok(None); + } + + let (row_key, mut row_cells) = response.pop().unwrap(); + if row_key != directory_key.as_bytes() { + // This shouldn't happen, we requested this row key. + return Err(Error::StorageError( + "got wrong row key from bigtable".into(), + )); + } + + let row_cell = row_cells + .pop() + .ok_or_else(|| Error::StorageError("found no cells".into()))?; + + // Ensure there's only one cell (so no more left after the pop()) + // This shouldn't happen, We filter out other cells in our query. + if !row_cells.is_empty() { + return Err(Error::StorageError( + "more than one cell returned from bigtable".into(), + )); + } + + // We also require the qualifier to be correct in the filter above, + // so this shouldn't happen. + if directory_key.as_bytes() != row_cell.qualifier { + return Err(Error::StorageError("unexpected cell qualifier".into())); + } + + // For the data in that cell, ensure the digest matches what's requested, before parsing. + let got_digest = B3Digest::from(blake3::hash(&row_cell.value).as_bytes()); + if got_digest != *digest { + return Err(Error::StorageError(format!( + "invalid digest: {}", + got_digest + ))); + } + + // Try to parse the value into a Directory message. + let directory = proto::Directory::decode(Bytes::from(row_cell.value)) + .map_err(|e| Error::StorageError(format!("unable to decode directory proto: {}", e)))?; + + // validate the Directory. + directory + .validate() + .map_err(|e| Error::StorageError(format!("invalid Directory message: {}", e)))?; + + Ok(Some(directory)) + } + + #[instrument(skip(self, directory), err, fields(directory.digest = %directory.digest()))] + async fn put(&self, directory: proto::Directory) -> Result { + let directory_digest = directory.digest(); + let mut client = self.client.clone(); + let directory_key = derive_directory_key(&directory_digest); + + // Ensure the directory we're trying to upload passes validation + directory + .validate() + .map_err(|e| Error::InvalidRequest(format!("directory is invalid: {}", e)))?; + + let data = directory.encode_to_vec(); + if data.len() as u64 > CELL_SIZE_LIMIT { + return Err(Error::StorageError( + "Directory exceeds cell limit on Bigtable".into(), + )); + } + + let resp = client + .check_and_mutate_row(bigtable_v2::CheckAndMutateRowRequest { + table_name: client.get_full_table_name(&self.params.table_name), + app_profile_id: self.params.app_profile_id.to_string(), + row_key: directory_key.clone().into(), + predicate_filter: Some(bigtable_v2::RowFilter { + filter: Some(bigtable_v2::row_filter::Filter::ColumnQualifierRegexFilter( + directory_key.clone().into(), + )), + }), + // If the column was already found, do nothing. + true_mutations: vec![], + // Else, do the insert. + false_mutations: vec![ + // https://cloud.google.com/bigtable/docs/writes + bigtable_v2::Mutation { + mutation: Some(bigtable_v2::mutation::Mutation::SetCell( + bigtable_v2::mutation::SetCell { + family_name: self.params.family_name.to_string(), + column_qualifier: directory_key.clone().into(), + timestamp_micros: -1, // use server time to fill timestamp + value: data, + }, + )), + }, + ], + }) + .await + .map_err(|e| Error::StorageError(format!("unable to mutate rows: {}", e)))?; + + if resp.predicate_matched { + trace!("already existed") + } + + Ok(directory_digest) + } + + #[instrument(skip_all, fields(directory.digest = %root_directory_digest))] + fn get_recursive( + &self, + root_directory_digest: &B3Digest, + ) -> BoxStream> { + traverse_directory(self.clone(), root_directory_digest) + } + + #[instrument(skip_all)] + fn put_multiple_start(&self) -> Box<(dyn DirectoryPutter + 'static)> + where + Self: Clone, + { + Box::new(SimplePutter::new(self.clone())) + } +} diff --git a/tvix/castore/src/directoryservice/from_addr.rs b/tvix/castore/src/directoryservice/from_addr.rs index eb01cf348..31158d3a3 100644 --- a/tvix/castore/src/directoryservice/from_addr.rs +++ b/tvix/castore/src/directoryservice/from_addr.rs @@ -19,7 +19,8 @@ use super::{DirectoryService, GRPCDirectoryService, MemoryDirectoryService, Sled /// - `grpc+http://host:port`, `grpc+https://host:port` /// Connects to a (remote) tvix-store gRPC service. pub async fn from_addr(uri: &str) -> Result, crate::Error> { - let url = Url::parse(uri) + #[allow(unused_mut)] + let mut url = Url::parse(uri) .map_err(|e| crate::Error::StorageError(format!("unable to parse url: {}", e)))?; let directory_service: Box = match url.scheme() { @@ -62,6 +63,30 @@ pub async fn from_addr(uri: &str) -> Result, crate::Er let client = DirectoryServiceClient::new(crate::tonic::channel_from_url(&url).await?); Box::new(GRPCDirectoryService::from_client(client)) } + #[cfg(feature = "cloud")] + "bigtable" => { + use super::bigtable::BigtableParameters; + use super::BigtableDirectoryService; + + // parse the instance name from the hostname. + let instance_name = url + .host_str() + .ok_or_else(|| Error::StorageError("instance name missing".into()))? + .to_string(); + + // … but add it to the query string now, so we just need to parse that. + url.query_pairs_mut() + .append_pair("instance_name", &instance_name); + + let params: BigtableParameters = serde_qs::from_str(url.query().unwrap_or_default()) + .map_err(|e| Error::InvalidRequest(format!("failed to parse parameters: {}", e)))?; + + Box::new( + BigtableDirectoryService::connect(params) + .await + .map_err(|e| Error::StorageError(e.to_string()))?, + ) + } _ => { return Err(crate::Error::StorageError(format!( "unknown scheme: {}", @@ -117,6 +142,27 @@ mod tests { #[case::grpc_valid_https_host_without_port("grpc+https://localhost", true)] /// Correct scheme to connect to localhost over http, but with additional path, which is invalid. #[case::grpc_invalid_host_and_path("grpc+http://localhost/some-path", false)] + /// A valid example for Bigtable + #[cfg_attr( + feature = "cloud", + case::bigtable_valid_url( + "bigtable://instance-1?project_id=project-1&table_name=table-1&family_name=cf1", + true + ) + )] + /// A valid example for Bigtable, specifying a custom channel size and timeout + #[cfg_attr( + feature = "cloud", + case::bigtable_valid_url( + "bigtable://instance-1?project_id=project-1&table_name=table-1&family_name=cf1&channel_size=10&timeout=10", + true + ) + )] + /// A invalid Bigtable example (missing fields) + #[cfg_attr( + feature = "cloud", + case::bigtable_invalid_url("bigtable://instance-1", false) + )] #[tokio::test] async fn test_from_addr_tokio(#[case] uri_str: &str, #[case] exp_succeed: bool) { if exp_succeed { diff --git a/tvix/castore/src/directoryservice/mod.rs b/tvix/castore/src/directoryservice/mod.rs index e9ac73173..cf6bea39d 100644 --- a/tvix/castore/src/directoryservice/mod.rs +++ b/tvix/castore/src/directoryservice/mod.rs @@ -22,6 +22,12 @@ pub use self::sled::SledDirectoryService; pub use self::traverse::descend_to; pub use self::utils::traverse_directory; +#[cfg(feature = "cloud")] +mod bigtable; + +#[cfg(feature = "cloud")] +pub use self::bigtable::BigtableDirectoryService; + /// The base trait all Directory services need to implement. /// This is a simple get and put of [crate::proto::Directory], returning their /// digest. diff --git a/tvix/castore/src/directoryservice/tests/mod.rs b/tvix/castore/src/directoryservice/tests/mod.rs index 23650069b..50c8a5c6d 100644 --- a/tvix/castore/src/directoryservice/tests/mod.rs +++ b/tvix/castore/src/directoryservice/tests/mod.rs @@ -26,6 +26,7 @@ use self::utils::make_grpc_directory_service_client; #[case::grpc(make_grpc_directory_service_client().await)] #[case::memory(directoryservice::from_addr("memory://").await.unwrap())] #[case::sled(directoryservice::from_addr("sled://").await.unwrap())] +#[cfg_attr(feature = "cloud", case::bigtable(directoryservice::from_addr("bigtable://instance-1?project_id=project-1&table_name=table-1&family_name=cf1").await.unwrap()))] pub fn directory_services(#[case] directory_service: impl DirectoryService) {} /// Ensures asking for a directory that doesn't exist returns a Ok(None). diff --git a/tvix/castore/src/directoryservice/tests/utils.rs b/tvix/castore/src/directoryservice/tests/utils.rs index 72a3ff754..0f706695e 100644 --- a/tvix/castore/src/directoryservice/tests/utils.rs +++ b/tvix/castore/src/directoryservice/tests/utils.rs @@ -5,6 +5,7 @@ use crate::{ directoryservice::MemoryDirectoryService, proto::directory_service_server::DirectoryServiceServer, }; + use tonic::transport::{Endpoint, Server, Uri}; /// Constructs and returns a gRPC DirectoryService. diff --git a/tvix/crate-hashes.json b/tvix/crate-hashes.json index d57ed3a28..e0cb5e6df 100644 --- a/tvix/crate-hashes.json +++ b/tvix/crate-hashes.json @@ -1,4 +1,5 @@ { + "bigtable_rs 0.2.9 (git+https://github.com/flokli/bigtable_rs?rev=0af404741dfc40eb9fa99cf4d4140a09c5c20df7#0af404741dfc40eb9fa99cf4d4140a09c5c20df7)": "1njjam1lx2xlnm7a41lga8601vmjgqz0fvc77x24gd04pc7avxll", "test-generator 0.3.0 (git+https://github.com/JamesGuthrie/test-generator.git?rev=82e799979980962aec1aa324ec6e0e4cad781f41#82e799979980962aec1aa324ec6e0e4cad781f41)": "08brp3qqa55hijc7xby3lam2cc84hvx1zzfqv6lj7smlczh8k32y", "wu-manber 0.1.0 (git+https://github.com/tvlfyi/wu-manber.git#0d5b22bea136659f7de60b102a7030e0daaa503d)": "1zhk83lbq99xzyjwphv2qrb8f8qgfqwa5bbbvyzm0z0bljsjv0pd" -} +} \ No newline at end of file diff --git a/tvix/default.nix b/tvix/default.nix index da3e0ca60..f965959c9 100644 --- a/tvix/default.nix +++ b/tvix/default.nix @@ -43,6 +43,10 @@ let nativeBuildInputs = protobufDep prev; }; + prost-wkt-types = prev: { + nativeBuildInputs = protobufDep prev; + }; + tonic-reflection = prev: { nativeBuildInputs = protobufDep prev; }; @@ -84,6 +88,7 @@ let (crateName: (lib.nameValuePair "${crateName}-${crates.internal.crates.${crateName}.version}" crates.internal.crates.${crateName}.src.outputHash) ) [ + "bigtable_rs" "test-generator" "wu-manber" ]); diff --git a/tvix/shell.nix b/tvix/shell.nix index c09f4b7b3..bba20496a 100644 --- a/tvix/shell.nix +++ b/tvix/shell.nix @@ -19,10 +19,12 @@ pkgs.mkShell { pkgs.cargo pkgs.cargo-machete pkgs.cargo-expand + pkgs.cbtemulator pkgs.clippy pkgs.evans pkgs.fuse pkgs.go + pkgs.google-cloud-bigtable-tool pkgs.grpcurl pkgs.hyperfine pkgs.mdbook