Fix get all pods from cgroups logic
This commit is contained in:

committed by
Vishnu kannan

parent
b86882955b
commit
a7684569fb
@@ -200,24 +200,31 @@ func (m *podContainerManagerImpl) GetAllPodsFromCgroups() (map[types.UID]CgroupN
|
||||
return nil, fmt.Errorf("failed to read the cgroup directory %v : %v", qc, err)
|
||||
}
|
||||
for i := range dirInfo {
|
||||
// note: we do a contains check because on systemd, the literal cgroupfs name will prefix the qos as well.
|
||||
if dirInfo[i].IsDir() && strings.Contains(dirInfo[i].Name(), podCgroupNamePrefix) {
|
||||
// we need to convert the name to an internal identifier
|
||||
internalName := m.cgroupManager.CgroupName(dirInfo[i].Name())
|
||||
// we then split the name on the pod prefix to determine the uid
|
||||
parts := strings.Split(string(internalName), podCgroupNamePrefix)
|
||||
// the uid is missing, so we log the unexpected cgroup not of form pod<uid>
|
||||
if len(parts) != 2 {
|
||||
location := path.Join(qc, dirInfo[i].Name())
|
||||
glog.Errorf("pod cgroup manager ignoring unexpected cgroup %v because it is not a pod", location)
|
||||
continue
|
||||
}
|
||||
podUID := parts[1]
|
||||
// because the literal cgroupfs name could encode the qos tier (on systemd), we avoid double encoding
|
||||
// by just rebuilding the fully qualified CgroupName according to our internal convention.
|
||||
cgroupName := CgroupName(path.Join(qosContainerName, podCgroupNamePrefix+podUID))
|
||||
foundPods[types.UID(podUID)] = cgroupName
|
||||
// its not a directory, so continue on...
|
||||
if !dirInfo[i].IsDir() {
|
||||
continue
|
||||
}
|
||||
// convert the concrete cgroupfs name back to an internal identifier
|
||||
// this is needed to handle path conversion for systemd environments.
|
||||
// we pass the fully qualified path so decoding can work as expected
|
||||
// since systemd encodes the path in each segment.
|
||||
cgroupfsPath := path.Join(qcConversion, dirInfo[i].Name())
|
||||
internalPath := m.cgroupManager.CgroupName(cgroupfsPath)
|
||||
// we only care about base segment of the converted path since that
|
||||
// is what we are reading currently to know if it is a pod or not.
|
||||
basePath := path.Base(string(internalPath))
|
||||
if !strings.Contains(basePath, podCgroupNamePrefix) {
|
||||
continue
|
||||
}
|
||||
// we then split the name on the pod prefix to determine the uid
|
||||
parts := strings.Split(basePath, podCgroupNamePrefix)
|
||||
// the uid is missing, so we log the unexpected cgroup not of form pod<uid>
|
||||
if len(parts) != 2 {
|
||||
glog.Errorf("pod cgroup manager ignoring unexpected cgroup %v because it is not a pod", cgroupfsPath)
|
||||
continue
|
||||
}
|
||||
podUID := parts[1]
|
||||
foundPods[types.UID(podUID)] = internalPath
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user