diff --git a/compute/metadata/metadata.go b/compute/metadata/metadata.go index b6e1f7b614d..5dbe77cc79c 100644 --- a/compute/metadata/metadata.go +++ b/compute/metadata/metadata.go @@ -323,7 +323,7 @@ func (c *Client) getETag(suffix string) (value, etag string, err error) { break } if reqErr != nil { - return "", "", nil + return "", "", reqErr } defer res.Body.Close() if res.StatusCode == http.StatusNotFound { diff --git a/compute/metadata/metadata_go113_test.go b/compute/metadata/metadata_go113_test.go index 94e2594c1c9..c9d32bf9493 100644 --- a/compute/metadata/metadata_go113_test.go +++ b/compute/metadata/metadata_go113_test.go @@ -32,6 +32,7 @@ func TestRetry(t *testing.T) { failCode int failErr error response string + expectError bool }{ { name: "no retries", @@ -49,6 +50,12 @@ func TestRetry(t *testing.T) { failErr: io.ErrUnexpectedEOF, timesToFail: 1, }, + { + name: "retry io.ErrUnexpectedEOF permanent", + failErr: io.ErrUnexpectedEOF, + timesToFail: maxRetryAttempts + 1, + expectError: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -60,15 +67,23 @@ func TestRetry(t *testing.T) { } c := NewClient(&http.Client{Transport: ft}) s, err := c.Get("") - if err != nil { + if tt.expectError && err == nil { + t.Fatalf("did not receive expected error") + } else if !tt.expectError && err != nil { t.Fatalf("unexpected error: %v", err) } - if ft.called != ft.failedAttempts+1 { - t.Fatalf("failed %d times, want %d", ft.called, ft.failedAttempts+1) - } - if s != tt.response { + + expectedCount := ft.failedAttempts + 1 + if tt.expectError { + expectedCount = ft.failedAttempts + } else if s != tt.response { + // Responses are only meaningful if err == nil t.Fatalf("c.Get() = %q, want %q", s, tt.response) } + + if ft.called != expectedCount { + t.Fatalf("failed %d times, want %d", ft.called, expectedCount) + } }) } }