mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-03 05:10:55 +00:00
runtime: make image cache async
This commit is contained in:
parent
7c8d38a0ca
commit
4c30f9d08f
@ -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(),
|
||||||
|
@ -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>(
|
||||||
|
Loading…
Reference in New Issue
Block a user