@@ -31,6 +31,7 @@ type bodyReader struct {
31
31
32
32
body io.ReadCloser // The currently open connection we use to read data, or nil if there is nothing to read from / close.
33
33
lastRetryOffset int64
34
+ lastRetryTime time.Time // time.Time{} if N/A
34
35
offset int64 // Current offset within the blob
35
36
lastSuccessTime time.Time // time.Time{} if N/A
36
37
}
@@ -52,7 +53,9 @@ func newBodyReader(ctx context.Context, c *dockerClient, path string, firstBody
52
53
53
54
body : firstBody ,
54
55
lastRetryOffset : 0 ,
56
+ lastRetryTime : time.Time {},
55
57
offset : 0 ,
58
+ lastSuccessTime : time.Time {},
56
59
}
57
60
return res , nil
58
61
}
@@ -190,6 +193,7 @@ func (br *bodyReader) Read(p []byte) (int, error) {
190
193
consumedBody = true
191
194
br .body = res .Body
192
195
br .lastRetryOffset = br .offset
196
+ br .lastRetryTime = time.Time {}
193
197
return n , nil
194
198
195
199
default :
@@ -212,14 +216,15 @@ func millisecondsSinceOptional(currentTime time.Time, tm time.Time) float64 {
212
216
func (br * bodyReader ) errorIfNotReconnecting (originalErr error , redactedURL string ) error {
213
217
currentTime := time .Now ()
214
218
msSinceFirstConnection := millisecondsSinceOptional (currentTime , br .firstConnectionTime )
219
+ msSinceLastRetry := millisecondsSinceOptional (currentTime , br .lastRetryTime )
215
220
msSinceLastSuccess := millisecondsSinceOptional (currentTime , br .lastSuccessTime )
216
- logrus .Debugf ("Reading blob body from %s failed (%#v), decision inputs: lastRetryOffset %d, offset %d, % .3f ms since first connection, %.3f ms since last progress" ,
217
- redactedURL , originalErr , br .lastRetryOffset , br .offset , msSinceFirstConnection , msSinceLastSuccess )
221
+ logrus .Debugf ("Reading blob body from %s failed (%#v), decision inputs: total %d @% .3f ms, last retry %d @ %.3f ms, last progress @%.3f ms " ,
222
+ redactedURL , originalErr , br .offset , msSinceFirstConnection , br .lastRetryOffset , msSinceLastRetry , msSinceLastSuccess )
218
223
progress := br .offset - br .lastRetryOffset
219
224
if progress < bodyReaderMinimumProgress {
220
225
logrus .Debugf ("Not reconnecting to %s because only %d bytes progress made" , redactedURL , progress )
221
- return fmt .Errorf ("(heuristic tuning data: last retry %d, current offset %d; %.3f ms total, %.3f ms since progress ): %w" ,
222
- br .lastRetryOffset , br .offset , msSinceFirstConnection , msSinceLastSuccess , originalErr )
226
+ return fmt .Errorf ("(heuristic tuning data: total %d @%.3f ms, last retry %d @ %.3f ms, last progress @ %.3f ms): %w" ,
227
+ br .offset , msSinceFirstConnection , br .lastRetryOffset , msSinceLastRetry , msSinceLastSuccess , originalErr )
223
228
}
224
229
logrus .Infof ("Reading blob body from %s failed (%v), reconnecting…" , redactedURL , originalErr )
225
230
return nil
0 commit comments