From 13718846d8fd33d7543c448ac2d33184e25431d4 Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Thu, 9 Jun 2016 14:13:27 -0700 Subject: [PATCH] In case of i/o timeout error in kubectl e2e, try talking to the server again after 2s before dying --- test/e2e/framework/util.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 4d6567fe3c3..5a860f46be0 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -1839,10 +1839,33 @@ func (b kubectlBuilder) WithStdinReader(reader io.Reader) *kubectlBuilder { func (b kubectlBuilder) ExecOrDie() string { str, err := b.Exec() Logf("stdout: %q", str) + // In case of i/o timeout error, try talking to the apiserver again after 2s before dying. + // Note that we're still dying after retrying so that we can get visibility to triage it further. + if isTimeout(err) { + Logf("Hit i/o timeout error, talking to the server 2s later to see if it's temporary.") + time.Sleep(2 * time.Second) + retryStr, retryErr := RunKubectl("version") + Logf("stdout: %q", retryStr) + Logf("err: %v", retryErr) + } Expect(err).NotTo(HaveOccurred()) return str } +func isTimeout(err error) bool { + switch err := err.(type) { + case net.Error: + if err.Timeout() { + return true + } + case *url.Error: + if err, ok := err.Err.(net.Error); ok && err.Timeout() { + return true + } + } + return false +} + func (b kubectlBuilder) Exec() (string, error) { var stdout, stderr bytes.Buffer cmd := b.cmd