in retry.go [31:65]
func retryPredicate(err error) (shouldRetry bool) {
if err == nil {
return
}
s, ok := status.FromError(err)
// Non-status based error conditions.
if !ok {
// EOF can happen in the case of connection close.
if errors.Is(err, io.EOF) {
shouldRetry = true
return
}
// All other non-status errors are treated as non-retryable (including context errors).
return
}
switch s.Code() {
case codes.Aborted,
codes.Canceled,
codes.DeadlineExceeded,
codes.FailedPrecondition,
codes.Internal,
codes.Unavailable:
shouldRetry = true
return
case codes.ResourceExhausted:
if strings.HasPrefix(s.Message(), "Exceeds 'AppendRows throughput' quota") {
// Note: internal b/246031522 opened to give this a structured error
// And avoid string parsing. Should be a QuotaFailure or similar.
shouldRetry = true
return
}
}
return
}