Move PodResizeStatus cache out of allocated state

This commit is contained in:
Tim Allclair 2025-02-14 15:03:37 -08:00
parent 9a2a278a20
commit 3f4ef42e9a
5 changed files with 19 additions and 58 deletions

View File

@ -29,6 +29,7 @@ import (
type fakeManager struct { type fakeManager struct {
state state.State state state.State
podResizeStatuses map[types.UID]v1.PodResizeStatus
} }
func (m *fakeManager) Start() { func (m *fakeManager) Start() {
@ -72,7 +73,7 @@ func (m *fakeManager) GetContainerResourceAllocation(podUID string, containerNam
} }
func (m *fakeManager) GetPodResizeStatus(podUID types.UID) v1.PodResizeStatus { 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) { 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) { 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 // NewFakeManager creates empty/fake memory manager
func NewFakeManager() Manager { func NewFakeManager() Manager {
return &fakeManager{ return &fakeManager{
state: state.NewStateMemory(state.PodResourceAllocation{}), state: state.NewStateMemory(state.PodResourceAllocation{}),
podResizeStatuses: make(map[types.UID]v1.PodResizeStatus),
} }
} }

View File

@ -42,13 +42,11 @@ func (pr PodResourceAllocation) Clone() PodResourceAllocation {
type Reader interface { type Reader interface {
GetContainerResourceAllocation(podUID string, containerName string) (v1.ResourceRequirements, bool) GetContainerResourceAllocation(podUID string, containerName string) (v1.ResourceRequirements, bool)
GetPodResourceAllocation() PodResourceAllocation GetPodResourceAllocation() PodResourceAllocation
GetPodResizeStatus(podUID string) v1.PodResizeStatus
} }
type writer interface { type writer interface {
SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error
SetPodResourceAllocation(podUID string, alloc map[string]v1.ResourceRequirements) error SetPodResourceAllocation(podUID string, alloc map[string]v1.ResourceRequirements) error
SetPodResizeStatus(podUID string, resizeStatus v1.PodResizeStatus)
Delete(podUID string, containerName string) error Delete(podUID string, containerName string) error
} }

View File

@ -112,13 +112,6 @@ func (sc *stateCheckpoint) GetPodResourceAllocation() PodResourceAllocation {
return sc.cache.GetPodResourceAllocation() 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 // SetContainerResourceAllocation sets resources allocated to a pod's container
func (sc *stateCheckpoint) SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error { func (sc *stateCheckpoint) SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error {
sc.mux.Lock() sc.mux.Lock()
@ -138,13 +131,6 @@ func (sc *stateCheckpoint) SetPodResourceAllocation(podUID string, alloc map[str
return sc.storeState() 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 // Delete deletes allocations for specified pod
func (sc *stateCheckpoint) Delete(podUID string, containerName string) error { func (sc *stateCheckpoint) Delete(podUID string, containerName string) error {
sc.mux.Lock() sc.mux.Lock()
@ -168,10 +154,6 @@ func (sc *noopStateCheckpoint) GetPodResourceAllocation() PodResourceAllocation
return nil return nil
} }
func (sc *noopStateCheckpoint) GetPodResizeStatus(_ string) v1.PodResizeStatus {
return ""
}
func (sc *noopStateCheckpoint) SetContainerResourceAllocation(_ string, _ string, _ v1.ResourceRequirements) error { func (sc *noopStateCheckpoint) SetContainerResourceAllocation(_ string, _ string, _ v1.ResourceRequirements) error {
return nil return nil
} }
@ -180,8 +162,6 @@ func (sc *noopStateCheckpoint) SetPodResourceAllocation(_ string, _ map[string]v
return nil return nil
} }
func (sc *noopStateCheckpoint) SetPodResizeStatus(_ string, _ v1.PodResizeStatus) {}
func (sc *noopStateCheckpoint) Delete(_ string, _ string) error { func (sc *noopStateCheckpoint) Delete(_ string, _ string) error {
return nil return nil
} }

View File

@ -26,7 +26,6 @@ import (
type stateMemory struct { type stateMemory struct {
sync.RWMutex sync.RWMutex
podAllocation PodResourceAllocation podAllocation PodResourceAllocation
podResizeStatus PodResizeStatus
} }
var _ State = &stateMemory{} var _ State = &stateMemory{}
@ -39,7 +38,6 @@ func NewStateMemory(alloc PodResourceAllocation) State {
klog.V(2).InfoS("Initialized new in-memory state store for pod resource allocation tracking") klog.V(2).InfoS("Initialized new in-memory state store for pod resource allocation tracking")
return &stateMemory{ return &stateMemory{
podAllocation: alloc, podAllocation: alloc,
podResizeStatus: PodResizeStatus{},
} }
} }
@ -57,13 +55,6 @@ func (s *stateMemory) GetPodResourceAllocation() PodResourceAllocation {
return s.podAllocation.Clone() 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 { func (s *stateMemory) SetContainerResourceAllocation(podUID string, containerName string, alloc v1.ResourceRequirements) error {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -86,23 +77,10 @@ func (s *stateMemory) SetPodResourceAllocation(podUID string, alloc map[string]v
return nil 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) { func (s *stateMemory) deleteContainer(podUID string, containerName string) {
delete(s.podAllocation[podUID], containerName) delete(s.podAllocation[podUID], containerName)
if len(s.podAllocation[podUID]) == 0 { if len(s.podAllocation[podUID]) == 0 {
delete(s.podAllocation, podUID) delete(s.podAllocation, podUID)
delete(s.podResizeStatus, podUID)
} }
klog.V(3).InfoS("Deleted pod resource allocation", "podUID", podUID, "containerName", containerName) 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() defer s.Unlock()
if len(containerName) == 0 { if len(containerName) == 0 {
delete(s.podAllocation, podUID) delete(s.podAllocation, podUID)
delete(s.podResizeStatus, podUID)
klog.V(3).InfoS("Deleted pod resource allocation and resize state", "podUID", podUID) klog.V(3).InfoS("Deleted pod resource allocation and resize state", "podUID", podUID)
return nil return nil
} }

View File

@ -73,6 +73,7 @@ type manager struct {
podManager PodManager podManager PodManager
// Map from pod UID to sync status of the corresponding pod. // Map from pod UID to sync status of the corresponding pod.
podStatuses map[types.UID]versionedPodStatus podStatuses map[types.UID]versionedPodStatus
podResizeStatuses map[types.UID]v1.PodResizeStatus
podStatusesLock sync.RWMutex podStatusesLock sync.RWMutex
podStatusChannel chan struct{} podStatusChannel chan struct{}
// Map from (mirror) pod UID to latest status version successfully sent to the API server. // Map from (mirror) pod UID to latest status version successfully sent to the API server.
@ -174,6 +175,7 @@ func NewManager(kubeClient clientset.Interface, podManager PodManager, podDeleti
kubeClient: kubeClient, kubeClient: kubeClient,
podManager: podManager, podManager: podManager,
podStatuses: make(map[types.UID]versionedPodStatus), podStatuses: make(map[types.UID]versionedPodStatus),
podResizeStatuses: make(map[types.UID]v1.PodResizeStatus),
podStatusChannel: make(chan struct{}, 1), podStatusChannel: make(chan struct{}, 1),
apiStatusVersions: make(map[kubetypes.MirrorPodUID]uint64), apiStatusVersions: make(map[kubetypes.MirrorPodUID]uint64),
podDeletionSafety: podDeletionSafety, podDeletionSafety: podDeletionSafety,
@ -303,7 +305,7 @@ func updatePodFromAllocation(pod *v1.Pod, allocs state.PodResourceAllocation) (*
func (m *manager) GetPodResizeStatus(podUID types.UID) v1.PodResizeStatus { func (m *manager) GetPodResizeStatus(podUID types.UID) v1.PodResizeStatus {
m.podStatusesLock.RLock() m.podStatusesLock.RLock()
defer m.podStatusesLock.RUnlock() defer m.podStatusesLock.RUnlock()
return m.state.GetPodResizeStatus(string(podUID)) return m.podResizeStatuses[podUID]
} }
// SetPodAllocation checkpoints the resources allocated to a pod's containers // 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. // SetPodResizeStatus checkpoints the last resizing decision for the pod.
func (m *manager) SetPodResizeStatus(podUID types.UID, resizeStatus v1.PodResizeStatus) { func (m *manager) SetPodResizeStatus(podUID types.UID, resizeStatus v1.PodResizeStatus) {
m.podStatusesLock.RLock() m.podStatusesLock.Lock()
defer m.podStatusesLock.RUnlock() defer m.podStatusesLock.Unlock()
m.state.SetPodResizeStatus(string(podUID), resizeStatus) m.podResizeStatuses[podUID] = resizeStatus
} }
func (m *manager) GetPodStatus(uid types.UID) (v1.PodStatus, bool) { 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) delete(m.podStatuses, uid)
m.podStartupLatencyHelper.DeletePodStartupState(uid) m.podStartupLatencyHelper.DeletePodStartupState(uid)
if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) {
delete(m.podResizeStatuses, uid)
m.state.Delete(string(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) klog.V(5).InfoS("Removing pod from status map.", "podUID", key)
delete(m.podStatuses, key) delete(m.podStatuses, key)
if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) {
delete(m.podResizeStatuses, key)
m.state.Delete(string(key), "") m.state.Delete(string(key), "")
} }
} }