| 585 | } |
| 586 | lastErr = err |
| 587 | var oe *originStatusError |
| 588 | if errors.As(err, &oe) { |
| 589 | originSpan.SetAttributes(attribute.Int("http.response.status_code", oe.status)) |
| 590 | } |
| 591 | if err := r.Context().Err(); err != nil { |
| 592 | originSpan.SetStatus(codes.Error, err.Error()) |
| 593 | return err |
| 594 | } |
| 595 | if i == attempts || !isRetriableOriginFetchError(err) { |
| 596 | originSpan.SetStatus(codes.Error, err.Error()) |
| 597 | return err |
| 598 | } |
| 599 | |
| 600 | delay := jitteredOriginRetryDelay(backoff, p.originRetryMaxBackoff) |
| 601 | slog.Warn("Origin fetch failed with retriable error, retrying.", |
| 602 | "url", r.URL.String(), |
| 603 | "range", r.Header.Get("Range"), |
| 604 | "attempt", i, |
| 605 | "max_attempts", attempts, |
| 606 | "backoff", delay, |
| 607 | "error", err) |
| 608 | if !sleepContext(r.Context(), delay) { |
| 609 | err := r.Context().Err() |
| 610 | if err == nil { |
| 611 | err = context.Canceled |
| 612 | } |
| 613 | originSpan.SetStatus(codes.Error, err.Error()) |
| 614 | return err |
| 615 | } |