Просмотр исходного кода

fix(worker): fix log file leakage of two-stage-sync provider. closing #36

bigeagle 9 лет назад
Родитель
Сommit
c8af09f129
3 измененных файлов с 17 добавлено и 4 удалено
  1. 1 1
      worker/loglimit_hook.go
  2. 15 3
      worker/runner.go
  3. 1 0
      worker/two_stage_rsync_provider.go

+ 1 - 1
worker/loglimit_hook.go

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

+ 15 - 3
worker/runner.go

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

+ 1 - 0
worker/two_stage_rsync_provider.go

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