Previously goredo opened corresponding lockfiles for each target
simultaneously, leading to many opened file descriptors. Now it takes a
jobserver's token before that, so number of opened lockfiles correlates
with the jobserver's slots. One of the drawbacks is that we wait and
take the jobserver's token even if target was actually already done before.
@cindex news
@unnumbered News
@cindex news
@unnumbered News
+@anchor{Release 1_25_0}
+@section Release 1.25.0
+@itemize
+@item
+ Target's lock file requires a token from the jobserver now. So
+ amount of simultaneously opened lock files depends on job slots
+ available.
+@end itemize
+
@anchor{Release 1_24_0}
@section Release 1.24.0
@itemize
@anchor{Release 1_24_0}
@section Release 1.24.0
@itemize
return TgtError{tgtOrig, err}
}
return TgtError{tgtOrig, err}
}
+ shCtx := fmt.Sprintf("sh: %s: cwd:%s", tgtOrig, cwd)
+ jsToken := jsAcquire(shCtx)
+ jsNeedsRelease := true
+ defer func() {
+ if jsNeedsRelease {
+ jsRelease(shCtx, jsToken)
+ }
+ }()
+
// Acquire lock
fdLock, err := os.OpenFile(
path.Join(redoDir, tgt+LockSuffix),
// Acquire lock
fdLock, err := os.OpenFile(
path.Join(redoDir, tgt+LockSuffix),
path.Join(dirPrefix, basename),
tmpPathRel,
)
path.Join(dirPrefix, basename),
tmpPathRel,
)
+ shCtx = fmt.Sprintf(
+ "sh: %s: %s %s cwd:%s dirprefix:%s",
+ tgtOrig, cmdName, args, cwd, dirPrefix,
+ )
cmd := exec.Command(cmdName, args...)
cmd.Dir = cwd
cmd := exec.Command(cmdName, args...)
cmd.Dir = cwd
return TgtError{tgtOrig, err}
}
}
return TgtError{tgtOrig, err}
}
}
- shCtx := fmt.Sprintf(
- "sh: %s: %s %s cwd:%s dirprefix:%s",
- tgtOrig, cmdName, args, cwd, dirPrefix,
- )
tracef(CDebug, "%s", shCtx)
tracef(CDebug, "%s", shCtx)
- jsToken := jsAcquire(shCtx)
if JSR == nil {
// infinite jobs
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJobs))
if JSR == nil {
// infinite jobs
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJobs))
+ defer jsRelease(shCtx, jsToken)
+
var finished time.Time
var exitErr *exec.ExitError
started := time.Now()
var finished time.Time
var exitErr *exec.ExitError
started := time.Now()
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd))
defer func() {
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd))
defer func() {
- jsRelease(shCtx, jsToken)
fdDep.Close()
fdStdout.Close()
if fdStderr != nil {
fdDep.Close()
fdStdout.Close()
if fdStderr != nil {
Warranty = `Copyright (C) 2020-2022 Sergey Matveev
This program is free software: you can redistribute it and/or modify
Warranty = `Copyright (C) 2020-2022 Sergey Matveev
This program is free software: you can redistribute it and/or modify