mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Bump Libcontainer to latest head
This commit is contained in:
		
							
								
								
									
										84
									
								
								vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										84
									
								
								vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,13 +16,19 @@ import (
 | 
			
		||||
	"github.com/docker/go-units"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const cgroupNamePrefix = "name="
 | 
			
		||||
const (
 | 
			
		||||
	cgroupNamePrefix = "name="
 | 
			
		||||
	CgroupProcesses  = "cgroup.procs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
 | 
			
		||||
// https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
 | 
			
		||||
func FindCgroupMountpoint(subsystem string) (string, error) {
 | 
			
		||||
	// We are not using mount.GetMounts() because it's super-inefficient,
 | 
			
		||||
	// parsing it directly sped up x10 times because of not using Sscanf.
 | 
			
		||||
	// It was one of two major performance drawbacks in container start.
 | 
			
		||||
	if !isSubsystemAvailable(subsystem) {
 | 
			
		||||
		return "", NewNotFoundError(subsystem)
 | 
			
		||||
	}
 | 
			
		||||
	f, err := os.Open("/proc/self/mountinfo")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
@@ -47,6 +53,9 @@ func FindCgroupMountpoint(subsystem string) (string, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FindCgroupMountpointAndRoot(subsystem string) (string, string, error) {
 | 
			
		||||
	if !isSubsystemAvailable(subsystem) {
 | 
			
		||||
		return "", "", NewNotFoundError(subsystem)
 | 
			
		||||
	}
 | 
			
		||||
	f, err := os.Open("/proc/self/mountinfo")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", "", err
 | 
			
		||||
@@ -70,6 +79,15 @@ func FindCgroupMountpointAndRoot(subsystem string) (string, string, error) {
 | 
			
		||||
	return "", "", NewNotFoundError(subsystem)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isSubsystemAvailable(subsystem string) bool {
 | 
			
		||||
	cgroups, err := ParseCgroupFile("/proc/self/cgroup")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	_, avail := cgroups[subsystem]
 | 
			
		||||
	return avail
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FindCgroupMountpointDir() (string, error) {
 | 
			
		||||
	f, err := os.Open("/proc/self/mountinfo")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -124,7 +142,8 @@ func (m Mount) GetThisCgroupDir(cgroups map[string]string) (string, error) {
 | 
			
		||||
func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) {
 | 
			
		||||
	res := make([]Mount, 0, len(ss))
 | 
			
		||||
	scanner := bufio.NewScanner(mi)
 | 
			
		||||
	for scanner.Scan() {
 | 
			
		||||
	numFound := 0
 | 
			
		||||
	for scanner.Scan() && numFound < len(ss) {
 | 
			
		||||
		txt := scanner.Text()
 | 
			
		||||
		sepIdx := strings.Index(txt, " - ")
 | 
			
		||||
		if sepIdx == -1 {
 | 
			
		||||
@@ -139,12 +158,15 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) {
 | 
			
		||||
			Root:       fields[3],
 | 
			
		||||
		}
 | 
			
		||||
		for _, opt := range strings.Split(fields[len(fields)-1], ",") {
 | 
			
		||||
			if !ss[opt] {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if strings.HasPrefix(opt, cgroupNamePrefix) {
 | 
			
		||||
				m.Subsystems = append(m.Subsystems, opt[len(cgroupNamePrefix):])
 | 
			
		||||
			}
 | 
			
		||||
			if ss[opt] {
 | 
			
		||||
			} else {
 | 
			
		||||
				m.Subsystems = append(m.Subsystems, opt)
 | 
			
		||||
			}
 | 
			
		||||
			numFound++
 | 
			
		||||
		}
 | 
			
		||||
		res = append(res, m)
 | 
			
		||||
	}
 | 
			
		||||
@@ -161,19 +183,19 @@ func GetCgroupMounts() ([]Mount, error) {
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	all, err := GetAllSubsystems()
 | 
			
		||||
	all, err := ParseCgroupFile("/proc/self/cgroup")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	allMap := make(map[string]bool)
 | 
			
		||||
	for _, s := range all {
 | 
			
		||||
	for s := range all {
 | 
			
		||||
		allMap[s] = true
 | 
			
		||||
	}
 | 
			
		||||
	return getCgroupMountsHelper(allMap, f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns all the cgroup subsystems supported by the kernel
 | 
			
		||||
// GetAllSubsystems returns all the cgroup subsystems supported by the kernel
 | 
			
		||||
func GetAllSubsystems() ([]string, error) {
 | 
			
		||||
	f, err := os.Open("/proc/cgroups")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -199,7 +221,7 @@ func GetAllSubsystems() ([]string, error) {
 | 
			
		||||
	return subsystems, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns the relative path to the cgroup docker is running in.
 | 
			
		||||
// GetThisCgroupDir returns the relative path to the cgroup docker is running in.
 | 
			
		||||
func GetThisCgroupDir(subsystem string) (string, error) {
 | 
			
		||||
	cgroups, err := ParseCgroupFile("/proc/self/cgroup")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -220,7 +242,7 @@ func GetInitCgroupDir(subsystem string) (string, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readProcsFile(dir string) ([]int, error) {
 | 
			
		||||
	f, err := os.Open(filepath.Join(dir, "cgroup.procs"))
 | 
			
		||||
	f, err := os.Open(filepath.Join(dir, CgroupProcesses))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -243,6 +265,8 @@ func readProcsFile(dir string) ([]int, error) {
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseCgroupFile parses the given cgroup file, typically from
 | 
			
		||||
// /proc/<pid>/cgroup, into a map of subgroups to cgroup names.
 | 
			
		||||
func ParseCgroupFile(path string) (map[string]string, error) {
 | 
			
		||||
	f, err := os.Open(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -250,7 +274,12 @@ func ParseCgroupFile(path string) (map[string]string, error) {
 | 
			
		||||
	}
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	s := bufio.NewScanner(f)
 | 
			
		||||
	return parseCgroupFromReader(f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// helper function for ParseCgroupFile to make testing easier
 | 
			
		||||
func parseCgroupFromReader(r io.Reader) (map[string]string, error) {
 | 
			
		||||
	s := bufio.NewScanner(r)
 | 
			
		||||
	cgroups := make(map[string]string)
 | 
			
		||||
 | 
			
		||||
	for s.Scan() {
 | 
			
		||||
@@ -259,7 +288,16 @@ func ParseCgroupFile(path string) (map[string]string, error) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		text := s.Text()
 | 
			
		||||
		parts := strings.Split(text, ":")
 | 
			
		||||
		// from cgroups(7):
 | 
			
		||||
		// /proc/[pid]/cgroup
 | 
			
		||||
		// ...
 | 
			
		||||
		// For each cgroup hierarchy ... there is one entry
 | 
			
		||||
		// containing three colon-separated fields of the form:
 | 
			
		||||
		//     hierarchy-ID:subsystem-list:cgroup-path
 | 
			
		||||
		parts := strings.SplitN(text, ":", 3)
 | 
			
		||||
		if len(parts) < 3 {
 | 
			
		||||
			return nil, fmt.Errorf("invalid cgroup entry: must contain at least two colons: %v", text)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, subs := range strings.Split(parts[1], ",") {
 | 
			
		||||
			cgroups[subs] = parts[2]
 | 
			
		||||
@@ -291,8 +329,7 @@ func PathExists(path string) bool {
 | 
			
		||||
func EnterPid(cgroupPaths map[string]string, pid int) error {
 | 
			
		||||
	for _, path := range cgroupPaths {
 | 
			
		||||
		if PathExists(path) {
 | 
			
		||||
			if err := ioutil.WriteFile(filepath.Join(path, "cgroup.procs"),
 | 
			
		||||
				[]byte(strconv.Itoa(pid)), 0700); err != nil {
 | 
			
		||||
			if err := WriteCgroupProc(path, pid); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -361,7 +398,7 @@ func GetAllPids(path string) ([]int, error) {
 | 
			
		||||
	// collect pids from all sub-cgroups
 | 
			
		||||
	err := filepath.Walk(path, func(p string, info os.FileInfo, iErr error) error {
 | 
			
		||||
		dir, file := filepath.Split(p)
 | 
			
		||||
		if file != "cgroup.procs" {
 | 
			
		||||
		if file != CgroupProcesses {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		if iErr != nil {
 | 
			
		||||
@@ -376,3 +413,20 @@ func GetAllPids(path string) ([]int, error) {
 | 
			
		||||
	})
 | 
			
		||||
	return pids, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteCgroupProc writes the specified pid into the cgroup's cgroup.procs file
 | 
			
		||||
func WriteCgroupProc(dir string, pid int) error {
 | 
			
		||||
	// Normally dir should not be empty, one case is that cgroup subsystem
 | 
			
		||||
	// is not mounted, we will get empty dir, and we want it fail here.
 | 
			
		||||
	if dir == "" {
 | 
			
		||||
		return fmt.Errorf("no such directory for %s", CgroupProcesses)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Dont attach any pid to the cgroup if -1 is specified as a pid
 | 
			
		||||
	if pid != -1 {
 | 
			
		||||
		if err := ioutil.WriteFile(filepath.Join(dir, CgroupProcesses), []byte(strconv.Itoa(pid)), 0700); err != nil {
 | 
			
		||||
			return fmt.Errorf("failed to write %v to %v: %v", pid, CgroupProcesses, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user