diff options
author | Florian Klink <flokli@flokli.de> | 2024-10-13T16·09+0300 |
---|---|---|
committer | flokli <flokli@flokli.de> | 2024-10-17T22·15+0000 |
commit | 1c80bc4b5b2736e9421fc8a6f833f1e592e08642 (patch) | |
tree | a4d58eec75f230bbf559933a85d19c25ed35e8b7 | |
parent | f0d594789ee01df43de50198adef91a11e2a355a (diff) |
refactor(tvix/store): remove use of lazy_static r/8825
This is now supported in the standard library via std::sync::LazyLock, but requires some manual shuffling around of code. Change-Id: Ifca792f4d2dbc36b703de4a4dfa406015ab86da7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12614 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: flokli <flokli@flokli.de> Reviewed-by: edef <edef@edef.eu> Tested-by: BuildkiteCI
-rw-r--r-- | tvix/Cargo.lock | 1 | ||||
-rw-r--r-- | tvix/Cargo.nix | 4 | ||||
-rw-r--r-- | tvix/Cargo.toml | 1 | ||||
-rw-r--r-- | tvix/store/Cargo.toml | 1 | ||||
-rw-r--r-- | tvix/store/src/composition.rs | 21 | ||||
-rw-r--r-- | tvix/store/src/pathinfoservice/from_addr.rs | 8 | ||||
-rw-r--r-- | tvix/store/src/pathinfoservice/lru.rs | 20 | ||||
-rw-r--r-- | tvix/store/src/proto/tests/pathinfo.rs | 48 | ||||
-rw-r--r-- | tvix/store/src/tests/fixtures.rs | 138 |
9 files changed, 119 insertions, 123 deletions
diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock index eb40901630af..c0c6f1f2432b 100644 --- a/tvix/Cargo.lock +++ b/tvix/Cargo.lock @@ -4776,7 +4776,6 @@ dependencies = [ "ed25519-dalek", "futures", "hyper-util", - "lazy_static", "lru", "mimalloc", "nix-compat", diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix index 64afa81bdc92..7d25ba51ed17 100644 --- a/tvix/Cargo.nix +++ b/tvix/Cargo.nix @@ -15965,10 +15965,6 @@ rec { packageId = "hyper-util"; } { - name = "lazy_static"; - packageId = "lazy_static"; - } - { name = "lru"; packageId = "lru"; } diff --git a/tvix/Cargo.toml b/tvix/Cargo.toml index e86ae3a8f93a..6b30e1196c39 100644 --- a/tvix/Cargo.toml +++ b/tvix/Cargo.toml @@ -77,7 +77,6 @@ http = "1.1.0" hyper-util = "0.1.7" indicatif = "0.17.8" itertools = "0.12.1" -lazy_static = "1.5.0" lexical-core = "0.8.5" libc = "0.2.158" lru = "0.12.4" diff --git a/tvix/store/Cargo.toml b/tvix/store/Cargo.toml index c19f34bbbcf0..b913aed3be95 100644 --- a/tvix/store/Cargo.toml +++ b/tvix/store/Cargo.toml @@ -16,7 +16,6 @@ data-encoding = { workspace = true } ed25519 = { workspace = true } ed25519-dalek = { workspace = true } futures = { workspace = true } -lazy_static = { workspace = true } nix-compat = { path = "../nix-compat", features = ["async"] } pin-project-lite = { workspace = true } prost = { workspace = true } diff --git a/tvix/store/src/composition.rs b/tvix/store/src/composition.rs index a32f22cf7796..063236136fd1 100644 --- a/tvix/store/src/composition.rs +++ b/tvix/store/src/composition.rs @@ -1,17 +1,16 @@ -use lazy_static::lazy_static; +use std::sync::LazyLock; pub use tvix_castore::composition::*; -lazy_static! { - /// The provided registry of tvix_store, which has all the builtin - /// tvix_castore (BlobStore/DirectoryStore) and tvix_store - /// (PathInfoService) implementations. - pub static ref REG: Registry = { - let mut reg = Default::default(); - add_default_services(&mut reg); - reg - }; -} +/// The provided registry of tvix_store, which has all the builtin +/// tvix_castore (BlobStore/DirectoryStore) and tvix_store +/// (PathInfoService) implementations. +pub static REG: LazyLock<&'static Registry> = LazyLock::new(|| { + let mut reg = Default::default(); + add_default_services(&mut reg); + // explicitly leak to get an &'static, so that we gain `&Registry: Send` from `Registry: Sync` + Box::leak(Box::new(reg)) +}); /// Register the builtin services of tvix_castore and tvix_store with the given /// registry. This is useful for creating your own registry with the builtin diff --git a/tvix/store/src/pathinfoservice/from_addr.rs b/tvix/store/src/pathinfoservice/from_addr.rs index 3dfb08c9e817..683457345c6c 100644 --- a/tvix/store/src/pathinfoservice/from_addr.rs +++ b/tvix/store/src/pathinfoservice/from_addr.rs @@ -57,16 +57,14 @@ pub async fn from_addr( mod tests { use super::from_addr; use crate::composition::{Composition, DeserializeWithRegistry, ServiceBuilder, REG}; - use lazy_static::lazy_static; use rstest::rstest; + use std::sync::LazyLock; use tempfile::TempDir; use tvix_castore::blobservice::{BlobService, MemoryBlobServiceConfig}; use tvix_castore::directoryservice::{DirectoryService, MemoryDirectoryServiceConfig}; - lazy_static! { - static ref TMPDIR_REDB_1: TempDir = TempDir::new().unwrap(); - static ref TMPDIR_REDB_2: TempDir = TempDir::new().unwrap(); - } + static TMPDIR_REDB_1: LazyLock<TempDir> = LazyLock::new(|| TempDir::new().unwrap()); + static TMPDIR_REDB_2: LazyLock<TempDir> = LazyLock::new(|| TempDir::new().unwrap()); // the gRPC tests below don't fail, because we connect lazily. diff --git a/tvix/store/src/pathinfoservice/lru.rs b/tvix/store/src/pathinfoservice/lru.rs index 2d8d52e3c9f6..3055d73c22f9 100644 --- a/tvix/store/src/pathinfoservice/lru.rs +++ b/tvix/store/src/pathinfoservice/lru.rs @@ -86,22 +86,20 @@ impl ServiceBuilder for LruPathInfoServiceConfig { #[cfg(test)] mod test { use nix_compat::store_path::StorePath; - use std::num::NonZeroUsize; + use std::{num::NonZeroUsize, sync::LazyLock}; use crate::{ pathinfoservice::{LruPathInfoService, PathInfo, PathInfoService}, tests::fixtures::PATH_INFO, }; - use lazy_static::lazy_static; - - lazy_static! { - static ref PATHINFO_2: PathInfo = { - let mut p = PATH_INFO.clone(); - p.store_path = StorePath::from_name_and_digest_fixed("dummy", [1; 20]).unwrap(); - p - }; - static ref PATHINFO_2_DIGEST: [u8; 20] = *PATHINFO_2.store_path.digest(); - } + static PATHINFO_2: LazyLock<PathInfo> = LazyLock::new(|| { + let mut p = PATH_INFO.clone(); + p.store_path = StorePath::from_name_and_digest_fixed("dummy", [1; 20]).unwrap(); + p + }); + + static PATHINFO_2_DIGEST: LazyLock<[u8; 20]> = + LazyLock::new(|| *PATHINFO_2.store_path.digest()); #[tokio::test] async fn evict() { diff --git a/tvix/store/src/proto/tests/pathinfo.rs b/tvix/store/src/proto/tests/pathinfo.rs index 320f419b6c59..edda64045f8e 100644 --- a/tvix/store/src/proto/tests/pathinfo.rs +++ b/tvix/store/src/proto/tests/pathinfo.rs @@ -1,37 +1,39 @@ +use std::sync::LazyLock; + use crate::pathinfoservice::PathInfo; use crate::proto::{self, ValidatePathInfoError}; use crate::tests::fixtures::{DUMMY_PATH, DUMMY_PATH_DIGEST, DUMMY_PATH_STR}; use bytes::Bytes; -use lazy_static::lazy_static; use nix_compat::store_path; use rstest::rstest; use tvix_castore::fixtures::DUMMY_DIGEST; use tvix_castore::proto as castorepb; use tvix_castore::{DirectoryError, ValidateNodeError}; -lazy_static! { - /// A valid PathInfo message - /// The references in `narinfo.reference_names` aligns with what's in - /// `references`. - static ref PROTO_PATH_INFO : proto::PathInfo = proto::PathInfo { - node: Some(castorepb::Node { - node: Some(castorepb::node::Node::Directory(castorepb::DirectoryNode { - name: DUMMY_PATH_STR.into(), - digest: DUMMY_DIGEST.clone().into(), - size: 0, - })), - }), - references: vec![DUMMY_PATH_DIGEST.as_slice().into()], - narinfo: Some(proto::NarInfo { - nar_size: 0, - nar_sha256: DUMMY_DIGEST.clone().into(), - signatures: vec![], - reference_names: vec![DUMMY_PATH_STR.to_string()], - deriver: None, - ca: Some(proto::nar_info::Ca { r#type: proto::nar_info::ca::Hash::NarSha256.into(), digest: DUMMY_DIGEST.clone().into() }) +/// A valid PathInfo message +/// The references in `narinfo.reference_names` aligns with what's in +/// `references`. +static PROTO_PATH_INFO: LazyLock<proto::PathInfo> = LazyLock::new(|| proto::PathInfo { + node: Some(castorepb::Node { + node: Some(castorepb::node::Node::Directory(castorepb::DirectoryNode { + name: DUMMY_PATH_STR.into(), + digest: DUMMY_DIGEST.clone().into(), + size: 0, + })), + }), + references: vec![DUMMY_PATH_DIGEST.as_slice().into()], + narinfo: Some(proto::NarInfo { + nar_size: 0, + nar_sha256: DUMMY_DIGEST.clone().into(), + signatures: vec![], + reference_names: vec![DUMMY_PATH_STR.to_string()], + deriver: None, + ca: Some(proto::nar_info::Ca { + r#type: proto::nar_info::ca::Hash::NarSha256.into(), + digest: DUMMY_DIGEST.clone().into(), }), - }; -} + }), +}); #[test] fn convert_valid() { diff --git a/tvix/store/src/tests/fixtures.rs b/tvix/store/src/tests/fixtures.rs index 91628f2fee79..48edbcb7c232 100644 --- a/tvix/store/src/tests/fixtures.rs +++ b/tvix/store/src/tests/fixtures.rs @@ -1,11 +1,10 @@ use crate::pathinfoservice::PathInfo; -use lazy_static::lazy_static; use nix_compat::nixhash::{CAHash, NixHash}; use nix_compat::store_path::StorePath; use rstest::{self, *}; use rstest_reuse::*; use std::io; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use tvix_castore::fixtures::{ DIRECTORY_COMPLICATED, DIRECTORY_WITH_KEEP, DUMMY_DIGEST, EMPTY_BLOB_CONTENTS, EMPTY_BLOB_DIGEST, HELLOWORLD_BLOB_CONTENTS, HELLOWORLD_BLOB_DIGEST, @@ -19,69 +18,75 @@ use tvix_castore::{ pub const DUMMY_PATH_STR: &str = "00000000000000000000000000000000-dummy"; pub const DUMMY_PATH_DIGEST: [u8; 20] = [0; 20]; -lazy_static! { - pub static ref DUMMY_PATH: StorePath<String> = StorePath::from_name_and_digest_fixed("dummy", DUMMY_PATH_DIGEST).unwrap(); +pub static DUMMY_PATH: LazyLock<StorePath<String>> = + LazyLock::new(|| StorePath::from_name_and_digest_fixed("dummy", DUMMY_PATH_DIGEST).unwrap()); - pub static ref CASTORE_NODE_SYMLINK: Node = Node::Symlink { - target: "/nix/store/somewhereelse".try_into().unwrap(), - }; +pub static CASTORE_NODE_SYMLINK: LazyLock<Node> = LazyLock::new(|| Node::Symlink { + target: "/nix/store/somewhereelse".try_into().unwrap(), +}); - /// The NAR representation of a symlink pointing to `/nix/store/somewhereelse` - pub static ref NAR_CONTENTS_SYMLINK: Vec<u8> = vec![ - 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', b'-', b'1', 0, - 0, 0, // "nix-archive-1" +/// The NAR representation of a symlink pointing to `/nix/store/somewhereelse` +pub static NAR_CONTENTS_SYMLINK: LazyLock<Vec<u8>> = LazyLock::new(|| { + vec![ + 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', + b'-', b'1', 0, 0, 0, // "nix-archive-1" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b't', b'y', b'p', b'e', 0, 0, 0, 0, // "type" 7, 0, 0, 0, 0, 0, 0, 0, b's', b'y', b'm', b'l', b'i', b'n', b'k', 0, // "symlink" 6, 0, 0, 0, 0, 0, 0, 0, b't', b'a', b'r', b'g', b'e', b't', 0, 0, // target - 24, 0, 0, 0, 0, 0, 0, 0, b'/', b'n', b'i', b'x', b'/', b's', b't', b'o', b'r', b'e', b'/', b's', b'o', - b'm', b'e', b'w', b'h', b'e', b'r', b'e', b'e', b'l', b's', + 24, 0, 0, 0, 0, 0, 0, 0, b'/', b'n', b'i', b'x', b'/', b's', b't', b'o', b'r', b'e', b'/', + b's', b'o', b'm', b'e', b'w', b'h', b'e', b'r', b'e', b'e', b'l', b's', b'e', // "/nix/store/somewhereelse" - 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0 // ")" - ]; + 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" + ] +}); - pub static ref CASTORE_NODE_HELLOWORLD: Node = Node::File { - digest: HELLOWORLD_BLOB_DIGEST.clone(), - size: HELLOWORLD_BLOB_CONTENTS.len() as u64, - executable: false, - }; +pub static CASTORE_NODE_HELLOWORLD: LazyLock<Node> = LazyLock::new(|| Node::File { + digest: HELLOWORLD_BLOB_DIGEST.clone(), + size: HELLOWORLD_BLOB_CONTENTS.len() as u64, + executable: false, +}); - /// The NAR representation of a regular file with the contents "Hello World!" - pub static ref NAR_CONTENTS_HELLOWORLD: Vec<u8> = vec![ - 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', b'-', b'1', 0, - 0, 0, // "nix-archive-1" +/// The NAR representation of a regular file with the contents "Hello World!" +pub static NAR_CONTENTS_HELLOWORLD: LazyLock<Vec<u8>> = LazyLock::new(|| { + vec![ + 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', + b'-', b'1', 0, 0, 0, // "nix-archive-1" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b't', b'y', b'p', b'e', 0, 0, 0, 0, // "type" 7, 0, 0, 0, 0, 0, 0, 0, b'r', b'e', b'g', b'u', b'l', b'a', b'r', 0, // "regular" 8, 0, 0, 0, 0, 0, 0, 0, b'c', b'o', b'n', b't', b'e', b'n', b't', b's', // "contents" - 12, 0, 0, 0, 0, 0, 0, 0, b'H', b'e', b'l', b'l', b'o', b' ', b'W', b'o', b'r', b'l', b'd', b'!', 0, 0, - 0, 0, // "Hello World!" - 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0 // ")" - ]; + 12, 0, 0, 0, 0, 0, 0, 0, b'H', b'e', b'l', b'l', b'o', b' ', b'W', b'o', b'r', b'l', b'd', + b'!', 0, 0, 0, 0, // "Hello World!" + 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" + ] +}); - pub static ref CASTORE_NODE_TOO_BIG: Node = Node::File { - digest: HELLOWORLD_BLOB_DIGEST.clone(), - size: 42, // <- note the wrong size here! - executable: false, - }; - pub static ref CASTORE_NODE_TOO_SMALL: Node = Node::File { - digest: HELLOWORLD_BLOB_DIGEST.clone(), - size: 2, // <- note the wrong size here! - executable: false, - }; +pub static CASTORE_NODE_TOO_BIG: LazyLock<Node> = LazyLock::new(|| Node::File { + digest: HELLOWORLD_BLOB_DIGEST.clone(), + size: 42, // <- note the wrong size here! + executable: false, +}); +pub static CASTORE_NODE_TOO_SMALL: LazyLock<Node> = LazyLock::new(|| Node::File { + digest: HELLOWORLD_BLOB_DIGEST.clone(), + size: 2, // <- note the wrong size here! + executable: false, +}); - pub static ref CASTORE_NODE_COMPLICATED: Node = Node::Directory { - digest: DIRECTORY_COMPLICATED.digest(), - size: DIRECTORY_COMPLICATED.size(), - }; +pub static CASTORE_NODE_COMPLICATED: LazyLock<Node> = LazyLock::new(|| Node::Directory { + digest: DIRECTORY_COMPLICATED.digest(), + size: DIRECTORY_COMPLICATED.size(), +}); - /// The NAR representation of a more complicated directory structure. - pub static ref NAR_CONTENTS_COMPLICATED: Vec<u8> = vec![ - 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', b'-', b'1', 0, - 0, 0, // "nix-archive-1" +/// The NAR representation of a more complicated directory structure. +pub static NAR_CONTENTS_COMPLICATED: LazyLock<Vec<u8>> = LazyLock::new(|| { + vec![ + 13, 0, 0, 0, 0, 0, 0, 0, b'n', b'i', b'x', b'-', b'a', b'r', b'c', b'h', b'i', b'v', b'e', + b'-', b'1', 0, 0, 0, // "nix-archive-1" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b't', b'y', b'p', b'e', 0, 0, 0, 0, // "type" - 9, 0, 0, 0, 0, 0, 0, 0, b'd', b'i', b'r', b'e', b'c', b't', b'o', b'r', b'y', 0, 0, 0, 0, 0, 0, 0, // "directory" + 9, 0, 0, 0, 0, 0, 0, 0, b'd', b'i', b'r', b'e', b'c', b't', b'o', b'r', b'y', 0, 0, 0, 0, + 0, 0, 0, // "directory" 5, 0, 0, 0, 0, 0, 0, 0, b'e', b'n', b't', b'r', b'y', 0, 0, 0, // "entry" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b'n', b'a', b'm', b'e', 0, 0, 0, 0, // "name" @@ -103,8 +108,8 @@ lazy_static! { 4, 0, 0, 0, 0, 0, 0, 0, b't', b'y', b'p', b'e', 0, 0, 0, 0, // "type" 7, 0, 0, 0, 0, 0, 0, 0, b's', b'y', b'm', b'l', b'i', b'n', b'k', 0, // "symlink" 6, 0, 0, 0, 0, 0, 0, 0, b't', b'a', b'r', b'g', b'e', b't', 0, 0, // target - 24, 0, 0, 0, 0, 0, 0, 0, b'/', b'n', b'i', b'x', b'/', b's', b't', b'o', b'r', b'e', b'/', b's', b'o', - b'm', b'e', b'w', b'h', b'e', b'r', b'e', b'e', b'l', b's', + 24, 0, 0, 0, 0, 0, 0, 0, b'/', b'n', b'i', b'x', b'/', b's', b't', b'o', b'r', b'e', b'/', + b's', b'o', b'm', b'e', b'w', b'h', b'e', b'r', b'e', b'e', b'l', b's', b'e', // "/nix/store/somewhereelse" 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" @@ -115,7 +120,8 @@ lazy_static! { 4, 0, 0, 0, 0, 0, 0, 0, b'n', b'o', b'd', b'e', 0, 0, 0, 0, // "node" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b't', b'y', b'p', b'e', 0, 0, 0, 0, // "type" - 9, 0, 0, 0, 0, 0, 0, 0, b'd', b'i', b'r', b'e', b'c', b't', b'o', b'r', b'y', 0, 0, 0, 0, 0, 0, 0, // "directory" + 9, 0, 0, 0, 0, 0, 0, 0, b'd', b'i', b'r', b'e', b'c', b't', b'o', b'r', b'y', 0, 0, 0, 0, + 0, 0, 0, // "directory" 5, 0, 0, 0, 0, 0, 0, 0, b'e', b'n', b't', b'r', b'y', 0, 0, 0, // "entry" 1, 0, 0, 0, 0, 0, 0, 0, b'(', 0, 0, 0, 0, 0, 0, 0, // "(" 4, 0, 0, 0, 0, 0, 0, 0, b'n', b'a', b'm', b'e', 0, 0, 0, 0, // "name" @@ -131,23 +137,23 @@ lazy_static! { 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" 1, 0, 0, 0, 0, 0, 0, 0, b')', 0, 0, 0, 0, 0, 0, 0, // ")" - ]; + ] +}); - /// A PathInfo message - pub static ref PATH_INFO: PathInfo = PathInfo { - store_path: DUMMY_PATH.clone(), - node: tvix_castore::Node::Directory { - digest: DUMMY_DIGEST.clone(), - size: 0, - }, - references: vec![DUMMY_PATH.clone()], - nar_sha256: [0; 32], - nar_size: 0, - signatures: vec![], - deriver: None, - ca: Some(CAHash::Nar(NixHash::Sha256([0; 32]))), - }; -} +/// A PathInfo message +pub static PATH_INFO: LazyLock<PathInfo> = LazyLock::new(|| PathInfo { + store_path: DUMMY_PATH.clone(), + node: tvix_castore::Node::Directory { + digest: DUMMY_DIGEST.clone(), + size: 0, + }, + references: vec![DUMMY_PATH.clone()], + nar_sha256: [0; 32], + nar_size: 0, + signatures: vec![], + deriver: None, + ca: Some(CAHash::Nar(NixHash::Sha256([0; 32]))), +}); #[fixture] pub(crate) fn blob_service() -> Arc<dyn BlobService> { |