Fix race condition when exec with tty

I can reproduce this easily on one of my servers,
`docker exec -ti my_cont ls` will not print anything,
without `-t` it acts normally.

Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
This commit is contained in:
Qiang Huang 2016-03-08 10:45:17 +08:00
Родитель 9e2c4de0de
Коммит a444b5f60c
1 изменённых файлов: 6 добавлений и 4 удалений

Просмотреть файл

@ -441,12 +441,12 @@ type TtyConsole struct {
}
// NewTtyConsole returns a new TtyConsole struct.
func NewTtyConsole(console libcontainer.Console, pipes *execdriver.Pipes) (*TtyConsole, error) {
func NewTtyConsole(console libcontainer.Console, pipes *execdriver.Pipes, wg *sync.WaitGroup) (*TtyConsole, error) {
tty := &TtyConsole{
console: console,
}
if err := tty.AttachPipes(pipes); err != nil {
if err := tty.AttachPipes(pipes, wg); err != nil {
tty.Close()
return nil, err
}
@ -460,8 +460,10 @@ func (t *TtyConsole) Resize(h, w int) error {
}
// AttachPipes attaches given pipes to TtyConsole
func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes) error {
func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes, wg *sync.WaitGroup) error {
wg.Add(1)
go func() {
defer wg.Done()
if wb, ok := pipes.Stdout.(interface {
CloseWriters() error
}); ok {
@ -501,7 +503,7 @@ func setupPipes(container *configs.Config, processConfig *execdriver.ProcessConf
if err != nil {
return writers, err
}
term, err := NewTtyConsole(cons, pipes)
term, err := NewTtyConsole(cons, pipes, wg)
if err != nil {
return writers, err
}