Update container hugepage limit when creating the container

Unit test for updating container hugepage limit
Add warning message about ignoring case.
Update error handling about hugepage size requirements

Signed-off-by: sewon.oh <sewon.oh@samsung.com>
This commit is contained in:
sewon.oh
2019-10-21 16:46:20 +09:00
parent e2f529adaf
commit 463442aa29
6 changed files with 293 additions and 6 deletions

View File

@@ -85,6 +85,24 @@ func HugePageSizeFromResourceName(name v1.ResourceName) (resource.Quantity, erro
return resource.ParseQuantity(pageSize)
}
// HugePageUnitSizeFromByteSize returns hugepage size has the format.
// `size` must be guaranteed to divisible into the largest units that can be expressed.
// <size><unit-prefix>B (1024 = "1KB", 1048576 = "1MB", etc).
func HugePageUnitSizeFromByteSize(size int64) (string, error) {
// hugePageSizeUnitList is borrowed from opencontainers/runc/libcontainer/cgroups/utils.go
var hugePageSizeUnitList = []string{"B", "KB", "MB", "GB", "TB", "PB"}
idx := 0
len := len(hugePageSizeUnitList) - 1
for size%1024 == 0 && idx < len {
size /= 1024
idx++
}
if size > 1024 && idx < len {
return "", fmt.Errorf("size: %d%s must be guaranteed to divisible into the largest units", size, hugePageSizeUnitList[idx])
}
return fmt.Sprintf("%d%s", size, hugePageSizeUnitList[idx]), nil
}
// IsOvercommitAllowed returns true if the resource is in the default
// namespace and is not hugepages.
func IsOvercommitAllowed(name v1.ResourceName) bool {

View File

@@ -21,7 +21,7 @@ import (
"reflect"
"testing"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -1398,3 +1398,47 @@ func TestNodeSelectorRequirementKeyExistsInNodeSelectorTerms(t *testing.T) {
}
}
}
func TestHugePageUnitSizeFromByteSize(t *testing.T) {
tests := []struct {
size int64
expected string
wantErr bool
}{
{
size: 1024,
expected: "1KB",
wantErr: false,
},
{
size: 33554432,
expected: "32MB",
wantErr: false,
},
{
size: 3221225472,
expected: "3GB",
wantErr: false,
},
{
size: 1024 * 1024 * 1023 * 3,
expected: "3069MB",
wantErr: true,
},
}
for _, test := range tests {
size := test.size
result, err := HugePageUnitSizeFromByteSize(size)
if err != nil {
if test.wantErr {
t.Logf("HugePageUnitSizeFromByteSize() expected error = %v", err)
} else {
t.Errorf("HugePageUnitSizeFromByteSize() error = %v, wantErr %v", err, test.wantErr)
}
continue
}
if test.expected != result {
t.Errorf("HugePageUnitSizeFromByteSize() expected %v but got %v", test.expected, result)
}
}
}