From 58f3554ebe67c22a9b3170528df95baa9264c80f Mon Sep 17 00:00:00 2001 From: Kevin Klues Date: Tue, 5 Nov 2019 13:00:20 +0000 Subject: [PATCH] Sync all CPU and device state before generating TopologyHints for them This ensures that we have the most up-to-date state when generating topology hints for a container. Without this, it's possible that some resources will be seen as allocated, when they are actually free. --- pkg/kubelet/cm/cpumanager/cpu_manager.go | 2 ++ pkg/kubelet/cm/devicemanager/topology_hints.go | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go index ac8a009ae05..69d3a0a0519 100644 --- a/pkg/kubelet/cm/cpumanager/cpu_manager.go +++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go @@ -229,6 +229,8 @@ func (m *manager) State() state.Reader { } func (m *manager) GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]topologymanager.TopologyHint { + // Garbage collect any stranded resources before providing TopologyHints + m.removeStaleState() // Delegate to active policy return m.policy.GetTopologyHints(m.state, pod, container) } diff --git a/pkg/kubelet/cm/devicemanager/topology_hints.go b/pkg/kubelet/cm/devicemanager/topology_hints.go index 8fbeff4858a..4b6fcdb95c2 100644 --- a/pkg/kubelet/cm/devicemanager/topology_hints.go +++ b/pkg/kubelet/cm/devicemanager/topology_hints.go @@ -28,8 +28,10 @@ import ( // ensures the Device Manager is consulted when Topology Aware Hints for each // container are created. func (m *ManagerImpl) GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]topologymanager.TopologyHint { - deviceHints := make(map[string][]topologymanager.TopologyHint) + // Garbage collect any stranded device resources before providing TopologyHints + m.updateAllocatedDevices(m.activePods()) + deviceHints := make(map[string][]topologymanager.TopologyHint) for resourceObj, requestedObj := range container.Resources.Limits { resource := string(resourceObj) requested := int(requestedObj.Value()) @@ -66,8 +68,6 @@ func (m *ManagerImpl) deviceHasTopologyAlignment(resource string) bool { } func (m *ManagerImpl) getAvailableDevices(resource string) sets.String { - // Gets Devices in use. - m.updateAllocatedDevices(m.activePods()) // Strip all devices in use from the list of healthy ones. return m.healthyDevices[resource].Difference(m.allocatedDevices[resource]) }