@@ -82,6 +82,12 @@ func (r *RequestConstructionError) Error() string {
82
82
83
83
var noBackoff = & NoBackoff {}
84
84
85
+ type requestRetryFunc func (maxRetries int ) WithRetry
86
+
87
+ func defaultRequestRetryFn (maxRetries int ) WithRetry {
88
+ return & withRetry {maxRetries : maxRetries }
89
+ }
90
+
85
91
// Request allows for building up a request to a server in a chained fashion.
86
92
// Any errors are stored until the end of your call, so you only have to
87
93
// check once.
@@ -93,6 +99,7 @@ type Request struct {
93
99
rateLimiter flowcontrol.RateLimiter
94
100
backoff BackoffManager
95
101
timeout time.Duration
102
+ maxRetries int
96
103
97
104
// generic components accessible via method setters
98
105
verb string
@@ -109,9 +116,10 @@ type Request struct {
109
116
subresource string
110
117
111
118
// output
112
- err error
113
- body io.Reader
114
- retry WithRetry
119
+ err error
120
+ body io.Reader
121
+
122
+ retryFn requestRetryFunc
115
123
}
116
124
117
125
// NewRequest creates a new request helper object for accessing runtime.Objects on a server.
@@ -142,7 +150,8 @@ func NewRequest(c *RESTClient) *Request {
142
150
backoff : backoff ,
143
151
timeout : timeout ,
144
152
pathPrefix : pathPrefix ,
145
- retry : & withRetry {maxRetries : 10 },
153
+ maxRetries : 10 ,
154
+ retryFn : defaultRequestRetryFn ,
146
155
warningHandler : c .warningHandler ,
147
156
}
148
157
@@ -408,7 +417,10 @@ func (r *Request) Timeout(d time.Duration) *Request {
408
417
// function is specifically called with a different value.
409
418
// A zero maxRetries prevent it from doing retires and return an error immediately.
410
419
func (r * Request ) MaxRetries (maxRetries int ) * Request {
411
- r .retry .SetMaxRetries (maxRetries )
420
+ if maxRetries < 0 {
421
+ maxRetries = 0
422
+ }
423
+ r .maxRetries = maxRetries
412
424
return r
413
425
}
414
426
@@ -612,27 +624,29 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) {
612
624
}
613
625
return false
614
626
}
627
+ retry := r .retryFn (r .maxRetries )
615
628
url := r .URL ().String ()
616
629
for {
617
- if err := r . retry .Before (ctx , r ); err != nil {
618
- return nil , r . retry .WrapPreviousError (err )
630
+ if err := retry .Before (ctx , r ); err != nil {
631
+ return nil , retry .WrapPreviousError (err )
619
632
}
620
633
621
634
req , err := r .newHTTPRequest (ctx )
622
635
if err != nil {
623
636
return nil , err
624
637
}
638
+
625
639
resp , err := client .Do (req )
626
640
updateURLMetrics (ctx , r , resp , err )
627
- r . retry .After (ctx , r , resp , err )
641
+ retry .After (ctx , r , resp , err )
628
642
if err == nil && resp .StatusCode == http .StatusOK {
629
643
return r .newStreamWatcher (resp )
630
644
}
631
645
632
646
done , transformErr := func () (bool , error ) {
633
647
defer readAndCloseResponseBody (resp )
634
648
635
- if r . retry .IsNextRetry (ctx , r , req , resp , err , isErrRetryableFunc ) {
649
+ if retry .IsNextRetry (ctx , r , req , resp , err , isErrRetryableFunc ) {
636
650
return false , nil
637
651
}
638
652
@@ -654,7 +668,7 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) {
654
668
// we need to return the error object from that.
655
669
err = transformErr
656
670
}
657
- return nil , r . retry .WrapPreviousError (err )
671
+ return nil , retry .WrapPreviousError (err )
658
672
}
659
673
}
660
674
}
@@ -719,9 +733,10 @@ func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) {
719
733
client = http .DefaultClient
720
734
}
721
735
736
+ retry := r .retryFn (r .maxRetries )
722
737
url := r .URL ().String ()
723
738
for {
724
- if err := r . retry .Before (ctx , r ); err != nil {
739
+ if err := retry .Before (ctx , r ); err != nil {
725
740
return nil , err
726
741
}
727
742
@@ -734,7 +749,7 @@ func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) {
734
749
}
735
750
resp , err := client .Do (req )
736
751
updateURLMetrics (ctx , r , resp , err )
737
- r . retry .After (ctx , r , resp , err )
752
+ retry .After (ctx , r , resp , err )
738
753
if err != nil {
739
754
// we only retry on an HTTP response with 'Retry-After' header
740
755
return nil , err
@@ -749,7 +764,7 @@ func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) {
749
764
done , transformErr := func () (bool , error ) {
750
765
defer resp .Body .Close ()
751
766
752
- if r . retry .IsNextRetry (ctx , r , req , resp , err , neverRetryError ) {
767
+ if retry .IsNextRetry (ctx , r , req , resp , err , neverRetryError ) {
753
768
return false , nil
754
769
}
755
770
result := r .transformResponse (resp , req )
@@ -856,9 +871,10 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp
856
871
}
857
872
858
873
// Right now we make about ten retry attempts if we get a Retry-After response.
874
+ retry := r .retryFn (r .maxRetries )
859
875
for {
860
- if err := r . retry .Before (ctx , r ); err != nil {
861
- return r . retry .WrapPreviousError (err )
876
+ if err := retry .Before (ctx , r ); err != nil {
877
+ return retry .WrapPreviousError (err )
862
878
}
863
879
req , err := r .newHTTPRequest (ctx )
864
880
if err != nil {
@@ -871,7 +887,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp
871
887
if req .ContentLength >= 0 && ! (req .Body != nil && req .ContentLength == 0 ) {
872
888
metrics .RequestSize .Observe (ctx , r .verb , r .URL ().Host , float64 (req .ContentLength ))
873
889
}
874
- r . retry .After (ctx , r , resp , err )
890
+ retry .After (ctx , r , resp , err )
875
891
876
892
done := func () bool {
877
893
defer readAndCloseResponseBody (resp )
@@ -884,15 +900,15 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp
884
900
fn (req , resp )
885
901
}
886
902
887
- if r . retry .IsNextRetry (ctx , r , req , resp , err , isErrRetryableFunc ) {
903
+ if retry .IsNextRetry (ctx , r , req , resp , err , isErrRetryableFunc ) {
888
904
return false
889
905
}
890
906
891
907
f (req , resp )
892
908
return true
893
909
}()
894
910
if done {
895
- return r . retry .WrapPreviousError (err )
911
+ return retry .WrapPreviousError (err )
896
912
}
897
913
}
898
914
}
0 commit comments