From ecb97c9a61e81465fa748b4324da0ddd12872fdc Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 28 Jan 2021 21:14:00 +0300 Subject: [PATCH] Reduce number of opened files while waiting for job slot --- doc/news.texi | 3 +++ run.go | 46 +++++++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/doc/news.texi b/doc/news.texi index 7f67ba9..56b537d 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -8,6 +8,9 @@ Dependency files @file{.dep} extension changed to @file{.rec}, to reflect its recfile format nature and editors file type better determination. +@item + Reduce number of file descriptors kept open (1 instead of 4) while + waiting for job slot token. @end itemize @anchor{Release 1.1.0} diff --git a/run.go b/run.go index 25e8bac..af17eaa 100644 --- a/run.go +++ b/run.go @@ -246,6 +246,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { lockRelease() return TgtErr{tgtOrig, err} } + fdDepPath := fdDep.Name() cleanup := func() { lockRelease() fdDep.Close() @@ -292,6 +293,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { cleanup() return TgtErr{tgtOrig, err} } + fdDep.Close() trace(CWait, "%s", runErr.Name()) // Prepare command line @@ -316,7 +318,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { cleanup() return TgtErr{tgtOrig, err} } - tmpPath := fdStdout.Name() + ".3" // and for $3 + stdoutPath := fdStdout.Name() + fdStdout.Close() + tmpPath := stdoutPath + ".3" // and for $3 tmpPathRel, err := filepath.Rel(cwd, tmpPath) if err != nil { panic(err) @@ -330,7 +334,6 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { cmd := exec.Command(cmdName, args...) cmd.Dir = cwd - cmd.Stdout = fdStdout // cmd.Stdin reads from /dev/null by default cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", EnvLevel, Level+1)) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix)) @@ -342,10 +345,6 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { )) fdNum := 0 - cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) - fdNum++ - if FdStatus == nil { cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvStatusFd)) } else { @@ -367,10 +366,6 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } // Preparing stderr - stderr, err := cmd.StderrPipe() - if err != nil { - panic(err) - } var fdStderr *os.File if StderrKeep { fdStderr, err = os.OpenFile( @@ -396,6 +391,26 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { if FdStatus != nil { FdStatus.Write([]byte{StatusRun}) } + + started := time.Now() + runErr.Started = &started + fdStdout, err = os.OpenFile(stdoutPath, os.O_RDWR, os.FileMode(0666)) + if err != nil { + runErr.Err = err + errs <- runErr + return + } + cmd.Stdout = fdStdout + fdDep, err = os.OpenFile(fdDepPath, os.O_WRONLY|os.O_APPEND, os.FileMode(0666)) + if err != nil { + runErr.Err = err + errs <- runErr + return + } + cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) + fdNum++ + defer func() { jsRelease(shCtx) lockRelease() @@ -413,9 +428,14 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } Jobs.Done() }() - started := time.Now() - runErr.Started = &started - err := cmd.Start() + stderr, err := cmd.StderrPipe() + if err != nil { + runErr.Err = err + errs <- runErr + return + } + started = time.Now() + err = cmd.Start() if err != nil { runErr.Err = err errs <- runErr -- 2.44.0