summaryrefslogtreecommitdiff
path: root/src/updater.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/updater.rs')
-rw-r--r--src/updater.rs58
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, &reg, &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");