From c99011b091f0182da78b21976eebc3a1f06d65b7 Mon Sep 17 00:00:00 2001 From: iwilltry42 Date: Mon, 25 Oct 2021 12:17:22 +0200 Subject: [PATCH] close connections more reliably --- pkg/client/node.go | 7 +++---- pkg/runtimes/docker/node.go | 6 ++++++ pkg/runtimes/docker/util.go | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pkg/client/node.go b/pkg/client/node.go index 3d307857..282831d0 100644 --- a/pkg/client/node.go +++ b/pkg/client/node.go @@ -685,13 +685,12 @@ func NodeWaitForLogMessage(ctx context.Context, runtime runtimes.Runtime, node * // read the logs out, err := runtime.GetNodeLogs(ctx, node, since) + if out != nil { + defer out.Close() + } if err != nil { - if out != nil { - out.Close() - } return fmt.Errorf("Failed waiting for log message '%s' from node '%s': %w", message, node.Name, err) } - defer out.Close() buf := new(bytes.Buffer) nRead, _ := buf.ReadFrom(out) diff --git a/pkg/runtimes/docker/node.go b/pkg/runtimes/docker/node.go index e0a0e315..9ba78441 100644 --- a/pkg/runtimes/docker/node.go +++ b/pkg/runtimes/docker/node.go @@ -309,6 +309,9 @@ func (d Docker) GetNodeLogs(ctx context.Context, node *k3d.Node, since time.Time // ExecInNodeGetLogs executes a command inside a node and returns the logs to the caller, e.g. to parse them func (d Docker) ExecInNodeGetLogs(ctx context.Context, node *k3d.Node, cmd []string) (*bufio.Reader, error) { resp, err := executeInNode(ctx, node, cmd) + if resp != nil { + defer resp.Close() + } if err != nil { if resp != nil && resp.Reader != nil { // sometimes the exec process returns with a non-zero exit code, but we still have the logs we return resp.Reader, err @@ -321,6 +324,9 @@ func (d Docker) ExecInNodeGetLogs(ctx context.Context, node *k3d.Node, cmd []str // ExecInNode execs a command inside a node func (d Docker) ExecInNode(ctx context.Context, node *k3d.Node, cmd []string) error { execConnection, err := executeInNode(ctx, node, cmd) + if execConnection != nil { + defer execConnection.Close() + } if err != nil { if execConnection != nil && execConnection.Reader != nil { logs, err := ioutil.ReadAll(execConnection.Reader) diff --git a/pkg/runtimes/docker/util.go b/pkg/runtimes/docker/util.go index e5d2a8e9..69e61f3a 100644 --- a/pkg/runtimes/docker/util.go +++ b/pkg/runtimes/docker/util.go @@ -149,6 +149,7 @@ func (d Docker) ReadFromNode(ctx context.Context, path string, node *k3d.Node) ( if err != nil { return nil, fmt.Errorf("failed to get docker client: %w", err) } + defer docker.Close() reader, _, err := docker.CopyFromContainer(ctx, nodeContainer.ID, path) if err != nil {