
The commit rename state structs and some fields under these structs. - NodeMap -> NUMANodeMap - NodeState -> NUMANodeState - NUMANodeState.Nodes -> NUMANodesState.Cells Signed-off-by: Artyom Lukianov <alukiano@redhat.com>
131 lines
4.4 KiB
Go
131 lines
4.4 KiB
Go
/*
|
|
Copyright 2020 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package state
|
|
|
|
import (
|
|
v1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
// MemoryTable contains memory information
|
|
type MemoryTable struct {
|
|
TotalMemSize uint64 `json:"total"`
|
|
SystemReserved uint64 `json:"systemReserved"`
|
|
Allocatable uint64 `json:"allocatable"`
|
|
Reserved uint64 `json:"reserved"`
|
|
Free uint64 `json:"free"`
|
|
}
|
|
|
|
// NUMANodeState contains NUMA node related information
|
|
type NUMANodeState struct {
|
|
// NumberOfAssignments contains a number memory assignments from this node
|
|
// When the container requires memory and hugepages it will increase number of assignments by two
|
|
NumberOfAssignments int `json:"numberOfAssignments"`
|
|
// MemoryTable contains NUMA node memory related information
|
|
MemoryMap map[v1.ResourceName]*MemoryTable `json:"memoryMap"`
|
|
// Cells contains the current NUMA node and all other nodes that are in a group with current NUMA node
|
|
// This parameter indicates if the current node is used for the multiple NUMA node memory allocation
|
|
// For example if some container has pinning 0,1,2, NUMA nodes 0,1,2 under the state will have
|
|
// this parameter equals to [0, 1, 2]
|
|
Cells []int `json:"cells"`
|
|
}
|
|
|
|
// NUMANodeMap contains memory information for each NUMA node.
|
|
type NUMANodeMap map[int]*NUMANodeState
|
|
|
|
// Clone returns a copy of NUMANodeMap
|
|
func (nm NUMANodeMap) Clone() NUMANodeMap {
|
|
clone := make(NUMANodeMap)
|
|
for node, s := range nm {
|
|
if s == nil {
|
|
clone[node] = nil
|
|
continue
|
|
}
|
|
|
|
clone[node] = &NUMANodeState{}
|
|
clone[node].NumberOfAssignments = s.NumberOfAssignments
|
|
clone[node].Cells = append([]int{}, s.Cells...)
|
|
|
|
if s.MemoryMap == nil {
|
|
continue
|
|
}
|
|
|
|
clone[node].MemoryMap = map[v1.ResourceName]*MemoryTable{}
|
|
for memoryType, memoryTable := range s.MemoryMap {
|
|
clone[node].MemoryMap[memoryType] = &MemoryTable{
|
|
Allocatable: memoryTable.Allocatable,
|
|
Free: memoryTable.Free,
|
|
Reserved: memoryTable.Reserved,
|
|
SystemReserved: memoryTable.SystemReserved,
|
|
TotalMemSize: memoryTable.TotalMemSize,
|
|
}
|
|
}
|
|
}
|
|
return clone
|
|
}
|
|
|
|
// Block is a data structure used to represent a certain amount of memory
|
|
type Block struct {
|
|
// NUMAAffinity contains the string that represents NUMA affinity bitmask
|
|
NUMAAffinity []int `json:"numaAffinity"`
|
|
Type v1.ResourceName `json:"type"`
|
|
Size uint64 `json:"size"`
|
|
}
|
|
|
|
// ContainerMemoryAssignments stores memory assignments of containers
|
|
type ContainerMemoryAssignments map[string]map[string][]Block
|
|
|
|
// Clone returns a copy of ContainerMemoryAssignments
|
|
func (as ContainerMemoryAssignments) Clone() ContainerMemoryAssignments {
|
|
clone := make(ContainerMemoryAssignments)
|
|
for pod := range as {
|
|
clone[pod] = make(map[string][]Block)
|
|
for container, blocks := range as[pod] {
|
|
clone[pod][container] = append([]Block{}, blocks...)
|
|
}
|
|
}
|
|
return clone
|
|
}
|
|
|
|
// Reader interface used to read current memory/pod assignment state
|
|
type Reader interface {
|
|
// GetMachineState returns Memory Map stored in the State
|
|
GetMachineState() NUMANodeMap
|
|
// GetMemoryBlocks returns memory assignments of a container
|
|
GetMemoryBlocks(podUID string, containerName string) []Block
|
|
// GetMemoryAssignments returns ContainerMemoryAssignments
|
|
GetMemoryAssignments() ContainerMemoryAssignments
|
|
}
|
|
|
|
type writer interface {
|
|
// SetMachineState stores NUMANodeMap in State
|
|
SetMachineState(memoryMap NUMANodeMap)
|
|
// SetMemoryBlocks stores memory assignments of a container
|
|
SetMemoryBlocks(podUID string, containerName string, blocks []Block)
|
|
// SetMemoryAssignments sets ContainerMemoryAssignments by using the passed parameter
|
|
SetMemoryAssignments(assignments ContainerMemoryAssignments)
|
|
// Delete deletes corresponding Blocks from ContainerMemoryAssignments
|
|
Delete(podUID string, containerName string)
|
|
// ClearState clears machineState and ContainerMemoryAssignments
|
|
ClearState()
|
|
}
|
|
|
|
// State interface provides methods for tracking and setting memory/pod assignment
|
|
type State interface {
|
|
Reader
|
|
writer
|
|
}
|