Add image cache.
This commit is contained in:
parent
6b9a944285
commit
816f867c62
@ -89,6 +89,31 @@ type realImageGCManager struct {
|
|||||||
|
|
||||||
// Track initialization
|
// Track initialization
|
||||||
initialized bool
|
initialized bool
|
||||||
|
|
||||||
|
// imageCache is the cache of latest image list.
|
||||||
|
imageCache imageCache
|
||||||
|
}
|
||||||
|
|
||||||
|
// imageCache caches latest result of ListImages.
|
||||||
|
type imageCache struct {
|
||||||
|
// sync.RWMutex is the mutex protects the image cache.
|
||||||
|
sync.RWMutex
|
||||||
|
// images is the image cache.
|
||||||
|
images []kubecontainer.Image
|
||||||
|
}
|
||||||
|
|
||||||
|
// set updates image cache.
|
||||||
|
func (i *imageCache) set(images []kubecontainer.Image) {
|
||||||
|
i.Lock()
|
||||||
|
defer i.Unlock()
|
||||||
|
i.images = images
|
||||||
|
}
|
||||||
|
|
||||||
|
// get gets image list from image cache.
|
||||||
|
func (i *imageCache) get() []kubecontainer.Image {
|
||||||
|
i.RLock()
|
||||||
|
defer i.RUnlock()
|
||||||
|
return i.images
|
||||||
}
|
}
|
||||||
|
|
||||||
// Information about the images we track.
|
// Information about the images we track.
|
||||||
@ -142,16 +167,23 @@ func (im *realImageGCManager) Start() error {
|
|||||||
}
|
}
|
||||||
}, 5*time.Minute, wait.NeverStop)
|
}, 5*time.Minute, wait.NeverStop)
|
||||||
|
|
||||||
|
// Start a goroutine periodically updates image cache.
|
||||||
|
// TODO(random-liu): Merge this with the previous loop.
|
||||||
|
go wait.Until(func() {
|
||||||
|
images, err := im.runtime.ListImages()
|
||||||
|
if err != nil {
|
||||||
|
glog.Warningf("[imageGCManager] Failed to update image list: %v", err)
|
||||||
|
} else {
|
||||||
|
im.imageCache.set(images)
|
||||||
|
}
|
||||||
|
}, 30*time.Second, wait.NeverStop)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a list of images on this node
|
// Get a list of images on this node
|
||||||
func (im *realImageGCManager) GetImageList() ([]kubecontainer.Image, error) {
|
func (im *realImageGCManager) GetImageList() ([]kubecontainer.Image, error) {
|
||||||
images, err := im.runtime.ListImages()
|
return im.imageCache.get(), nil
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return images, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (im *realImageGCManager) detectImages(detectTime time.Time) error {
|
func (im *realImageGCManager) detectImages(detectTime time.Time) error {
|
||||||
|
@ -84,6 +84,17 @@ const (
|
|||||||
maxImgSize int64 = 1000 * 1024 * 1024
|
maxImgSize int64 = 1000 * 1024 * 1024
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// fakeImageGCManager is a fake image gc manager for testing. It will return image
|
||||||
|
// list from fake runtime directly instead of caching it.
|
||||||
|
type fakeImageGCManager struct {
|
||||||
|
fakeImageService kubecontainer.ImageService
|
||||||
|
images.ImageGCManager
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeImageGCManager) GetImageList() ([]kubecontainer.Image, error) {
|
||||||
|
return f.fakeImageService.ListImages()
|
||||||
|
}
|
||||||
|
|
||||||
type TestKubelet struct {
|
type TestKubelet struct {
|
||||||
kubelet *Kubelet
|
kubelet *Kubelet
|
||||||
fakeRuntime *containertest.FakeRuntime
|
fakeRuntime *containertest.FakeRuntime
|
||||||
@ -188,7 +199,12 @@ func newTestKubeletWithImageList(
|
|||||||
HighThresholdPercent: 90,
|
HighThresholdPercent: 90,
|
||||||
LowThresholdPercent: 80,
|
LowThresholdPercent: 80,
|
||||||
}
|
}
|
||||||
kubelet.imageManager, err = images.NewImageGCManager(fakeRuntime, mockCadvisor, fakeRecorder, fakeNodeRef, fakeImageGCPolicy)
|
imageGCManager, err := images.NewImageGCManager(fakeRuntime, mockCadvisor, fakeRecorder, fakeNodeRef, fakeImageGCPolicy)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
kubelet.imageManager = &fakeImageGCManager{
|
||||||
|
fakeImageService: fakeRuntime,
|
||||||
|
ImageGCManager: imageGCManager,
|
||||||
|
}
|
||||||
fakeClock := clock.NewFakeClock(time.Now())
|
fakeClock := clock.NewFakeClock(time.Now())
|
||||||
kubelet.backOff = flowcontrol.NewBackOff(time.Second, time.Minute)
|
kubelet.backOff = flowcontrol.NewBackOff(time.Second, time.Minute)
|
||||||
kubelet.backOff.Clock = fakeClock
|
kubelet.backOff.Clock = fakeClock
|
||||||
|
Loading…
Reference in New Issue
Block a user