diff options
author | Kornel <kornel@geekhood.net> | 2020-04-10 12:41:14 +0100 |
---|---|---|
committer | Kornel <kornel@geekhood.net> | 2020-04-10 12:49:15 +0100 |
commit | 5469b5bac6d1f258133821c6e4e76368056f9f6e (patch) | |
tree | cec9af850175278e67c5aebe409ef1db037df116 | |
parent | 0074e0346f02155029b40b114bb4f2c2e1d4116f (diff) |
Verify cached metadata has the latest version
-rw-r--r-- | kitchen_sink/src/lib_kitchen_sink.rs | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index 61a7357..cc5221c 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -120,6 +120,8 @@ pub enum KitchenSinkErr { DataNotFound(String), #[fail(display = "crate has no versions")] NoVersions, + #[fail(display = "cached data has different version than the index")] + CacheExpired, #[fail(display = "Environment variable CRATES_DATA_DIR is not set.\nChoose a dir where it's OK to store lots of data, and export it like CRATES_DATA_DIR=/var/lib/crates.rs")] CratesDataDirEnvVarMissing, #[fail(display = "{} does not exist\nPlease get data files from https://lib.rs/data and put them in that directory, or set CRATES_DATA_DIR to their location.", _0)] @@ -715,9 +717,24 @@ impl KitchenSink { if let Some(krate) = self.loaded_rich_crate_version_cache.read().get(origin) { return Ok(krate.clone()); } - - let data = tokio::time::timeout(Duration::from_secs(30), self.crate_db.rich_crate_version_data(origin)) + let mut data = tokio::time::timeout(Duration::from_secs(30), self.crate_db.rich_crate_version_data(origin)) .await.map_err(|_| KitchenSinkErr::DataTimedOut)?; + + if let Ok(cached) = &data { + match origin { + Origin::CratesIo(name) => { + let expected_ver = self.index.crate_highest_version(name, false).context("rich_crate_version2")?; + let has = &cached.0.package().version; + let wants = expected_ver.version(); + if has != wants { + eprintln!("Ignoring derived cache of {}, because it's {}, and crates-io is {}", name, has, wants); + data = Err(KitchenSinkErr::CacheExpired.into()); + } + }, + _ => {}, // TODO: figure out when to invalidate cache of git-repo crates + } + } + let (manifest, derived) = match data { Ok(v) => v, Err(e) => { |