diff options
Diffstat (limited to 'src/updater.rs')
| -rw-r--r-- | src/updater.rs | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/src/updater.rs b/src/updater.rs index 7b63bf7..e407a2f 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -23,7 +23,7 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil let mut image_ranges: Vec<Range<usize>> = vec![]; let mut imgs: Vec<DockerRef> = vec![]; let mut image_ids: Vec<i64> = vec![]; - let mut last_checkeds: Vec<DateTime<Utc>> = vec![]; + let mut expires_ats: Vec<DateTime<Utc>> = vec![]; for (file_idx, file) in files.iter().enumerate() { for image in &file.images { @@ -33,7 +33,7 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil .unwrap_or("registry.hub.docker.com"); let image_name = &file.content[img.image.clone()]; - let (image_id, last_checked) = match db.get_image(registry, image_name) { + let (image_id, expires_at) = match db.get_image(registry, image_name) { Some(x) => x, None => { let epoch = DateTime::<Utc>::UNIX_EPOCH; @@ -46,7 +46,7 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil image_ranges.push(image.clone()); imgs.push(img); image_ids.push(image_id); - last_checkeds.push(last_checked); + expires_ats.push(expires_at); } } @@ -73,12 +73,12 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil let mut tag = img.tag.as_ref().map(|x| file.content[x.clone()].to_string()); let image_name = &file.content[img.image.clone()]; let image_id = image_ids[i]; - let last_checked = last_checkeds[i]; + let expires_at = expires_ats[i]; println!("Checking image {}", &file.content[image_ranges[i].clone()]); metrics::get().images_checked.with_label_values(&[registry]).inc(); - let cache_stale = *now - last_checked > cache_max_age; + let cache_stale = *now > expires_at; let cached_tags: Vec<String> = db.get_tags_sorted(image_id); @@ -102,24 +102,26 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil for gone in existing { db.delete_tag(image_id, gone); } - db.update_last_checked(image_id, now); + let new_expires_at = *now + cache_max_age; + db.set_expires_at(image_id, &new_expires_at); // @CLEANUP: Propagate the update to other instances. We should really avoid // this situation in the first place for j in (i + 1)..image_ids.len() { if image_ids[j] == image_id { - last_checkeds[j] = *now; + expires_ats[j] = new_expires_at; } } Ok((fetched_tags, None)) } None => { - db.update_last_checked(image_id, now); + let new_expires_at = *now + cache_max_age; + db.set_expires_at(image_id, &new_expires_at); // @CLEANUP: Propagate the update to other instances. We should really avoid // this situation in the first place for j in (i + 1)..image_ids.len() { if image_ids[j] == image_id { - last_checkeds[j] = *now; + expires_ats[j] = new_expires_at; } } Err(format!("image not found: {}", image_name)) @@ -227,10 +229,10 @@ mod tests { let db = StubDb::default(); let reg = StubRegistry::default(); - let old = now - chrono::Duration::days(2); - let id = db.insert_image("registry.hub.docker.com", "nginx", &old); - db.insert_tag(id, "1.20", &old); - db.insert_tag(id, "1.21", &old); + let past_expiry = now - chrono::Duration::days(1); + let id = db.insert_image("registry.hub.docker.com", "nginx", &past_expiry); + db.insert_tag(id, "1.20", &past_expiry); + db.insert_tag(id, "1.21", &past_expiry); reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); @@ -243,8 +245,8 @@ mod tests { update_images(&now, &db, ®, &files, &mut outcomes); assert_eq!(db.get_tags_sorted(id), vec!["1.21", "1.22"]); - let (_, last_checked) = db.get_image("registry.hub.docker.com", "nginx").unwrap(); - assert_eq!(last_checked, now); + let (_, expires_at) = db.get_image("registry.hub.docker.com", "nginx").unwrap(); + assert!(expires_at > now); } #[test] @@ -254,9 +256,9 @@ mod tests { let db = StubDb::default(); let reg = StubRegistry::default(); - let recent = now - chrono::Duration::minutes(30); - let id = db.insert_image("registry.hub.docker.com", "nginx", &recent); - db.insert_tag(id, "1.21", &recent); + let future_expiry = now + chrono::Duration::minutes(30); + let id = db.insert_image("registry.hub.docker.com", "nginx", &future_expiry); + db.insert_tag(id, "1.21", &now); let files = vec![FileInput { path: "/test".into(), @@ -361,10 +363,10 @@ mod tests { let db = StubDb::default(); let reg = StubRegistry::default(); - let recent = now - chrono::Duration::minutes(30); - let id = db.insert_image("registry.hub.docker.com", "nginx", &recent); - db.insert_tag(id, "1.21", &recent); - db.update_tag_digest(id, "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000003", &recent); + let future_expiry = now + chrono::Duration::minutes(30); + let id = db.insert_image("registry.hub.docker.com", "nginx", &future_expiry); + db.insert_tag(id, "1.21", &now); + db.update_tag_digest(id, "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000003", &now); let files = vec![FileInput { path: "/test".into(), @@ -484,8 +486,8 @@ mod tests { assert!(outcomes[0].is_err()); assert!(outcomes[0].as_ref().unwrap_err().contains("image not found")); - let (_, last_checked) = db.get_image("registry.hub.docker.com", "nginx").unwrap(); - assert_eq!(last_checked, now); + let (_, expires_at) = db.get_image("registry.hub.docker.com", "nginx").unwrap(); + assert!(expires_at > now); } #[test] @@ -593,10 +595,10 @@ mod tests { let db = StubDb::default(); let reg = StubRegistry::default(); - let old = now - chrono::Duration::days(2); - let id = db.insert_image("registry.hub.docker.com", "nginx", &old); - db.insert_tag(id, "1.21", &old); - db.update_tag_digest(id, "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000003", &old); + let past_expiry = now - chrono::Duration::days(1); + let id = db.insert_image("registry.hub.docker.com", "nginx", &past_expiry); + db.insert_tag(id, "1.21", &past_expiry); + db.update_tag_digest(id, "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000003", &past_expiry); reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000005"); |
