Merge pull request #103299 from wgahnagl/addPinned

prevents garbage collection from removing pinned images
This commit is contained in:
Kubernetes Prow Robot
2021-11-15 18:51:25 -08:00
committed by GitHub
7 changed files with 915 additions and 705 deletions

View File

@@ -371,6 +371,8 @@ type Image struct {
Size int64
// ImageSpec for the image which include annotations.
Spec ImageSpec
// Pin for preventing garbage collection
Pinned bool
}
// EnvVar represents the environment variable.

View File

@@ -146,6 +146,9 @@ type imageRecord struct {
// Size of the image in bytes.
size int64
// Pinned status of the image
pinned bool
}
// NewImageGCManager instantiates a new ImageGCManager object.
@@ -257,6 +260,9 @@ func (im *realImageGCManager) detectImages(detectTime time.Time) (sets.String, e
klog.V(5).InfoS("Image ID has size", "imageID", image.ID, "size", image.Size)
im.imageRecords[image.ID].size = image.Size
klog.V(5).InfoS("Image ID is pinned", "imageID", image.ID, "pinned", image.Pinned)
im.imageRecords[image.ID].pinned = image.Pinned
}
// Remove old images from our records.
@@ -345,6 +351,12 @@ func (im *realImageGCManager) freeSpace(bytesToFree int64, freeTime time.Time) (
klog.V(5).InfoS("Image ID is being used", "imageID", image)
continue
}
// Check if image is pinned, prevent garbage collection
if record.pinned {
klog.V(5).InfoS("Image is pinned, skipping garbage collection", "imageID", image)
continue
}
images = append(images, evictionInfo{
id: image,
imageRecord: *record,

View File

@@ -206,6 +206,102 @@ func TestDeleteUnusedImagesExemptSandboxImage(t *testing.T) {
require.NoError(t, err)
}
func TestDeletePinnedImage(t *testing.T) {
mockCtrl := gomock.NewController(t)
mockStatsProvider := statstest.NewMockProvider(mockCtrl)
manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{}, mockStatsProvider)
fakeRuntime.ImageList = []container.Image{
{
ID: sandboxImage,
Size: 1024,
Pinned: true,
},
{
ID: sandboxImage,
Size: 1024,
},
}
err := manager.DeleteUnusedImages()
assert := assert.New(t)
assert.Len(fakeRuntime.ImageList, 2)
require.NoError(t, err)
}
func TestDoNotDeletePinnedImage(t *testing.T) {
mockCtrl := gomock.NewController(t)
mockStatsProvider := statstest.NewMockProvider(mockCtrl)
manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{}, mockStatsProvider)
fakeRuntime.ImageList = []container.Image{
{
ID: "1",
Size: 1024,
Pinned: true,
},
{
ID: "2",
Size: 1024,
},
}
spaceFreed, err := manager.freeSpace(4096, time.Now())
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(1024, spaceFreed)
assert.Len(fakeRuntime.ImageList, 1)
}
func TestDeleteUnPinnedImage(t *testing.T) {
mockCtrl := gomock.NewController(t)
mockStatsProvider := statstest.NewMockProvider(mockCtrl)
manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{}, mockStatsProvider)
fakeRuntime.ImageList = []container.Image{
{
ID: "1",
Size: 1024,
Pinned: false,
},
{
ID: "2",
Size: 1024,
},
}
spaceFreed, err := manager.freeSpace(2048, time.Now())
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(2048, spaceFreed)
assert.Len(fakeRuntime.ImageList, 0)
}
func TestAllPinnedImages(t *testing.T) {
mockCtrl := gomock.NewController(t)
mockStatsProvider := statstest.NewMockProvider(mockCtrl)
manager, fakeRuntime := newRealImageGCManager(ImageGCPolicy{}, mockStatsProvider)
fakeRuntime.ImageList = []container.Image{
{
ID: "1",
Size: 1024,
Pinned: true,
},
{
ID: "2",
Size: 1024,
Pinned: true,
},
}
spaceFreed, err := manager.freeSpace(2048, time.Now())
assert := assert.New(t)
require.NoError(t, err)
assert.EqualValues(0, spaceFreed)
assert.Len(fakeRuntime.ImageList, 2)
}
func TestDetectImagesContainerStopped(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()