mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-21 09:57:52 +00:00
Merge pull request #103299 from wgahnagl/addPinned
prevents garbage collection from removing pinned images
This commit is contained in:
@@ -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.
|
||||
|
@@ -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,
|
||||
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user