mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #21022 from hqhq/hq_fix_race_resize
Fix race condition with exec and resize
This commit is contained in:
commit
cc12d2bfaa
2 changed files with 23 additions and 0 deletions
|
@ -307,6 +307,9 @@ func (d *Daemon) monitorExec(container *container.Container, execConfig *exec.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
if execConfig.ProcessConfig.Terminal != nil {
|
if execConfig.ProcessConfig.Terminal != nil {
|
||||||
|
if err := execConfig.WaitResize(); err != nil {
|
||||||
|
logrus.Errorf("Error waiting for resize: %v", err)
|
||||||
|
}
|
||||||
if err := execConfig.ProcessConfig.Terminal.Close(); err != nil {
|
if err := execConfig.ProcessConfig.Terminal.Close(); err != nil {
|
||||||
logrus.Errorf("Error closing terminal while running in container %s: %s", container.ID, err)
|
logrus.Errorf("Error closing terminal while running in container %s: %s", container.ID, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ type Config struct {
|
||||||
|
|
||||||
// waitStart will be closed immediately after the exec is really started.
|
// waitStart will be closed immediately after the exec is really started.
|
||||||
waitStart chan struct{}
|
waitStart chan struct{}
|
||||||
|
|
||||||
|
// waitResize will be closed after Resize is finished.
|
||||||
|
waitResize chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConfig initializes the a new exec configuration
|
// NewConfig initializes the a new exec configuration
|
||||||
|
@ -37,6 +40,7 @@ func NewConfig() *Config {
|
||||||
ID: stringid.GenerateNonCryptoID(),
|
ID: stringid.GenerateNonCryptoID(),
|
||||||
StreamConfig: runconfig.NewStreamConfig(),
|
StreamConfig: runconfig.NewStreamConfig(),
|
||||||
waitStart: make(chan struct{}),
|
waitStart: make(chan struct{}),
|
||||||
|
waitResize: make(chan struct{}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,13 +110,29 @@ func (c *Config) Wait(cErr chan error) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WaitResize waits until terminal resize finishes or time out.
|
||||||
|
func (c *Config) WaitResize() error {
|
||||||
|
select {
|
||||||
|
case <-c.waitResize:
|
||||||
|
case <-time.After(time.Second):
|
||||||
|
return fmt.Errorf("Terminal resize for exec %s time out.", c.ID)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Close closes the wait channel for the progress.
|
// Close closes the wait channel for the progress.
|
||||||
func (c *Config) Close() {
|
func (c *Config) Close() {
|
||||||
close(c.waitStart)
|
close(c.waitStart)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CloseResize closes the wait channel for resizing terminal.
|
||||||
|
func (c *Config) CloseResize() {
|
||||||
|
close(c.waitResize)
|
||||||
|
}
|
||||||
|
|
||||||
// Resize changes the size of the terminal for the exec process.
|
// Resize changes the size of the terminal for the exec process.
|
||||||
func (c *Config) Resize(h, w int) error {
|
func (c *Config) Resize(h, w int) error {
|
||||||
|
defer c.CloseResize()
|
||||||
select {
|
select {
|
||||||
case <-c.waitStart:
|
case <-c.waitStart:
|
||||||
case <-time.After(time.Second):
|
case <-time.After(time.Second):
|
||||||
|
|
Loading…
Reference in a new issue