mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #130186 from tallclair/resize-status-cache
Move PodResizeStatus cache out of allocated state
This commit is contained in:
		@@ -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),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -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), "")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user