Refactor stdin closing
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com> Upstream-commit: 6f2658fb8cbaf5972c4c069817ed16e80d461514 Component: engine
This commit is contained in:
@ -13,6 +13,7 @@ import (
|
||||
"github.com/Sirupsen/logrus"
|
||||
containerd "github.com/docker/containerd/api/grpc/types"
|
||||
"github.com/docker/docker/pkg/idtools"
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
"github.com/docker/docker/pkg/mount"
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/timestamp"
|
||||
@ -100,12 +101,26 @@ func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendly
|
||||
return -1, err
|
||||
}
|
||||
|
||||
var stdinOnce sync.Once
|
||||
stdin := iopipe.Stdin
|
||||
iopipe.Stdin = ioutils.NewWriteCloserWrapper(stdin, func() error {
|
||||
var err error
|
||||
stdinOnce.Do(func() { // on error from attach we don't know if stdin was already closed
|
||||
err = stdin.Close()
|
||||
if err2 := p.sendCloseStdin(); err == nil {
|
||||
err = err2
|
||||
}
|
||||
})
|
||||
return err
|
||||
})
|
||||
|
||||
container.processes[processFriendlyName] = p
|
||||
|
||||
clnt.unlock(containerID)
|
||||
|
||||
if err := clnt.backend.AttachStreams(processFriendlyName, *iopipe); err != nil {
|
||||
clnt.lock(containerID)
|
||||
p.closeFifos(iopipe)
|
||||
return -1, err
|
||||
}
|
||||
clnt.lock(containerID)
|
||||
@ -420,8 +435,18 @@ func (clnt *client) restore(cont *containerd.Container, lastEvent *containerd.Ev
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var stdinOnce sync.Once
|
||||
stdin := iopipe.Stdin
|
||||
iopipe.Stdin = ioutils.NewWriteCloserWrapper(stdin, func() error {
|
||||
var err error
|
||||
stdinOnce.Do(func() { // on error from attach we don't know if stdin was already closed
|
||||
err = stdin.Close()
|
||||
})
|
||||
return err
|
||||
})
|
||||
|
||||
if err := clnt.backend.AttachStreams(containerID, *iopipe); err != nil {
|
||||
container.closeFifos(iopipe)
|
||||
return err
|
||||
}
|
||||
|
||||
@ -434,6 +459,7 @@ func (clnt *client) restore(cont *containerd.Container, lastEvent *containerd.Ev
|
||||
}})
|
||||
|
||||
if err != nil {
|
||||
container.closeFifos(iopipe)
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user