Merge pull request #24642 from tonistiigi/wait-open

Wait for the reader fifo opening to block
Upstream-commit: c562e3d7688e14c537be992e4b17486335c32577
Component: engine
This commit is contained in:
Alexander Morozov
2016-07-15 08:42:18 -07:00
committed by GitHub
2 changed files with 5 additions and 1 deletions

View File

@ -225,8 +225,9 @@ func (ctr *container) discardFifos() {
f := ctr.fifo(i)
c := make(chan struct{})
go func() {
r := openReaderFromFifo(f)
close(c) // this channel is used to not close the writer too early, before readonly open has been called.
io.Copy(ioutil.Discard, openReaderFromFifo(f))
io.Copy(ioutil.Discard, r)
}()
<-c
closeReaderFifo(f) // avoid blocking permanently on open if there is no writer side

View File

@ -79,7 +79,9 @@ func (r emptyReader) Read(b []byte) (int, error) {
func openReaderFromFifo(fn string) io.Reader {
r, w := io.Pipe()
c := make(chan struct{})
go func() {
close(c)
stdoutf, err := os.OpenFile(fn, syscall.O_RDONLY, 0)
if err != nil {
r.CloseWithError(err)
@ -90,6 +92,7 @@ func openReaderFromFifo(fn string) io.Reader {
w.Close()
stdoutf.Close()
}()
<-c // wait for the goroutine to get scheduled and syscall to block
return r
}