Cleanup open pipes if logging binary fails to start
Signed-off-by: Akshat Kumar <kshtku@amazon.com>
This commit is contained in:
parent
4cc99e57a7
commit
61da6986c0
@ -18,6 +18,7 @@ package runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -42,3 +43,11 @@ func NewBinaryCmd(binaryURI *url.URL, id, ns string) *exec.Cmd {
|
|||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CloseFiles closes any files passed in.
|
||||||
|
// It it used for cleanup in the event of unexpected errors.
|
||||||
|
func CloseFiles(files ...*os.File) {
|
||||||
|
for _, file := range files {
|
||||||
|
file.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -35,7 +35,7 @@ type linuxPlatform struct {
|
|||||||
epoller *console.Epoller
|
epoller *console.Epoller
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (console.Console, error) {
|
func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (cons console.Console, retErr error) {
|
||||||
if p.epoller == nil {
|
if p.epoller == nil {
|
||||||
return nil, errors.New("uninitialized epoller")
|
return nil, errors.New("uninitialized epoller")
|
||||||
}
|
}
|
||||||
@ -77,22 +77,34 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console
|
|||||||
|
|
||||||
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
||||||
|
|
||||||
|
// In case of unexpected errors during logging binary start, close open pipes
|
||||||
|
var filesToClose []*os.File
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if retErr != nil {
|
||||||
|
runtime.CloseFiles(filesToClose...)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Create pipe to be used by logging binary for Stdout
|
// Create pipe to be used by logging binary for Stdout
|
||||||
outR, outW, err := os.Pipe()
|
outR, outW, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, outR)
|
||||||
|
|
||||||
// Stderr is created for logging binary but unused when terminal is true
|
// Stderr is created for logging binary but unused when terminal is true
|
||||||
serrR, _, err := os.Pipe()
|
serrR, _, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, serrR)
|
||||||
|
|
||||||
r, w, err := os.Pipe()
|
r, w, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, r)
|
||||||
|
|
||||||
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
||||||
|
|
||||||
@ -119,6 +131,7 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console
|
|||||||
if _, err := r.Read(b); err != nil && err != io.EOF {
|
if _, err := r.Read(b); err != nil && err != io.EOF {
|
||||||
return nil, errors.Wrap(err, "failed to read from logging binary")
|
return nil, errors.Wrap(err, "failed to read from logging binary")
|
||||||
}
|
}
|
||||||
|
cwg.Wait()
|
||||||
|
|
||||||
default:
|
default:
|
||||||
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
||||||
|
@ -36,7 +36,7 @@ import (
|
|||||||
type unixPlatform struct {
|
type unixPlatform struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (console.Console, error) {
|
func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (cons console.Console, retErr error) {
|
||||||
var cwg sync.WaitGroup
|
var cwg sync.WaitGroup
|
||||||
if stdin != "" {
|
if stdin != "" {
|
||||||
in, err := fifo.OpenFifo(ctx, stdin, syscall.O_RDONLY, 0)
|
in, err := fifo.OpenFifo(ctx, stdin, syscall.O_RDONLY, 0)
|
||||||
@ -66,22 +66,34 @@ func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console,
|
|||||||
|
|
||||||
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
||||||
|
|
||||||
|
// In case of unexpected errors during logging binary start, close open pipes
|
||||||
|
var filesToClose []*os.File
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if retErr != nil {
|
||||||
|
runtime.CloseFiles(filesToClose...)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Create pipe to be used by logging binary for Stdout
|
// Create pipe to be used by logging binary for Stdout
|
||||||
outR, outW, err := os.Pipe()
|
outR, outW, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, outR)
|
||||||
|
|
||||||
// Stderr is created for logging binary but unused when terminal is true
|
// Stderr is created for logging binary but unused when terminal is true
|
||||||
serrR, _, err := os.Pipe()
|
serrR, _, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, serrR)
|
||||||
|
|
||||||
r, w, err := os.Pipe()
|
r, w, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, r)
|
||||||
|
|
||||||
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
||||||
|
|
||||||
@ -108,6 +120,7 @@ func (p *unixPlatform) CopyConsole(ctx context.Context, console console.Console,
|
|||||||
if _, err := r.Read(b); err != nil && err != io.EOF {
|
if _, err := r.Read(b); err != nil && err != io.EOF {
|
||||||
return nil, errors.Wrap(err, "failed to read from logging binary")
|
return nil, errors.Wrap(err, "failed to read from logging binary")
|
||||||
}
|
}
|
||||||
|
cwg.Wait()
|
||||||
|
|
||||||
default:
|
default:
|
||||||
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
||||||
|
@ -59,7 +59,7 @@ type linuxPlatform struct {
|
|||||||
epoller *console.Epoller
|
epoller *console.Epoller
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (console.Console, error) {
|
func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console, id, stdin, stdout, stderr string, wg *sync.WaitGroup) (cons console.Console, retErr error) {
|
||||||
if p.epoller == nil {
|
if p.epoller == nil {
|
||||||
return nil, errors.New("uninitialized epoller")
|
return nil, errors.New("uninitialized epoller")
|
||||||
}
|
}
|
||||||
@ -101,22 +101,34 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console
|
|||||||
|
|
||||||
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
cmd := runtime.NewBinaryCmd(uri, id, ns)
|
||||||
|
|
||||||
|
// In case of unexpected errors during logging binary start, close open pipes
|
||||||
|
var filesToClose []*os.File
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if retErr != nil {
|
||||||
|
runtime.CloseFiles(filesToClose...)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Create pipe to be used by logging binary for Stdout
|
// Create pipe to be used by logging binary for Stdout
|
||||||
outR, outW, err := os.Pipe()
|
outR, outW, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
return nil, errors.Wrap(err, "failed to create stdout pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, outR)
|
||||||
|
|
||||||
// Stderr is created for logging binary but unused when terminal is true
|
// Stderr is created for logging binary but unused when terminal is true
|
||||||
serrR, _, err := os.Pipe()
|
serrR, _, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
return nil, errors.Wrap(err, "failed to create stderr pipes")
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, serrR)
|
||||||
|
|
||||||
r, w, err := os.Pipe()
|
r, w, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
filesToClose = append(filesToClose, r)
|
||||||
|
|
||||||
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
cmd.ExtraFiles = append(cmd.ExtraFiles, outR, serrR, w)
|
||||||
|
|
||||||
@ -143,6 +155,7 @@ func (p *linuxPlatform) CopyConsole(ctx context.Context, console console.Console
|
|||||||
if _, err := r.Read(b); err != nil && err != io.EOF {
|
if _, err := r.Read(b); err != nil && err != io.EOF {
|
||||||
return nil, errors.Wrap(err, "failed to read from logging binary")
|
return nil, errors.Wrap(err, "failed to read from logging binary")
|
||||||
}
|
}
|
||||||
|
cwg.Wait()
|
||||||
|
|
||||||
default:
|
default:
|
||||||
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
outw, err := fifo.OpenFifo(ctx, stdout, syscall.O_WRONLY, 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user