diff --git a/pkg/kubelet/status/fake_status_manager.go b/pkg/kubelet/status/fake_status_manager.go index c99acf31a2f..8800fb01d48 100644 --- a/pkg/kubelet/status/fake_status_manager.go +++ b/pkg/kubelet/status/fake_status_manager.go @@ -28,7 +28,8 @@ import ( ) type fakeManager struct { - state state.State + state state.State + podResizeStatuses map[types.UID]v1.PodResizeStatus } func (m *fakeManager) Start() { @@ -72,7 +73,7 @@ func (m *fakeManager) GetContainerResourceAllocation(podUID string, containerNam } func (m *fakeManager) GetPodResizeStatus(podUID types.UID) v1.PodResizeStatus { - return m.state.GetPodResizeStatus(string(podUID)) + return m.podResizeStatuses[podUID] } func (m *fakeManager) UpdatePodFromAllocation(pod *v1.Pod) (*v1.Pod, bool) { @@ -102,12 +103,13 @@ func (m *fakeManager) SetPodAllocation(pod *v1.Pod) error { } func (m *fakeManager) SetPodResizeStatus(podUID types.UID, resizeStatus v1.PodResizeStatus) { - m.state.SetPodResizeStatus(string(podUID), resizeStatus) + m.podResizeStatuses[podUID] = resizeStatus } // NewFakeManager creates empty/fake memory manager func NewFakeManager() Manager { return &fakeManager{ - state: state.NewStateMemory(state.PodResourceAllocation{}), + state: state.NewStateMemory(state.PodResourceAllocation{}), + podResizeStatuses: make(map[types.UID]v1.PodResizeStatus), } } diff --git a/pkg/kubelet/status/state/state.go b/pkg/kubelet/status/state/state.go index 6fcd784ef1c..5f63b0466fc 100644 --- a/pkg/kubelet/status/state/state.go +++ b/pkg/kubelet/status/state/state.go @@ -42,13 +42,11 @@ func (pr PodResourceAllocation) Clone() PodResourceAllocation { type Reader interface { GetContainerResourceAllocation(podUID string, containerName string) (v1.ResourceRequirements, bool) GetPodResourceAllocation() PodResourceAllocation - GetPodResizeStatus(podUID string) v1.PodResizeStatus } type writer interface { SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error SetPodResourceAllocation(podUID string, alloc map[string]v1.ResourceRequirements) error - SetPodResizeStatus(podUID string, resizeStatus v1.PodResizeStatus) Delete(podUID string, containerName string) error } diff --git a/pkg/kubelet/status/state/state_checkpoint.go b/pkg/kubelet/status/state/state_checkpoint.go index 8a37da184e3..78ca388958d 100644 --- a/pkg/kubelet/status/state/state_checkpoint.go +++ b/pkg/kubelet/status/state/state_checkpoint.go @@ -112,13 +112,6 @@ func (sc *stateCheckpoint) GetPodResourceAllocation() PodResourceAllocation { return sc.cache.GetPodResourceAllocation() } -// GetPodResizeStatus returns the last resize decision for a pod -func (sc *stateCheckpoint) GetPodResizeStatus(podUID string) v1.PodResizeStatus { - sc.mux.RLock() - defer sc.mux.RUnlock() - return sc.cache.GetPodResizeStatus(podUID) -} - // SetContainerResourceAllocation sets resources allocated to a pod's container func (sc *stateCheckpoint) SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error { sc.mux.Lock() @@ -138,13 +131,6 @@ func (sc *stateCheckpoint) SetPodResourceAllocation(podUID string, alloc map[str return sc.storeState() } -// SetPodResizeStatus sets the last resize decision for a pod -func (sc *stateCheckpoint) SetPodResizeStatus(podUID string, resizeStatus v1.PodResizeStatus) { - sc.mux.Lock() - defer sc.mux.Unlock() - sc.cache.SetPodResizeStatus(podUID, resizeStatus) -} - // Delete deletes allocations for specified pod func (sc *stateCheckpoint) Delete(podUID string, containerName string) error { sc.mux.Lock() @@ -168,10 +154,6 @@ func (sc *noopStateCheckpoint) GetPodResourceAllocation() PodResourceAllocation return nil } -func (sc *noopStateCheckpoint) GetPodResizeStatus(_ string) v1.PodResizeStatus { - return "" -} - func (sc *noopStateCheckpoint) SetContainerResourceAllocation(_ string, _ string, _ v1.ResourceRequirements) error { return nil } @@ -180,8 +162,6 @@ func (sc *noopStateCheckpoint) SetPodResourceAllocation(_ string, _ map[string]v return nil } -func (sc *noopStateCheckpoint) SetPodResizeStatus(_ string, _ v1.PodResizeStatus) {} - func (sc *noopStateCheckpoint) Delete(_ string, _ string) error { return nil } diff --git a/pkg/kubelet/status/state/state_mem.go b/pkg/kubelet/status/state/state_mem.go index 8ed47872755..fd65d119d12 100644 --- a/pkg/kubelet/status/state/state_mem.go +++ b/pkg/kubelet/status/state/state_mem.go @@ -25,8 +25,7 @@ import ( type stateMemory struct { sync.RWMutex - podAllocation PodResourceAllocation - podResizeStatus PodResizeStatus + podAllocation PodResourceAllocation } var _ State = &stateMemory{} @@ -38,8 +37,7 @@ func NewStateMemory(alloc PodResourceAllocation) State { } klog.V(2).InfoS("Initialized new in-memory state store for pod resource allocation tracking") return &stateMemory{ - podAllocation: alloc, - podResizeStatus: PodResizeStatus{}, + podAllocation: alloc, } } @@ -57,13 +55,6 @@ func (s *stateMemory) GetPodResourceAllocation() PodResourceAllocation { return s.podAllocation.Clone() } -func (s *stateMemory) GetPodResizeStatus(podUID string) v1.PodResizeStatus { - s.RLock() - defer s.RUnlock() - - return s.podResizeStatus[podUID] -} - func (s *stateMemory) SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error { s.Lock() defer s.Unlock() @@ -86,23 +77,10 @@ func (s *stateMemory) SetPodResourceAllocation(podUID string, alloc map[string]v return nil } -func (s *stateMemory) SetPodResizeStatus(podUID string, resizeStatus v1.PodResizeStatus) { - s.Lock() - defer s.Unlock() - - if resizeStatus != "" { - s.podResizeStatus[podUID] = resizeStatus - } else { - delete(s.podResizeStatus, podUID) - } - klog.V(3).InfoS("Updated pod resize state", "podUID", podUID, "resizeStatus", resizeStatus) -} - func (s *stateMemory) deleteContainer(podUID string, containerName string) { delete(s.podAllocation[podUID], containerName) if len(s.podAllocation[podUID]) == 0 { delete(s.podAllocation, podUID) - delete(s.podResizeStatus, podUID) } klog.V(3).InfoS("Deleted pod resource allocation", "podUID", podUID, "containerName", containerName) } @@ -112,7 +90,6 @@ func (s *stateMemory) Delete(podUID string, containerName string) error { defer s.Unlock() if len(containerName) == 0 { delete(s.podAllocation, podUID) - delete(s.podResizeStatus, podUID) klog.V(3).InfoS("Deleted pod resource allocation and resize state", "podUID", podUID) return nil } diff --git a/pkg/kubelet/status/status_manager.go b/pkg/kubelet/status/status_manager.go index e6f89b1f627..3f50af2b4fc 100644 --- a/pkg/kubelet/status/status_manager.go +++ b/pkg/kubelet/status/status_manager.go @@ -72,9 +72,10 @@ type manager struct { kubeClient clientset.Interface podManager PodManager // Map from pod UID to sync status of the corresponding pod. - podStatuses map[types.UID]versionedPodStatus - podStatusesLock sync.RWMutex - podStatusChannel chan struct{} + podStatuses map[types.UID]versionedPodStatus + podResizeStatuses map[types.UID]v1.PodResizeStatus + podStatusesLock sync.RWMutex + podStatusChannel chan struct{} // Map from (mirror) pod UID to latest status version successfully sent to the API server. // apiStatusVersions must only be accessed from the sync thread. apiStatusVersions map[kubetypes.MirrorPodUID]uint64 @@ -174,6 +175,7 @@ func NewManager(kubeClient clientset.Interface, podManager PodManager, podDeleti kubeClient: kubeClient, podManager: podManager, podStatuses: make(map[types.UID]versionedPodStatus), + podResizeStatuses: make(map[types.UID]v1.PodResizeStatus), podStatusChannel: make(chan struct{}, 1), apiStatusVersions: make(map[kubetypes.MirrorPodUID]uint64), podDeletionSafety: podDeletionSafety, @@ -303,7 +305,7 @@ func updatePodFromAllocation(pod *v1.Pod, allocs state.PodResourceAllocation) (* func (m *manager) GetPodResizeStatus(podUID types.UID) v1.PodResizeStatus { m.podStatusesLock.RLock() defer m.podStatusesLock.RUnlock() - return m.state.GetPodResizeStatus(string(podUID)) + return m.podResizeStatuses[podUID] } // SetPodAllocation checkpoints the resources allocated to a pod's containers @@ -331,9 +333,9 @@ func (m *manager) SetPodAllocation(pod *v1.Pod) error { // SetPodResizeStatus checkpoints the last resizing decision for the pod. func (m *manager) SetPodResizeStatus(podUID types.UID, resizeStatus v1.PodResizeStatus) { - m.podStatusesLock.RLock() - defer m.podStatusesLock.RUnlock() - m.state.SetPodResizeStatus(string(podUID), resizeStatus) + m.podStatusesLock.Lock() + defer m.podStatusesLock.Unlock() + m.podResizeStatuses[podUID] = resizeStatus } func (m *manager) GetPodStatus(uid types.UID) (v1.PodStatus, bool) { @@ -803,6 +805,7 @@ func (m *manager) deletePodStatus(uid types.UID) { delete(m.podStatuses, uid) m.podStartupLatencyHelper.DeletePodStartupState(uid) if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { + delete(m.podResizeStatuses, uid) m.state.Delete(string(uid), "") } } @@ -816,6 +819,7 @@ func (m *manager) RemoveOrphanedStatuses(podUIDs map[types.UID]bool) { klog.V(5).InfoS("Removing pod from status map.", "podUID", key) delete(m.podStatuses, key) if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { + delete(m.podResizeStatuses, key) m.state.Delete(string(key), "") } }