hypha: use manifest digest as part of key in image cache

This commit is contained in:
Alex Zenla 2024-01-22 07:24:42 -08:00
parent 3085a3738f
commit 04092c1d3b
No known key found for this signature in database
GPG Key ID: 067B238899B51269
3 changed files with 19 additions and 9 deletions

View File

@ -47,7 +47,11 @@ impl RegistryClient {
Ok(copy(reader.deref_mut(), dest)?) Ok(copy(reader.deref_mut(), dest)?)
} }
pub fn get_manifest(&mut self, name: &str, reference: &str) -> Result<ImageManifest> { pub fn get_manifest_with_digest(
&mut self,
name: &str,
reference: &str,
) -> Result<(ImageManifest, String)> {
let url = self let url = self
.url .url
.join(&format!("/v2/{}/manifests/{}", name, reference))?; .join(&format!("/v2/{}/manifests/{}", name, reference))?;
@ -69,10 +73,14 @@ impl RegistryClient {
let descriptor = self let descriptor = self
.pick_manifest(index) .pick_manifest(index)
.ok_or_else(|| HyphaError::new("unable to pick manifest from index"))?; .ok_or_else(|| HyphaError::new("unable to pick manifest from index"))?;
return self.get_manifest(name, descriptor.digest()); return self.get_manifest_with_digest(name, descriptor.digest());
} }
let digest = response
.header("Docker-Content-Digest")
.ok_or_else(|| HyphaError::new("fetching manifest did not yield a content digest"))?
.to_string();
let manifest = ImageManifest::from_reader(response.into_reader())?; let manifest = ImageManifest::from_reader(response.into_reader())?;
Ok(manifest) Ok((manifest, digest))
} }
fn pick_manifest(&mut self, index: ImageIndex) -> Option<Descriptor> { fn pick_manifest(&mut self, index: ImageIndex) -> Option<Descriptor> {

View File

@ -6,7 +6,8 @@ use crate::error::{HyphaError, Result};
use crate::image::cache::ImageCache; use crate::image::cache::ImageCache;
use crate::image::fetch::RegistryClient; use crate::image::fetch::RegistryClient;
use crate::image::name::ImageName; use crate::image::name::ImageName;
use backhand::{FilesystemWriter, NodeHeader}; use backhand::compression::Compressor;
use backhand::{FilesystemCompressor, FilesystemWriter, NodeHeader};
use flate2::read::GzDecoder; use flate2::read::GzDecoder;
use log::{debug, trace, warn}; use log::{debug, trace, warn};
use oci_spec::image::{Descriptor, ImageConfiguration, ImageManifest, MediaType, ToDockerV2S2}; use oci_spec::image::{Descriptor, ImageConfiguration, ImageManifest, MediaType, ToDockerV2S2};
@ -125,11 +126,10 @@ impl ImageCompiler<'_> {
image_dir.to_str().unwrap() image_dir.to_str().unwrap()
); );
let mut client = RegistryClient::new(image.registry_url()?)?; let mut client = RegistryClient::new(image.registry_url()?)?;
let manifest = client.get_manifest(&image.name, &image.reference)?; let (manifest, digest) = client.get_manifest_with_digest(&image.name, &image.reference)?;
let manifest_serialized = serde_json::to_string(&manifest)?;
let cache_key = format!( let cache_key = format!(
"manifest\n{}squashfs-version\n{}\n", "manifest={}:squashfs-version={}\n",
manifest_serialized, IMAGE_SQUASHFS_VERSION digest, IMAGE_SQUASHFS_VERSION
); );
let cache_digest = sha256::digest(cache_key); let cache_digest = sha256::digest(cache_key);
@ -338,6 +338,7 @@ impl ImageCompiler<'_> {
fn squash(&self, image_dir: &PathBuf, squash_file: &PathBuf) -> Result<()> { fn squash(&self, image_dir: &PathBuf, squash_file: &PathBuf) -> Result<()> {
let mut writer = FilesystemWriter::default(); let mut writer = FilesystemWriter::default();
writer.set_compressor(FilesystemCompressor::new(Compressor::Gzip, None)?);
let walk = WalkDir::new(image_dir).follow_links(false); let walk = WalkDir::new(image_dir).follow_links(false);
for entry in walk { for entry in walk {
let entry = entry?; let entry = entry?;

View File

@ -195,7 +195,8 @@ impl XenClient {
let mut count: u32 = 0; let mut count: u32 = 0;
loop { loop {
if count >= 100 { if count >= 100 {
return Err(XenClientError::new("unable to destroy device")); warn!("unable to safely destroy backend: {}", backend);
break;
} }
let state = self.store.read_string(&state_path)?; let state = self.store.read_string(&state_path)?;
let state = i64::from_str(&state).unwrap_or(-1); let state = i64::from_str(&state).unwrap_or(-1);