mirror of https://github.com/k3s-io/k3s
Merge pull request #42778 from k82cn/sched_cache_sync
Automatic merge from submit-queue (batch tested with PRs 42762, 42739, 42425, 42778) Fixed potential OutOfSync of nodeInfo. The cloned NodeInfo still share the same resource objects in cache; it may make `requestedResource` and Pods OutOfSync, for example, if the pod was deleted, the `requestedResource` is updated by Pods are not in cloned info. Found this when investigating #32531 , but seems not the root cause, as nodeInfo are readonly in predicts & priorities. Sample codes for `&(*)`: ``` package main import ( "fmt" ) type Resource struct { A int } type Node struct { Res *Resource } func main() { r1 := &Resource { A:10 } n1 := &Node{Res: r1} r2 := &(*n1.Res) r2.A = 11 fmt.Printf("%t, %d %d\n", r1==r2, r1, r2) } ``` Output: ``` true, &{11} &{11} ```pull/6/head
commit
342ef1115c
|
@ -82,6 +82,19 @@ func (r *Resource) ResourceList() v1.ResourceList {
|
|||
return result
|
||||
}
|
||||
|
||||
func (r *Resource) Clone() *Resource {
|
||||
res := &Resource{
|
||||
MilliCPU: r.MilliCPU,
|
||||
Memory: r.Memory,
|
||||
NvidiaGPU: r.NvidiaGPU,
|
||||
}
|
||||
res.OpaqueIntResources = make(map[v1.ResourceName]int64)
|
||||
for k, v := range r.OpaqueIntResources {
|
||||
res.OpaqueIntResources[k] = v
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (r *Resource) AddOpaque(name v1.ResourceName, quantity int64) {
|
||||
r.SetOpaque(name, r.OpaqueIntResources[name]+quantity)
|
||||
}
|
||||
|
@ -190,9 +203,9 @@ func (n *NodeInfo) AllocatableResource() Resource {
|
|||
func (n *NodeInfo) Clone() *NodeInfo {
|
||||
clone := &NodeInfo{
|
||||
node: n.node,
|
||||
requestedResource: &(*n.requestedResource),
|
||||
nonzeroRequest: &(*n.nonzeroRequest),
|
||||
allocatableResource: &(*n.allocatableResource),
|
||||
requestedResource: n.requestedResource.Clone(),
|
||||
nonzeroRequest: n.nonzeroRequest.Clone(),
|
||||
allocatableResource: n.allocatableResource.Clone(),
|
||||
allowedPodNumber: n.allowedPodNumber,
|
||||
taintsErr: n.taintsErr,
|
||||
memoryPressureCondition: n.memoryPressureCondition,
|
||||
|
|
Loading…
Reference in New Issue