runtime: make image cache async

This commit is contained in:
Alex Zenla 2024-03-07 05:26:35 +00:00
parent 7c8d38a0ca
commit 4c30f9d08f
No known key found for this signature in database
GPG Key ID: 067B238899B51269
2 changed files with 13 additions and 13 deletions

View File

@ -2,8 +2,8 @@ use super::ImageInfo;
use anyhow::Result; use anyhow::Result;
use log::debug; use log::debug;
use oci_spec::image::{ImageConfiguration, ImageManifest}; use oci_spec::image::{ImageConfiguration, ImageManifest};
use std::fs;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use tokio::fs;
pub struct ImageCache { pub struct ImageCache {
cache_dir: PathBuf, cache_dir: PathBuf,
@ -16,7 +16,7 @@ impl ImageCache {
}) })
} }
pub fn recall(&self, digest: &str) -> Result<Option<ImageInfo>> { pub async fn recall(&self, digest: &str) -> Result<Option<ImageInfo>> {
let mut squashfs_path = self.cache_dir.clone(); let mut squashfs_path = self.cache_dir.clone();
let mut config_path = self.cache_dir.clone(); let mut config_path = self.cache_dir.clone();
let mut manifest_path = self.cache_dir.clone(); let mut manifest_path = self.cache_dir.clone();
@ -25,16 +25,16 @@ impl ImageCache {
config_path.push(format!("{}.config.json", digest)); config_path.push(format!("{}.config.json", digest));
Ok( Ok(
if squashfs_path.exists() && manifest_path.exists() && config_path.exists() { if squashfs_path.exists() && manifest_path.exists() && config_path.exists() {
let squashfs_metadata = fs::metadata(&squashfs_path)?; let squashfs_metadata = fs::metadata(&squashfs_path).await?;
let manifest_metadata = fs::metadata(&manifest_path)?; let manifest_metadata = fs::metadata(&manifest_path).await?;
let config_metadata = fs::metadata(&config_path)?; let config_metadata = fs::metadata(&config_path).await?;
if squashfs_metadata.is_file() if squashfs_metadata.is_file()
&& manifest_metadata.is_file() && manifest_metadata.is_file()
&& config_metadata.is_file() && config_metadata.is_file()
{ {
let manifest_text = fs::read_to_string(&manifest_path)?; let manifest_text = fs::read_to_string(&manifest_path).await?;
let manifest: ImageManifest = serde_json::from_str(&manifest_text)?; let manifest: ImageManifest = serde_json::from_str(&manifest_text)?;
let config_text = fs::read_to_string(&config_path)?; let config_text = fs::read_to_string(&config_path).await?;
let config: ImageConfiguration = serde_json::from_str(&config_text)?; let config: ImageConfiguration = serde_json::from_str(&config_text)?;
debug!("cache hit digest={}", digest); debug!("cache hit digest={}", digest);
Some(ImageInfo::new(squashfs_path.clone(), manifest, config)?) Some(ImageInfo::new(squashfs_path.clone(), manifest, config)?)
@ -48,7 +48,7 @@ impl ImageCache {
) )
} }
pub fn store(&self, digest: &str, info: &ImageInfo) -> Result<ImageInfo> { pub async fn store(&self, digest: &str, info: &ImageInfo) -> Result<ImageInfo> {
debug!("cache store digest={}", digest); debug!("cache store digest={}", digest);
let mut squashfs_path = self.cache_dir.clone(); let mut squashfs_path = self.cache_dir.clone();
let mut manifest_path = self.cache_dir.clone(); let mut manifest_path = self.cache_dir.clone();
@ -56,11 +56,11 @@ impl ImageCache {
squashfs_path.push(format!("{}.squashfs", digest)); squashfs_path.push(format!("{}.squashfs", digest));
manifest_path.push(format!("{}.manifest.json", digest)); manifest_path.push(format!("{}.manifest.json", digest));
config_path.push(format!("{}.config.json", digest)); config_path.push(format!("{}.config.json", digest));
fs::copy(&info.image_squashfs, &squashfs_path)?; fs::copy(&info.image_squashfs, &squashfs_path).await?;
let manifest_text = serde_json::to_string_pretty(&info.manifest)?; let manifest_text = serde_json::to_string_pretty(&info.manifest)?;
fs::write(&manifest_path, manifest_text)?; fs::write(&manifest_path, manifest_text).await?;
let config_text = serde_json::to_string_pretty(&info.config)?; let config_text = serde_json::to_string_pretty(&info.config)?;
fs::write(&config_path, config_text)?; fs::write(&config_path, config_text).await?;
ImageInfo::new( ImageInfo::new(
squashfs_path.clone(), squashfs_path.clone(),
info.manifest.clone(), info.manifest.clone(),

View File

@ -137,7 +137,7 @@ impl ImageCompiler<'_> {
); );
let cache_digest = sha256::digest(cache_key); let cache_digest = sha256::digest(cache_key);
if let Some(cached) = self.cache.recall(&cache_digest)? { if let Some(cached) = self.cache.recall(&cache_digest).await? {
return Ok(cached); return Ok(cached);
} }
@ -184,7 +184,7 @@ impl ImageCompiler<'_> {
self.squash(image_dir, squash_file)?; self.squash(image_dir, squash_file)?;
let info = ImageInfo::new(squash_file.clone(), manifest.clone(), config)?; let info = ImageInfo::new(squash_file.clone(), manifest.clone(), config)?;
self.cache.store(&cache_digest, &info) self.cache.store(&cache_digest, &info).await
} }
fn process_whiteout_entry<T: io::Read>( fn process_whiteout_entry<T: io::Read>(