Merge pull request #37 from tuna/dev

Dev
This commit is contained in:
bigeagle 2016-08-02 22:22:01 +08:00 committed by GitHub
commit 0db8fc6614
4 changed files with 53 additions and 18 deletions

View File

@ -2,18 +2,20 @@ package worker
import ( import (
"bufio" "bufio"
"errors"
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"strconv" "strconv"
"syscall" "syscall"
"time"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"github.com/codeskyblue/go-sh" "github.com/codeskyblue/go-sh"
) )
var cgSubsystem string = "cpu" var cgSubsystem = "cpu"
type cgroupHook struct { type cgroupHook struct {
emptyHook emptyHook
@ -82,24 +84,44 @@ func (c *cgroupHook) killAll() error {
return nil return nil
} }
name := c.provider.Name() name := c.provider.Name()
readTaskList := func() ([]int, error) {
taskList := []int{}
taskFile, err := os.Open(filepath.Join(c.basePath, cgSubsystem, c.baseGroup, name, "tasks")) taskFile, err := os.Open(filepath.Join(c.basePath, cgSubsystem, c.baseGroup, name, "tasks"))
if err != nil { if err != nil {
return err return taskList, err
} }
defer taskFile.Close() defer taskFile.Close()
taskList := []int{}
scanner := bufio.NewScanner(taskFile) scanner := bufio.NewScanner(taskFile)
for scanner.Scan() { for scanner.Scan() {
pid, err := strconv.Atoi(scanner.Text()) pid, err := strconv.Atoi(scanner.Text())
if err != nil { if err != nil {
return err return taskList, err
} }
taskList = append(taskList, pid) taskList = append(taskList, pid)
} }
return taskList, nil
}
for i := 0; i < 4; i++ {
if i == 3 {
return errors.New("Unable to kill all child tasks")
}
taskList, err := readTaskList()
if err != nil {
return err
}
if len(taskList) == 0 {
return nil
}
for _, pid := range taskList { for _, pid := range taskList {
logger.Debugf("Killing process: %d", pid) logger.Debugf("Killing process: %d", pid)
unix.Kill(pid, syscall.SIGKILL) unix.Kill(pid, syscall.SIGKILL)
} }
// sleep 10ms for the first round, and 1.01s, 2.01s, 3.01s for the rest
time.Sleep(time.Duration(i)*time.Second + 10*time.Millisecond)
}
return nil return nil
} }

View File

@ -79,7 +79,7 @@ func (l *logLimiter) preExec() error {
logLink := filepath.Join(logDir, "latest") logLink := filepath.Join(logDir, "latest")
if _, err = os.Stat(logLink); err == nil { if _, err = os.Lstat(logLink); err == nil {
os.Remove(logLink) os.Remove(logLink)
} }
os.Symlink(logFileName, logLink) os.Symlink(logFileName, logLink)

View File

@ -5,6 +5,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"strings" "strings"
"sync"
"syscall" "syscall"
"time" "time"
@ -17,12 +18,14 @@ import (
var errProcessNotStarted = errors.New("Process Not Started") var errProcessNotStarted = errors.New("Process Not Started")
type cmdJob struct { type cmdJob struct {
sync.Mutex
cmd *exec.Cmd cmd *exec.Cmd
workingDir string workingDir string
env map[string]string env map[string]string
logFile *os.File logFile *os.File
finished chan empty finished chan empty
provider mirrorProvider provider mirrorProvider
retErr error
} }
func newCmdJob(provider mirrorProvider, cmdAndArgs []string, workingDir string, env map[string]string) *cmdJob { func newCmdJob(provider mirrorProvider, cmdAndArgs []string, workingDir string, env map[string]string) *cmdJob {
@ -69,10 +72,19 @@ func (c *cmdJob) Start() error {
} }
func (c *cmdJob) Wait() error { func (c *cmdJob) Wait() error {
c.Lock()
defer c.Unlock()
select {
case <-c.finished:
return c.retErr
default:
err := c.cmd.Wait() err := c.cmd.Wait()
c.retErr = err
close(c.finished) close(c.finished)
return err return err
} }
}
func (c *cmdJob) SetLogFile(logFile *os.File) { func (c *cmdJob) SetLogFile(logFile *os.File) {
c.cmd.Stdout = logFile c.cmd.Stdout = logFile

View File

@ -108,6 +108,7 @@ func (p *twoStageRsyncProvider) Options(stage int) ([]string, error) {
} }
func (p *twoStageRsyncProvider) Run() error { func (p *twoStageRsyncProvider) Run() error {
defer p.Wait()
env := map[string]string{} env := map[string]string{}
if p.username != "" { if p.username != "" {