Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com> (cherry picked from commit 0b2023130e285a0207be9fda4b22e1419997c552) Signed-off-by: Tibor Vass <tibor@docker.com>
@@ -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
@@ -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{})
+ 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
}