in client.go [67:92]
func (client *Client) doRetry(ctx context.Context, fun func() error) error {
var err error
for i := 0; i <= client.MaxRetries; i++ {
if ctx.Err() != nil {
return ctx.Err() // ctx canceled, don't retry
}
if err = client.getConn(ctx); err != nil {
continue
}
err = fun()
// check if we have encountered a server-side error before retrying
var ioError *Error
if errors.As(err, &ioError) {
return fmt.Errorf("ZK server returned error: %w", err) // server errors are non-retryable
}
if err != nil {
continue // retry
}
return nil
}
return fmt.Errorf("%w (%d): %v", ErrMaxRetries, client.MaxRetries, err)
}