mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-28 11:20:36 +00:00
feat: Added warning when failing to update index cache
This commit is contained in:
parent
1d9a0871fa
commit
272d07ad78
@ -65,6 +65,7 @@
|
|||||||
//! [`IndexSummary::parse`]: super::IndexSummary::parse
|
//! [`IndexSummary::parse`]: super::IndexSummary::parse
|
||||||
//! [`RemoteRegistry`]: crate::sources::registry::remote::RemoteRegistry
|
//! [`RemoteRegistry`]: crate::sources::registry::remote::RemoteRegistry
|
||||||
|
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@ -226,6 +227,9 @@ pub struct CacheManager<'gctx> {
|
|||||||
cache_root: Filesystem,
|
cache_root: Filesystem,
|
||||||
/// [`GlobalContext`] reference for convenience.
|
/// [`GlobalContext`] reference for convenience.
|
||||||
gctx: &'gctx GlobalContext,
|
gctx: &'gctx GlobalContext,
|
||||||
|
/// Keeps track of if we have sent a warning message if there was an error updating the cache.
|
||||||
|
/// The motivation is to avoid warning spam if the cache is not writable.
|
||||||
|
has_warned: RefCell<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'gctx> CacheManager<'gctx> {
|
impl<'gctx> CacheManager<'gctx> {
|
||||||
@ -233,7 +237,11 @@ impl<'gctx> CacheManager<'gctx> {
|
|||||||
///
|
///
|
||||||
/// `root` --- The root path where caches are located.
|
/// `root` --- The root path where caches are located.
|
||||||
pub fn new(cache_root: Filesystem, gctx: &'gctx GlobalContext) -> CacheManager<'gctx> {
|
pub fn new(cache_root: Filesystem, gctx: &'gctx GlobalContext) -> CacheManager<'gctx> {
|
||||||
CacheManager { cache_root, gctx }
|
CacheManager {
|
||||||
|
cache_root,
|
||||||
|
gctx,
|
||||||
|
has_warned: Default::default(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the cache associated with the key.
|
/// Gets the cache associated with the key.
|
||||||
@ -251,16 +259,28 @@ impl<'gctx> CacheManager<'gctx> {
|
|||||||
/// Associates the value with the key.
|
/// Associates the value with the key.
|
||||||
pub fn put(&self, key: &str, value: &[u8]) {
|
pub fn put(&self, key: &str, value: &[u8]) {
|
||||||
let cache_path = &self.cache_path(key);
|
let cache_path = &self.cache_path(key);
|
||||||
if fs::create_dir_all(cache_path.parent().unwrap()).is_ok() {
|
if let Err(e) = self.put_inner(cache_path, value) {
|
||||||
let path = Filesystem::new(cache_path.clone());
|
tracing::info!(?cache_path, "failed to write cache: {e}");
|
||||||
self.gctx
|
|
||||||
.assert_package_cache_locked(CacheLockMode::DownloadExclusive, &path);
|
if !*self.has_warned.borrow() {
|
||||||
if let Err(e) = fs::write(cache_path, value) {
|
let _ = self.gctx.shell().warn(format!(
|
||||||
tracing::info!(?cache_path, "failed to write cache: {e}");
|
"failed to write cache, path: {}, error: {e}",
|
||||||
|
cache_path.to_str().unwrap_or_default()
|
||||||
|
));
|
||||||
|
*self.has_warned.borrow_mut() = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn put_inner(&self, cache_path: &PathBuf, value: &[u8]) -> std::io::Result<()> {
|
||||||
|
fs::create_dir_all(cache_path.parent().unwrap())?;
|
||||||
|
let path = Filesystem::new(cache_path.clone());
|
||||||
|
self.gctx
|
||||||
|
.assert_package_cache_locked(CacheLockMode::DownloadExclusive, &path);
|
||||||
|
fs::write(cache_path, value)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Invalidates the cache associated with the key.
|
/// Invalidates the cache associated with the key.
|
||||||
pub fn invalidate(&self, key: &str) {
|
pub fn invalidate(&self, key: &str) {
|
||||||
let cache_path = &self.cache_path(key);
|
let cache_path = &self.cache_path(key);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user