1
0
镜像自地址 https://github.com/tuna/tunasync.git 已同步 2025-12-06 22:46:47 +00:00

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

这个提交包含在:
bigeagle
2016-08-02 21:39:16 +08:00
父节点 24bdfe5b33
当前提交 c8af09f129
共有 3 个文件被更改,包括 17 次插入4 次删除

查看文件

@@ -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)

查看文件

@@ -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,9 +72,18 @@ func (c *cmdJob) Start() error {
} }
func (c *cmdJob) Wait() error { func (c *cmdJob) Wait() error {
err := c.cmd.Wait() c.Lock()
close(c.finished) defer c.Unlock()
return err
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) { func (c *cmdJob) SetLogFile(logFile *os.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 != "" {