From b9987eeb6c5ad9a4c64bd2a140dbe339e16bdf62 Mon Sep 17 00:00:00 2001 From: huyinhou Date: Thu, 29 Dec 2022 18:27:08 +0800 Subject: [PATCH] fix allDevices map data race --- pkg/kubelet/cm/devicemanager/manager.go | 2 +- pkg/kubelet/cm/devicemanager/topology_hints.go | 8 +++++++- pkg/kubelet/cm/devicemanager/topology_hints_test.go | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/cm/devicemanager/manager.go b/pkg/kubelet/cm/devicemanager/manager.go index 8cb57aa8190..5c3e4ddee0a 100644 --- a/pkg/kubelet/cm/devicemanager/manager.go +++ b/pkg/kubelet/cm/devicemanager/manager.go @@ -646,7 +646,7 @@ func (m *ManagerImpl) devicesToAllocate(podUID, contName, resource string, requi func (m *ManagerImpl) filterByAffinity(podUID, contName, resource string, available sets.String) (sets.String, sets.String, sets.String) { // If alignment information is not available, just pass the available list back. hint := m.topologyAffinityStore.GetAffinity(podUID, contName) - if !m.deviceHasTopologyAlignment(resource) || hint.NUMANodeAffinity == nil { + if !m.deviceHasTopologyAlignmentLocked(resource) || hint.NUMANodeAffinity == nil { return sets.NewString(), sets.NewString(), available } diff --git a/pkg/kubelet/cm/devicemanager/topology_hints.go b/pkg/kubelet/cm/devicemanager/topology_hints.go index d45f45c1143..e32d97c4adb 100644 --- a/pkg/kubelet/cm/devicemanager/topology_hints.go +++ b/pkg/kubelet/cm/devicemanager/topology_hints.go @@ -136,7 +136,7 @@ func (m *ManagerImpl) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymana return deviceHints } -func (m *ManagerImpl) deviceHasTopologyAlignment(resource string) bool { +func (m *ManagerImpl) deviceHasTopologyAlignmentLocked(resource string) bool { // If any device has Topology NUMANodes available, we assume they care about alignment. for _, device := range m.allDevices[resource] { if device.Topology != nil && len(device.Topology.Nodes) > 0 { @@ -146,6 +146,12 @@ func (m *ManagerImpl) deviceHasTopologyAlignment(resource string) bool { return false } +func (m *ManagerImpl) deviceHasTopologyAlignment(resource string) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + return m.deviceHasTopologyAlignmentLocked(resource) +} + func (m *ManagerImpl) getAvailableDevices(resource string) sets.String { m.mutex.Lock() defer m.mutex.Unlock() diff --git a/pkg/kubelet/cm/devicemanager/topology_hints_test.go b/pkg/kubelet/cm/devicemanager/topology_hints_test.go index a7bc5157366..33becf9febf 100644 --- a/pkg/kubelet/cm/devicemanager/topology_hints_test.go +++ b/pkg/kubelet/cm/devicemanager/topology_hints_test.go @@ -456,7 +456,7 @@ func TestTopologyAlignedAllocation(t *testing.T) { } alignment := make(map[int]int) - if m.deviceHasTopologyAlignment(tc.resource) { + if m.deviceHasTopologyAlignmentLocked(tc.resource) { for d := range allocated { if m.allDevices[tc.resource][d].Topology != nil { alignment[int(m.allDevices[tc.resource][d].Topology.Nodes[0].ID)]++