From a25d3ea79272bee5591066542a4d29e7c401a8f3 Mon Sep 17 00:00:00 2001 From: Seth Hoenig Date: Mon, 13 Mar 2023 17:00:17 -0500 Subject: [PATCH] cgv1: do not disable cpuset manager if reserved interface already exists (#16467) * cgv1: do not disable cpuset manager if reserved interface already exists This PR fixes a bug where restarting a Nomad Client on a machine using cgroups v1 (e.g. Ubuntu 20.04) would cause the cpuset cgroups manager to disable itself. This is being caused by incorrectly interpreting a "file exists" error as problematic when ensuring the reserved cpuset exists. If we get a "file exists" error, that just means the Client was likely restarted. Note that a machine reboot would fix the issue - the groups interfaces are ephemoral. * cl: add cl --- .changelog/16467.txt | 3 +++ client/lib/cgutil/cpuset_manager_v1.go | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .changelog/16467.txt diff --git a/.changelog/16467.txt b/.changelog/16467.txt new file mode 100644 index 000000000..317bbe11c --- /dev/null +++ b/.changelog/16467.txt @@ -0,0 +1,3 @@ +```release-note:bug +client: Fixed a bug where cpuset initialization fails after Client restart +``` diff --git a/client/lib/cgutil/cpuset_manager_v1.go b/client/lib/cgutil/cpuset_manager_v1.go index f0ba00adb..1f02d15d3 100644 --- a/client/lib/cgutil/cpuset_manager_v1.go +++ b/client/lib/cgutil/cpuset_manager_v1.go @@ -4,6 +4,7 @@ package cgutil import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -59,8 +60,10 @@ func NewCpusetManagerV1(cgroupParent string, _ []uint16, logger hclog.Logger) Cp // ensure the reserved cpuset exists, but only copy the mems from the parent if creating the cgroup if err = os.Mkdir(filepath.Join(cgroupParentPath, ReservedCpusetCgroupName), 0755); err != nil { - logger.Warn("failed to ensure reserved cpuset.cpus interface exists; disable cpuset management", "error", err) - return new(NoopCpusetManager) + if !errors.Is(err, os.ErrExist) { + logger.Warn("failed to ensure reserved cpuset.cpus interface exists; disable cpuset management", "error", err) + return new(NoopCpusetManager) + } } if err = cgroups.WriteFile(filepath.Join(cgroupParentPath, ReservedCpusetCgroupName), "cpuset.mems", parentMems); err != nil {