mirror of
https://github.com/kubernetes/client-go.git
synced 2025-07-20 10:00:23 +00:00
return reasonable error when connection closed
Kubernetes-commit: 4de18dec2ba284657c89f7b6e1074385dc1d1baf
This commit is contained in:
parent
00f65f7d44
commit
f62736c05e
@ -58,6 +58,7 @@ go_library(
|
|||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/golang.org/x/net/http2:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
@ -33,6 +33,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
"golang.org/x/net/http2"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -744,8 +745,29 @@ func (r *Request) DoRaw() ([]byte, error) {
|
|||||||
func (r *Request) transformResponse(resp *http.Response, req *http.Request) Result {
|
func (r *Request) transformResponse(resp *http.Response, req *http.Request) Result {
|
||||||
var body []byte
|
var body []byte
|
||||||
if resp.Body != nil {
|
if resp.Body != nil {
|
||||||
if data, err := ioutil.ReadAll(resp.Body); err == nil {
|
data, err := ioutil.ReadAll(resp.Body)
|
||||||
|
switch err.(type) {
|
||||||
|
case nil:
|
||||||
body = data
|
body = data
|
||||||
|
case http2.StreamError:
|
||||||
|
// This is trying to catch the scenario that the server may close the connection when sending the
|
||||||
|
// response body. This can be caused by server timeout due to a slow network connection.
|
||||||
|
// TODO: Add test for this. Steps may be:
|
||||||
|
// 1. client-go (or kubectl) sends a GET request.
|
||||||
|
// 2. Apiserver sends back the headers and then part of the body
|
||||||
|
// 3. Apiserver closes connection.
|
||||||
|
// 4. client-go should catch this and return an error.
|
||||||
|
glog.V(2).Infof("Stream error %#v when reading response body, may be caused by closed connection.", err)
|
||||||
|
streamErr := fmt.Errorf("Stream error %#v when reading response body, may be caused by closed connection. Please retry.", err)
|
||||||
|
return Result{
|
||||||
|
err: streamErr,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
glog.Errorf("Unexpected error when reading response body: %#v", err)
|
||||||
|
unexpectedErr := fmt.Errorf("Unexpected error %#v when reading response body. Please retry.", err)
|
||||||
|
return Result{
|
||||||
|
err: unexpectedErr,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user