feat(executor/local): rlimit on CPU, Memory, Stack
This commit is contained in:
		
							parent
							
								
									c1d9111ea9
								
							
						
					
					
						commit
						198fcc3c86
					
				|  | @ -16,6 +16,32 @@ import ( | ||||||
| 
 | 
 | ||||||
| type Local struct{} | type Local struct{} | ||||||
| 
 | 
 | ||||||
|  | func ToRlimit(c stage.Cmd) (map[int]syscall.Rlimit, error) { | ||||||
|  | 	limits := make(map[int]syscall.Rlimit) | ||||||
|  | 
 | ||||||
|  | 	if c.CPULimit > 0 { | ||||||
|  | 		// ns to s
 | ||||||
|  | 		timeLimit := (uint64(c.CPULimit) + 1e9 - 1) / 1e9 | ||||||
|  | 		if timeLimit < 1 { | ||||||
|  | 			timeLimit = 1 | ||||||
|  | 		} | ||||||
|  | 		limits[syscall.RLIMIT_CPU] = syscall.Rlimit{ | ||||||
|  | 			Cur: timeLimit, Max: timeLimit, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if c.MemoryLimit > 0 { | ||||||
|  | 		limits[syscall.RLIMIT_AS] = syscall.Rlimit{ | ||||||
|  | 			Cur: c.MemoryLimit, Max: c.MemoryLimit, // bytes
 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if c.StackLimit > 0 { | ||||||
|  | 		limits[syscall.RLIMIT_STACK] = syscall.Rlimit{ | ||||||
|  | 			Cur: c.StackLimit, Max: c.StackLimit, // bytes
 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return limits, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { | func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { | ||||||
| 	var results []stage.ExecutorResult | 	var results []stage.ExecutorResult | ||||||
| 
 | 
 | ||||||
|  | @ -28,6 +54,16 @@ func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { | ||||||
| 		} | 		} | ||||||
| 		execCmd.Env = env | 		execCmd.Env = env | ||||||
| 
 | 
 | ||||||
|  | 		limits, err := ToRlimit(cmd) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, fmt.Errorf("failed to convert rlimits: %v", err) | ||||||
|  | 		} | ||||||
|  | 		for resource, limit := range limits { | ||||||
|  | 			if err := syscall.Setrlimit(resource, &limit); err != nil { | ||||||
|  | 				return nil, fmt.Errorf("failed to set rlimit: %v", err) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if cmd.Stdin != nil { | 		if cmd.Stdin != nil { | ||||||
| 			if cmd.Stdin.Content != nil { | 			if cmd.Stdin.Content != nil { | ||||||
| 				execCmd.Stdin = strings.NewReader(*cmd.Stdin.Content) | 				execCmd.Stdin = strings.NewReader(*cmd.Stdin.Content) | ||||||
|  | @ -45,7 +81,7 @@ func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { | ||||||
| 		execCmd.Stderr = &stderrBuffer | 		execCmd.Stderr = &stderrBuffer | ||||||
| 
 | 
 | ||||||
| 		startTime := time.Now() | 		startTime := time.Now() | ||||||
| 		err := execCmd.Start() | 		err = execCmd.Start() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, fmt.Errorf("failed to start command: %v", err) | 			return nil, fmt.Errorf("failed to start command: %v", err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user