From 7cff974a79c82fa26f7f05fe530605bb5679d3b7 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Thu, 20 Feb 2020 11:14:37 +0530 Subject: [PATCH] cli: handle panic caused by `linkerd metrics` port-forward failure (#4007) * cli: handle `linkerd metrics` port-forward gracefully - add return for routine in func `Init()` in case of error - add return from func `getMetrics()` if error from `portforward.Init()` * Remove select block at pkg/k8s/portforward.go - It is now the caller's responsibility to call pf.Stop() Signed-off-by: Mayank Shah --- cli/cmd/metrics.go | 1 + pkg/k8s/portforward.go | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/cli/cmd/metrics.go b/cli/cmd/metrics.go index fcc7d77fb..1cfe2e7b9 100644 --- a/cli/cmd/metrics.go +++ b/cli/cmd/metrics.go @@ -165,6 +165,7 @@ func getMetrics( defer portforward.Stop() if err = portforward.Init(); err != nil { fmt.Fprintf(os.Stderr, "Error running port-forward: %s", err) + return nil, err } metricsURL := portforward.URLFor("/metrics") diff --git a/pkg/k8s/portforward.go b/pkg/k8s/portforward.go index 8f5e79f6c..b05e262b2 100644 --- a/pkg/k8s/portforward.go +++ b/pkg/k8s/portforward.go @@ -177,14 +177,7 @@ func (pf *PortForward) Init() error { go func() { if err := pf.run(); err != nil { failure <- err - } - - select { - case <-pf.GetStop(): - // stopCh was closed, do nothing - default: - // pf.run() returned for some other reason, close stopCh - pf.Stop() + return } }() @@ -203,6 +196,7 @@ func (pf *PortForward) Init() error { } // Stop terminates the port-forward connection. +// It is the caller's responsibility to call Stop even in case of errors func (pf *PortForward) Stop() { close(pf.stopCh) }