From c1a1493159021d461e2c553c51fb5e76556504a3 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Thu, 23 Jul 2020 04:12:20 -0700 Subject: [PATCH] use dirs crate for default location of state and config (#714) * use dirs crate for default location of state and config * panic if a path isn't specified for zebra-state --- Cargo.lock | 51 ++++++++++++++++++++++++++ zebra-consensus/src/redjubjub/tests.rs | 8 ++++ zebra-state/Cargo.toml | 3 +- zebra-state/src/lib.rs | 42 ++++++++++++++++++--- zebra-state/tests/basic.rs | 6 ++- zebrad/Cargo.toml | 1 + zebrad/src/commands.rs | 12 +++--- 7 files changed, 110 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1b72313..410a24ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,6 +146,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + [[package]] name = "bech32" version = "0.7.2" @@ -525,6 +531,26 @@ dependencies = [ "generic-array 0.14.3", ] +[[package]] +name = "dirs" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + [[package]] name = "displaydoc" version = "0.1.7" @@ -1617,6 +1643,17 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "redox_users" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + [[package]] name = "regex" version = "1.3.9" @@ -1665,6 +1702,18 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "rust-argon2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + [[package]] name = "rustc-demangle" version = "0.1.16" @@ -2651,6 +2700,7 @@ name = "zebra-state" version = "0.1.0" dependencies = [ "color-eyre", + "dirs", "futures", "hex", "lazy_static", @@ -2697,6 +2747,7 @@ dependencies = [ "abscissa_core", "chrono", "color-eyre", + "dirs", "futures", "gumdrop", "hyper", diff --git a/zebra-consensus/src/redjubjub/tests.rs b/zebra-consensus/src/redjubjub/tests.rs index ece7abda..ef10896f 100644 --- a/zebra-consensus/src/redjubjub/tests.rs +++ b/zebra-consensus/src/redjubjub/tests.rs @@ -46,6 +46,10 @@ where } #[tokio::test] +async fn batch_flushes_on_max_items_test() -> Result<()> { + batch_flushes_on_max_items().await +} + #[spandoc::spandoc] async fn batch_flushes_on_max_items() -> Result<()> { use tokio::time::timeout; @@ -61,6 +65,10 @@ async fn batch_flushes_on_max_items() -> Result<()> { } #[tokio::test] +async fn batch_flushes_on_max_latency_test() -> Result<()> { + batch_flushes_on_max_latency().await +} + #[spandoc::spandoc] async fn batch_flushes_on_max_latency() -> Result<()> { use tokio::time::timeout; diff --git a/zebra-state/Cargo.toml b/zebra-state/Cargo.toml index 2cdb3f20..7fce09cd 100644 --- a/zebra-state/Cargo.toml +++ b/zebra-state/Cargo.toml @@ -15,6 +15,7 @@ lazy_static = "1.4.0" hex = "0.4.2" sled = "0.33.0" serde = { version = "1", features = ["serde_derive"] } +dirs = "3.0.1" tracing = "0.1" tracing-futures = "0.2" @@ -24,4 +25,4 @@ zebra-test = { path = "../zebra-test/" } spandoc = "0.2" tempdir = "0.3.7" color-eyre = "0.5" -once_cell = "1.4" +once_cell = "1.4" \ No newline at end of file diff --git a/zebra-state/src/lib.rs b/zebra-state/src/lib.rs index efbe8f80..4b6bc3d0 100644 --- a/zebra-state/src/lib.rs +++ b/zebra-state/src/lib.rs @@ -30,20 +30,38 @@ pub mod on_disk; #[serde(deny_unknown_fields)] pub struct Config { /// The root directory for the state storage - pub path: PathBuf, + pub cache_dir: Option, } impl Config { + /// Generate the appropriate `sled::Config` based on the provided + /// `zebra_state::Config`. + /// + /// # Details + /// + /// This function should panic if the user of `zebra-state` doesn't configure + /// a directory to store the state. pub(crate) fn sled_config(&self) -> sled::Config { - sled::Config::default().path(&self.path) + let path = self + .cache_dir + .as_ref() + .unwrap_or_else(|| { + todo!("create a nice user facing error explaining how to set the cache directory") + }) + .join("state"); + + sled::Config::default().path(path) } } impl Default for Config { fn default() -> Self { - Self { - path: PathBuf::from("./.zebra-state"), - } + let cache_dir = std::env::var("ZEBRAD_CACHE_DIR") + .map(PathBuf::from) + .ok() + .or_else(|| dirs::cache_dir().map(|dir| dir.join("zebra"))); + + Self { cache_dir } } } @@ -114,3 +132,17 @@ fn block_locator_heights(tip_height: BlockHeight) -> impl Iterator> = Lazy::new(|| { }); #[tokio::test] +async fn check_transcripts_test() -> Result<(), Report> { + check_transcripts().await +} + #[spandoc::spandoc] async fn check_transcripts() -> Result<(), Report> { zebra_test::init(); @@ -61,7 +65,7 @@ async fn check_transcripts() -> Result<(), Report> { let storage_guard = TempDir::new("")?; let service = on_disk::init(Config { - path: storage_guard.path().to_owned(), + cache_dir: Some(storage_guard.path().to_owned()), }); let transcript = Transcript::from(transcript_data.iter().cloned()); /// SPANDOC: check the on disk service against the transcript diff --git a/zebrad/Cargo.toml b/zebrad/Cargo.toml index 41b86918..c0e19620 100644 --- a/zebrad/Cargo.toml +++ b/zebrad/Cargo.toml @@ -34,6 +34,7 @@ tracing-error = "0.1.2" metrics-runtime = "0.13" metrics = "0.12" +dirs = "3.0.1" [dev-dependencies] abscissa_core = { version = "0.5", features = ["testing"] } diff --git a/zebrad/src/commands.rs b/zebrad/src/commands.rs index b534573e..3509566d 100644 --- a/zebrad/src/commands.rs +++ b/zebrad/src/commands.rs @@ -91,14 +91,14 @@ impl ZebradCmd { impl Configurable for ZebradCmd { /// Location of the configuration file fn config_path(&self) -> Option { - let filename = std::env::current_dir().ok().map(|mut dir_path| { - dir_path.push(CONFIG_FILE); - dir_path - }); - let if_exists = |f: PathBuf| if f.exists() { Some(f) } else { None }; - filename.and_then(if_exists) + dirs::preference_dir() + .map(|path| path.join(CONFIG_FILE)) + .and_then(if_exists) + .or_else(|| std::env::current_dir().ok()) + .map(|path| path.join(CONFIG_FILE)) + .and_then(if_exists) // Note: Changes in how configuration is loaded may need usage // edits in generate.rs