فهرست منبع

fix race condition on logFile of baseProvider

Yuxiang Zhang 7 سال پیش
والد
کامیت
79e6167028
2فایلهای تغییر یافته به همراه8 افزوده شده و 23 حذف شده
  1. 5 23
      worker/base_provider.go
  2. 3 0
      worker/runner.go

+ 5 - 23
worker/base_provider.go

@@ -20,8 +20,6 @@ type baseProvider struct {
 	cmd       *cmdJob
 	isRunning atomic.Value
 
-	logFile *os.File
-
 	cgroup *cgroupHook
 	zfs    *zfsHook
 	docker *dockerHook
@@ -116,15 +114,12 @@ func (p *baseProvider) prepareLogFile() error {
 		p.cmd.SetLogFile(nil)
 		return nil
 	}
-	if p.logFile == nil {
-		logFile, err := os.OpenFile(p.LogFile(), os.O_WRONLY|os.O_CREATE, 0644)
-		if err != nil {
-			logger.Errorf("Error opening logfile %s: %s", p.LogFile(), err.Error())
-			return err
-		}
-		p.logFile = logFile
+	logFile, err := os.OpenFile(p.LogFile(), os.O_WRONLY|os.O_CREATE, 0644)
+	if err != nil {
+		logger.Errorf("Error opening logfile %s: %s", p.LogFile(), err.Error())
+		return err
 	}
-	p.cmd.SetLogFile(p.logFile)
+	p.cmd.SetLogFile(logFile)
 	return nil
 }
 
@@ -143,13 +138,7 @@ func (p *baseProvider) IsRunning() bool {
 
 func (p *baseProvider) Wait() error {
 	defer func() {
-		p.Lock()
 		p.isRunning.Store(false)
-		if p.logFile != nil {
-			p.logFile.Close()
-			p.logFile = nil
-		}
-		p.Unlock()
 	}()
 	return p.cmd.Wait()
 }
@@ -160,13 +149,6 @@ func (p *baseProvider) Terminate() error {
 		return nil
 	}
 
-	p.Lock()
-	if p.logFile != nil {
-		p.logFile.Close()
-		p.logFile = nil
-	}
-	p.Unlock()
-
 	err := p.cmd.Terminate()
 	p.isRunning.Store(false)
 

+ 3 - 0
worker/runner.go

@@ -118,6 +118,9 @@ func (c *cmdJob) Wait() error {
 		return c.retErr
 	default:
 		err := c.cmd.Wait()
+		if c.cmd.Stdout != nil {
+			c.cmd.Stdout.(*os.File).Close()
+		}
 		c.retErr = err
 		close(c.finished)
 		return err