isRetryableError checks for transient connection errors worth retrying: DNS failures, connection refused, and server 5xx.
(err error)
| 69 | // isRetryableError checks for transient connection errors worth |
| 70 | // retrying: DNS failures, connection refused, and server 5xx. |
| 71 | func isRetryableError(err error) bool { |
| 72 | if err == nil || xerrors.Is(err, context.Canceled) { |
| 73 | return false |
| 74 | } |
| 75 | // Check connection errors before context.DeadlineExceeded because |
| 76 | // net.Dialer.Timeout produces *net.OpError that matches both. |
| 77 | if codersdk.IsConnectionError(err) { |
| 78 | return true |
| 79 | } |
| 80 | if xerrors.Is(err, context.DeadlineExceeded) { |
| 81 | return false |
| 82 | } |
| 83 | var sdkErr *codersdk.Error |
| 84 | if xerrors.As(err, &sdkErr) { |
| 85 | return sdkErr.StatusCode() >= 500 |
| 86 | } |
| 87 | return false |
| 88 | } |
| 89 | |
| 90 | // retryWithInterval calls fn up to maxAttempts times, waiting |
| 91 | // interval between attempts. Stops on success, non-retryable |