diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index 14dce2fef..7685bfdf2 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -191,7 +191,7 @@ type UniversalExecutor struct { syslogServer *logging.SyslogServer syslogChan chan *logging.SyslogMessage - resCon resourceContainer + resConCtx resourceContainerContext consulSyncer *consul.Syncer consulCtx *ConsulContext @@ -299,7 +299,7 @@ func (e *UniversalExecutor) LaunchCmd(command *ExecCommand, ctx *ExecutorContext } go e.collectPids() go e.wait() - ic := e.resCon.getIsolationConfig() + ic := e.resConCtx.getIsolationConfig() return &ProcessState{Pid: e.cmd.Process.Pid, ExitCode: -1, IsolationConfig: ic, Time: time.Now()}, nil } @@ -387,7 +387,7 @@ func generateServiceKeys(allocID string, services []*structs.Service) map[consul func (e *UniversalExecutor) wait() { defer close(e.processExited) err := e.cmd.Wait() - ic := e.resCon.getIsolationConfig() + ic := e.resConCtx.getIsolationConfig() if err == nil { e.exitState = &ProcessState{Pid: 0, ExitCode: 0, IsolationConfig: ic, Time: time.Now()} return @@ -461,7 +461,7 @@ func (e *UniversalExecutor) Exit() error { } if e.command.ResourceLimits { - if err := e.resCon.executorCleanup(); err != nil { + if err := e.resConCtx.executorCleanup(); err != nil { merr.Errors = append(merr.Errors, err) } } diff --git a/client/driver/executor/executor_linux.go b/client/driver/executor/executor_linux.go index a748cabcc..1f6fef13c 100644 --- a/client/driver/executor/executor_linux.go +++ b/client/driver/executor/executor_linux.go @@ -68,7 +68,7 @@ func (e *UniversalExecutor) applyLimits(pid int) error { } // Entering the process in the cgroup - manager := getCgroupManager(e.resCon.groups, nil) + manager := getCgroupManager(e.resConCtx.groups, nil) if err := manager.Apply(pid); err != nil { e.logger.Printf("[ERR] executor: error applying pid to cgroup: %v", err) if er := e.removeChrootMounts(); er != nil { @@ -76,11 +76,11 @@ func (e *UniversalExecutor) applyLimits(pid int) error { } return err } - e.resCon.cgPaths = manager.GetPaths() - cgConfig := cgroupConfig.Config{Cgroups: e.resCon.groups} + e.resConCtx.cgPaths = manager.GetPaths() + cgConfig := cgroupConfig.Config{Cgroups: e.resConCtx.groups} if err := manager.Set(&cgConfig); err != nil { e.logger.Printf("[ERR] executor: error setting cgroup config: %v", err) - if er := DestroyCgroup(e.resCon.groups, e.resCon.cgPaths, os.Getpid()); er != nil { + if er := DestroyCgroup(e.resConCtx.groups, e.resConCtx.cgPaths, os.Getpid()); er != nil { e.logger.Printf("[ERR] executor: error destroying cgroup: %v", er) } if er := e.removeChrootMounts(); er != nil { @@ -94,19 +94,19 @@ func (e *UniversalExecutor) applyLimits(pid int) error { // configureCgroups converts a Nomad Resources specification into the equivalent // cgroup configuration. It returns an error if the resources are invalid. func (e *UniversalExecutor) configureCgroups(resources *structs.Resources) error { - e.resCon.groups = &cgroupConfig.Cgroup{} - e.resCon.groups.Resources = &cgroupConfig.Resources{} + e.resConCtx.groups = &cgroupConfig.Cgroup{} + e.resConCtx.groups.Resources = &cgroupConfig.Resources{} cgroupName := structs.GenerateUUID() - e.resCon.groups.Path = filepath.Join("/nomad", cgroupName) + e.resConCtx.groups.Path = filepath.Join("/nomad", cgroupName) // TODO: verify this is needed for things like network access - e.resCon.groups.Resources.AllowAllDevices = true + e.resConCtx.groups.Resources.AllowAllDevices = true if resources.MemoryMB > 0 { // Total amount of memory allowed to consume - e.resCon.groups.Resources.Memory = int64(resources.MemoryMB * 1024 * 1024) + e.resConCtx.groups.Resources.Memory = int64(resources.MemoryMB * 1024 * 1024) // Disable swap to avoid issues on the machine - e.resCon.groups.Resources.MemorySwap = int64(-1) + e.resConCtx.groups.Resources.MemorySwap = int64(-1) } if resources.CPU < 2 { @@ -114,7 +114,7 @@ func (e *UniversalExecutor) configureCgroups(resources *structs.Resources) error } // Set the relative CPU shares for this cgroup. - e.resCon.groups.Resources.CpuShares = int64(resources.CPU) + e.resConCtx.groups.Resources.CpuShares = int64(resources.CPU) if resources.IOPS != 0 { // Validate it is in an acceptable range. @@ -122,7 +122,7 @@ func (e *UniversalExecutor) configureCgroups(resources *structs.Resources) error return fmt.Errorf("resources.IOPS must be between 10 and 1000: %d", resources.IOPS) } - e.resCon.groups.Resources.BlkioWeight = uint16(resources.IOPS) + e.resConCtx.groups.Resources.BlkioWeight = uint16(resources.IOPS) } return nil @@ -140,7 +140,7 @@ func (e *UniversalExecutor) Stats() (*cstructs.TaskResourceUsage, error) { return e.aggregatedResourceUsage(pidStats), nil } ts := time.Now() - manager := getCgroupManager(e.resCon.groups, e.resCon.cgPaths) + manager := getCgroupManager(e.resConCtx.groups, e.resConCtx.cgPaths) stats, err := manager.GetStats() if err != nil { return nil, err @@ -255,8 +255,8 @@ func (e *UniversalExecutor) configureChroot() error { // should be called when tearing down the task. func (e *UniversalExecutor) removeChrootMounts() error { // Prevent a race between Wait/ForceStop - e.resCon.cgLock.Lock() - defer e.resCon.cgLock.Unlock() + e.resConCtx.cgLock.Lock() + defer e.resConCtx.cgLock.Unlock() return e.ctx.AllocDir.UnmountAll() } @@ -266,7 +266,7 @@ func (e *UniversalExecutor) removeChrootMounts() error { // isolation func (e *UniversalExecutor) getAllPids() (map[int]*nomadPid, error) { if e.command.ResourceLimits { - manager := getCgroupManager(e.resCon.groups, e.resCon.cgPaths) + manager := getCgroupManager(e.resConCtx.groups, e.resConCtx.cgPaths) pids, err := manager.GetAllPids() if err != nil { return nil, err diff --git a/client/driver/executor/resource_container_default.go b/client/driver/executor/resource_container_default.go index d3303aaed..6e9503206 100644 --- a/client/driver/executor/resource_container_default.go +++ b/client/driver/executor/resource_container_default.go @@ -6,17 +6,19 @@ import ( dstructs "github.com/hashicorp/nomad/client/driver/structs" ) -type resourceContainer struct { +// resourceContainerContext is a platform-specific struct for managing a +// resource container. +type resourceContainerContext struct { } func clientCleanup(ic *dstructs.IsolationConfig, pid int) error { return nil } -func (rc *resourceContainer) executorCleanup() error { +func (rc *resourceContainerContext) executorCleanup() error { return nil } -func (rc *resourceContainer) getIsolationConfig() *dstructs.IsolationConfig { +func (rc *resourceContainerContext) getIsolationConfig() *dstructs.IsolationConfig { return nil } diff --git a/client/driver/executor/resource_container_linux.go b/client/driver/executor/resource_container_linux.go index 97224b25b..ad57de03f 100644 --- a/client/driver/executor/resource_container_linux.go +++ b/client/driver/executor/resource_container_linux.go @@ -8,7 +8,9 @@ import ( cgroupConfig "github.com/opencontainers/runc/libcontainer/configs" ) -type resourceContainer struct { +// resourceContainerContext is a platform-specific struct for managing a +// resource container. In the case of Linux, this is used to control Cgroups. +type resourceContainerContext struct { groups *cgroupConfig.Cgroup cgPaths map[string]string cgLock sync.Mutex @@ -23,7 +25,7 @@ func clientCleanup(ic *dstructs.IsolationConfig, pid int) error { } // cleanup removes this host's Cgroup from within an Executor's context -func (rc *resourceContainer) executorCleanup() error { +func (rc *resourceContainerContext) executorCleanup() error { rc.cgLock.Lock() defer rc.cgLock.Unlock() if err := DestroyCgroup(rc.groups, rc.cgPaths, os.Getpid()); err != nil { @@ -32,7 +34,7 @@ func (rc *resourceContainer) executorCleanup() error { return nil } -func (rc *resourceContainer) getIsolationConfig() *dstructs.IsolationConfig { +func (rc *resourceContainerContext) getIsolationConfig() *dstructs.IsolationConfig { return &dstructs.IsolationConfig{ Cgroup: rc.groups, CgroupPaths: rc.cgPaths,