If an `os/exec.Command` is passed non `*os.File` as an input/output, go will create `os.Pipe`s and wait for their closure in `cmd.Wait()`. If the code following this is responsible for closing `io.Pipe`s or other handlers then on process death from context cancellation the `Wait` can hang. There are two possible solutions: 1. use `os.Pipe` as the input/output as `cmd.Wait` does not wait for these. 2. create a goroutine waiting on the context cancellation that will close the inputs. This PR provides the second option - which is a simpler change that can be more easily backported. Closes #19448 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
parent
09adc26eb6
commit
1d665da32f
1 changed files with 12 additions and 0 deletions
|
@ -54,6 +54,12 @@ func CatFileBatchCheck(ctx context.Context, repoPath string) (WriteCloserError,
|
||||||
<-closed
|
<-closed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure cancel is called as soon as the provided context is cancelled
|
||||||
|
go func() {
|
||||||
|
<-ctx.Done()
|
||||||
|
cancel()
|
||||||
|
}()
|
||||||
|
|
||||||
_, filename, line, _ := runtime.Caller(2)
|
_, filename, line, _ := runtime.Caller(2)
|
||||||
filename = strings.TrimPrefix(filename, callerPrefix)
|
filename = strings.TrimPrefix(filename, callerPrefix)
|
||||||
|
|
||||||
|
@ -93,6 +99,12 @@ func CatFileBatch(ctx context.Context, repoPath string) (WriteCloserError, *bufi
|
||||||
<-closed
|
<-closed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure cancel is called as soon as the provided context is cancelled
|
||||||
|
go func() {
|
||||||
|
<-ctx.Done()
|
||||||
|
cancel()
|
||||||
|
}()
|
||||||
|
|
||||||
_, filename, line, _ := runtime.Caller(2)
|
_, filename, line, _ := runtime.Caller(2)
|
||||||
filename = strings.TrimPrefix(filename, callerPrefix)
|
filename = strings.TrimPrefix(filename, callerPrefix)
|
||||||
|
|
||||||
|
|
Reference in a new issue