summaryrefslogtreecommitdiffstats
path: root/docker-api
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2018-09-25 09:35:14 +0200
committerValerij Fredriksen <valerijf@oath.com>2018-09-25 09:35:14 +0200
commit596a3ec90878c348f6c407f62c4312ad64b09605 (patch)
treefea6da6f8742732e72a0ef55f3a299de159d86f3 /docker-api
parent26f3cdd36a7ae82be08634cd507330fb1bdb2fdd (diff)
Fix immediate deleting of redownloaded image
Diffstat (limited to 'docker-api')
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollector.java21
-rw-r--r--docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollectionTest.java8
2 files changed, 20 insertions, 9 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollector.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollector.java
index 0ae6004be12..dd6ff436aae 100644
--- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollector.java
+++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollector.java
@@ -118,18 +118,21 @@ class DockerImageGarbageCollector {
else return o1.compareTo(o2);
})
- // Map image IDs to tags if there are any
- .flatMap(imageId -> {
- // Deleting an image by image ID with multiple tags will fail -> map IDs to all the tags referring to the ID
- String[] repoTags = imageByImageId.get(imageId).getRepoTags();
- return repoTags == null ? Stream.of(imageId) : Stream.of(repoTags);
- })
+ // Map back to image
+ .map(imageByImageId::get)
// Delete image, if successful also remove last usage time to prevent re-download being instantly deleted
.peek(image -> {
- logger.info("Deleting unused docker image " + image);
- docker.deleteImage(new DockerImage(image));
- lastTimeUsedByImageId.remove(image);
+ // Deleting an image by image ID with multiple tags will fail -> delete by tags instead
+ Optional.ofNullable(image.getRepoTags())
+ .map(Stream::of)
+ .orElse(Stream.of(image.getId()))
+ .forEach(imageReference -> {
+ logger.info("Deleting unused docker image " + imageReference);
+ docker.deleteImage(new DockerImage(imageReference));
+ });
+
+ lastTimeUsedByImageId.remove(image.getId());
})
.count() > 0;
}
diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollectionTest.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollectionTest.java
index 5287d2cb45d..5a6efb68d14 100644
--- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollectionTest.java
+++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImageGarbageCollectionTest.java
@@ -118,6 +118,14 @@ public class DockerImageGarbageCollectionTest {
.expectDeletedImages("image"); // 1h after re-download it is deleted again
}
+ @Test
+ public void reDownloadingImageIsNotImmediatelyDeletedWhenDeletingByTag() {
+ gcTester.withExistingImages(ImageBuilder.forId("image").withTags("image-1", "my-tag"))
+ .expectDeletedImages("image-1", "my-tag") // After 1h we delete image
+ .expectDeletedImagesAfterMinutes(0) // image is immediately re-downloaded, but is not deleted
+ .expectDeletedImagesAfterMinutes(10)
+ .expectDeletedImages("image-1", "my-tag"); // 1h after re-download it is deleted again
+ }
/** Same scenario as in {@link #multipleUnusedImagesAreIdentified()} */
@Test