mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Use cio.FIFOSet.Close() to cleanup fifos
Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
parent
3fec7c0858
commit
d72dfbfa8d
5 changed files with 39 additions and 47 deletions
|
@ -4,6 +4,10 @@ TOMLV_COMMIT=9baf8a8a9f2ed20a8e54160840c492f937eeaf9a
|
||||||
|
|
||||||
# When updating RUNC_COMMIT, also update runc in vendor.conf accordingly
|
# When updating RUNC_COMMIT, also update runc in vendor.conf accordingly
|
||||||
RUNC_COMMIT=b2567b37d7b75eb4cf325b77297b140ea686ce8f
|
RUNC_COMMIT=b2567b37d7b75eb4cf325b77297b140ea686ce8f
|
||||||
|
|
||||||
|
# containerd is also pinned in vendor.conf. When updating the binary
|
||||||
|
# version you may also need to update the vendor version to pick up bug
|
||||||
|
# fixes or new APIs.
|
||||||
CONTAINERD_COMMIT=89623f28b87a6004d4b785663257362d1658a729 # v1.0.0
|
CONTAINERD_COMMIT=89623f28b87a6004d4b785663257362d1658a729 # v1.0.0
|
||||||
TINI_COMMIT=949e6facb77383876aeff8a6944dde66b3089574
|
TINI_COMMIT=949e6facb77383876aeff8a6944dde66b3089574
|
||||||
LIBNETWORK_COMMIT=7b2b1feb1de4817d522cc372af149ff48d25028e
|
LIBNETWORK_COMMIT=7b2b1feb1de4817d522cc372af149ff48d25028e
|
||||||
|
|
|
@ -121,7 +121,7 @@ func (c *client) Restore(ctx context.Context, id string, attachStdio StdioCallba
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
|
|
||||||
var rio *cio.DirectIO
|
var rio cio.IO
|
||||||
defer func() {
|
defer func() {
|
||||||
err = wrapError(err)
|
err = wrapError(err)
|
||||||
}()
|
}()
|
||||||
|
@ -139,12 +139,13 @@ func (c *client) Restore(ctx context.Context, id string, attachStdio StdioCallba
|
||||||
}()
|
}()
|
||||||
|
|
||||||
t, err := ctr.Task(ctx, func(fifos *cio.FIFOSet) (cio.IO, error) {
|
t, err := ctr.Task(ctx, func(fifos *cio.FIFOSet) (cio.IO, error) {
|
||||||
rio, err = cio.NewDirectIO(ctx, fifos)
|
io, err := cio.NewDirectIO(ctx, fifos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return attachStdio(rio)
|
rio, err = attachStdio(io)
|
||||||
|
return rio, err
|
||||||
})
|
})
|
||||||
if err != nil && !errdefs.IsNotFound(errors.Cause(err)) {
|
if err != nil && !errdefs.IsNotFound(errors.Cause(err)) {
|
||||||
return false, -1, err
|
return false, -1, err
|
||||||
|
@ -322,7 +323,6 @@ func (c *client) Exec(ctx context.Context, containerID, processID string, spec *
|
||||||
rio.Cancel()
|
rio.Cancel()
|
||||||
rio.Close()
|
rio.Close()
|
||||||
}
|
}
|
||||||
rmFIFOSet(fifos)
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -332,10 +332,6 @@ func (c *client) Exec(ctx context.Context, containerID, processID string, spec *
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
close(stdinCloseSync)
|
close(stdinCloseSync)
|
||||||
if rio != nil {
|
|
||||||
rio.Cancel()
|
|
||||||
rio.Close()
|
|
||||||
}
|
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,7 +682,7 @@ func (c *client) processEvent(ctr *container, et EventType, ei EventInfo) {
|
||||||
"container": ei.ContainerID,
|
"container": ei.ContainerID,
|
||||||
}).Error("failed to find container")
|
}).Error("failed to find container")
|
||||||
} else {
|
} else {
|
||||||
rmFIFOSet(newFIFOSet(ctr.bundleDir, ei.ProcessID, true, false))
|
newFIFOSet(ctr.bundleDir, ei.ProcessID, true, false).Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -81,30 +81,28 @@ func prepareBundleDir(bundleDir string, ociSpec *specs.Spec) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newFIFOSet(bundleDir, processID string, withStdin, withTerminal bool) *cio.FIFOSet {
|
func newFIFOSet(bundleDir, processID string, withStdin, withTerminal bool) *cio.FIFOSet {
|
||||||
fifos := &cio.FIFOSet{
|
config := cio.Config{
|
||||||
Config: cio.Config{
|
Terminal: withTerminal,
|
||||||
Terminal: withTerminal,
|
Stdout: filepath.Join(bundleDir, processID+"-stdout"),
|
||||||
Stdout: filepath.Join(bundleDir, processID+"-stdout"),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
paths := []string{config.Stdout}
|
||||||
|
|
||||||
if withStdin {
|
if withStdin {
|
||||||
fifos.Stdin = filepath.Join(bundleDir, processID+"-stdin")
|
config.Stdin = filepath.Join(bundleDir, processID+"-stdin")
|
||||||
|
paths = append(paths, config.Stdin)
|
||||||
}
|
}
|
||||||
|
if !withTerminal {
|
||||||
if !fifos.Terminal {
|
config.Stderr = filepath.Join(bundleDir, processID+"-stderr")
|
||||||
fifos.Stderr = filepath.Join(bundleDir, processID+"-stderr")
|
paths = append(paths, config.Stderr)
|
||||||
}
|
}
|
||||||
|
closer := func() error {
|
||||||
return fifos
|
for _, path := range paths {
|
||||||
}
|
if err := os.RemoveAll(path); err != nil {
|
||||||
|
logrus.Warnf("libcontainerd: failed to remove fifo %v: %v", path, err)
|
||||||
func rmFIFOSet(fset *cio.FIFOSet) {
|
|
||||||
for _, fn := range []string{fset.Stdout, fset.Stdin, fset.Stderr} {
|
|
||||||
if fn != "" {
|
|
||||||
if err := os.RemoveAll(fn); err != nil {
|
|
||||||
logrus.Warnf("libcontainerd: failed to remove fifo %v: %v", fn, err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return cio.NewFIFOSet(config, closer)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package libcontainerd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/containerd/containerd/cio"
|
"github.com/containerd/containerd/cio"
|
||||||
"github.com/containerd/containerd/windows/hcsshimtypes"
|
"github.com/containerd/containerd/windows/hcsshimtypes"
|
||||||
|
@ -35,19 +36,20 @@ func pipeName(containerID, processID, name string) string {
|
||||||
return fmt.Sprintf(`\\.\pipe\containerd-%s-%s-%s`, containerID, processID, name)
|
return fmt.Sprintf(`\\.\pipe\containerd-%s-%s-%s`, containerID, processID, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newFIFOSet(bundleDir, containerID, processID string, withStdin, withTerminal bool) *cio.FIFOSet {
|
func newFIFOSet(bundleDir, processID string, withStdin, withTerminal bool) *cio.FIFOSet {
|
||||||
fifos := &cio.FIFOSet{
|
containerID := filepath.Base(bundleDir)
|
||||||
|
config := cio.Config{
|
||||||
Terminal: withTerminal,
|
Terminal: withTerminal,
|
||||||
Out: pipeName(containerID, processID, "stdout"),
|
Stdout: pipeName(containerID, processID, "stdout"),
|
||||||
}
|
}
|
||||||
|
|
||||||
if withStdin {
|
if withStdin {
|
||||||
fifos.In = pipeName(containerID, processID, "stdin")
|
config.Stdin = pipeName(containerID, processID, "stdin")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !fifos.Terminal {
|
if !config.Terminal {
|
||||||
fifos.Err = pipeName(containerID, processID, "stderr")
|
config.Stderr = pipeName(containerID, processID, "stderr")
|
||||||
}
|
}
|
||||||
|
|
||||||
return fifos
|
return cio.NewFIFOSet(config, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
@ -671,7 +670,7 @@ func (c *client) Start(_ context.Context, id, _ string, withStdin bool, attachSt
|
||||||
return p.pid, nil
|
return p.pid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dio, err := newIOFromProcess(newProcess)
|
dio, err := newIOFromProcess(newProcess, ctr.ociSpec.Process.Terminal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithError(err).Error("failed to get stdio pipes")
|
logger.WithError(err).Error("failed to get stdio pipes")
|
||||||
return -1, err
|
return -1, err
|
||||||
|
@ -712,16 +711,14 @@ func (c *client) Start(_ context.Context, id, _ string, withStdin bool, attachSt
|
||||||
return p.pid, nil
|
return p.pid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newIOFromProcess(newProcess process) (*cio.DirectIO, error) {
|
func newIOFromProcess(newProcess hcsshim.Process, terminal bool) (*cio.DirectIO, error) {
|
||||||
stdin, stdout, stderr, err := newProcess.Stdio()
|
stdin, stdout, stderr, err := newProcess.Stdio()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
dio := cio.DirectIO{
|
dio := cio.NewDirectIO(createStdInCloser(stdin, newProcess), nil, nil, terminal)
|
||||||
Terminal: ctr.ociSpec.Process.Terminal,
|
|
||||||
Stdin: createStdInCloser(stdin, newProcess),
|
|
||||||
}
|
|
||||||
// Convert io.ReadClosers to io.Readers
|
// Convert io.ReadClosers to io.Readers
|
||||||
if stdout != nil {
|
if stdout != nil {
|
||||||
dio.Stdout = ioutil.NopCloser(&autoClosingReader{ReadCloser: stdout})
|
dio.Stdout = ioutil.NopCloser(&autoClosingReader{ReadCloser: stdout})
|
||||||
|
@ -786,10 +783,6 @@ func (c *client) Exec(ctx context.Context, containerID, processID string, spec *
|
||||||
logger.Debugf("exec commandLine: %s", createProcessParms.CommandLine)
|
logger.Debugf("exec commandLine: %s", createProcessParms.CommandLine)
|
||||||
|
|
||||||
// Start the command running in the container.
|
// Start the command running in the container.
|
||||||
var (
|
|
||||||
stdout, stderr io.ReadCloser
|
|
||||||
stdin io.WriteCloser
|
|
||||||
)
|
|
||||||
newProcess, err := ctr.hcsContainer.CreateProcess(&createProcessParms)
|
newProcess, err := ctr.hcsContainer.CreateProcess(&createProcessParms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithError(err).Errorf("exec's CreateProcess() failed")
|
logger.WithError(err).Errorf("exec's CreateProcess() failed")
|
||||||
|
@ -812,12 +805,11 @@ func (c *client) Exec(ctx context.Context, containerID, processID string, spec *
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
dio, err := newIOFromProcess(newProcess)
|
dio, err := newIOFromProcess(newProcess, spec.Terminal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithError(err).Error("failed to get stdio pipes")
|
logger.WithError(err).Error("failed to get stdio pipes")
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
dio.Termainl = spec.Terminal
|
|
||||||
// Tell the engine to attach streams back to the client
|
// Tell the engine to attach streams back to the client
|
||||||
_, err = attachStdio(dio)
|
_, err = attachStdio(dio)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue