// Destroy destroys the specified cgroup func (m *cgroupManagerImpl) Destroy(cgroupConfig *CgroupConfig) error { //cgroup name name := cgroupConfig.Name // Get map of all cgroup paths on the system for the particular cgroup cgroupPaths := make(map[string]string, len(m.subsystems.MountPoints)) for key, val := range m.subsystems.MountPoints { cgroupPaths[key] = path.Join(val, name) } // Initialize libcontainer's cgroup config libcontainerCgroupConfig := &libcontainerconfigs.Cgroup{ Name: path.Base(name), Parent: path.Dir(name), } fsCgroupManager := cgroupfs.Manager{ Cgroups: libcontainerCgroupConfig, Paths: cgroupPaths, } // Delete cgroups using libcontainers Managers Destroy() method if err := fsCgroupManager.Destroy(); err != nil { return fmt.Errorf("Unable to destroy cgroup paths for cgroup %v : %v", name, err) } return nil }
func (e *LinuxExecutor) destroyCgroup() error { if e.groups == nil { return errors.New("Can't destroy: cgroup configuration empty") } manager := cgroupFs.Manager{} manager.Cgroups = e.groups pids, err := manager.GetPids() if err != nil { return fmt.Errorf("Failed to get pids in the cgroup %v: %v", e.groups.Name, err) } errs := new(multierror.Error) for _, pid := range pids { process, err := os.FindProcess(pid) if err != nil { multierror.Append(errs, fmt.Errorf("Failed to find Pid %v: %v", pid, err)) continue } if err := process.Kill(); err != nil { multierror.Append(errs, fmt.Errorf("Failed to kill Pid %v: %v", pid, err)) continue } if _, err := process.Wait(); err != nil { multierror.Append(errs, fmt.Errorf("Failed to wait Pid %v: %v", pid, err)) continue } } // Remove the cgroup. if err := manager.Destroy(); err != nil { multierror.Append(errs, fmt.Errorf("Failed to delete the cgroup directories: %v", err)) } if len(errs.Errors) != 0 { return fmt.Errorf("Failed to destroy cgroup: %v", errs) } return nil }