# File lib/mongo/retryable.rb, line 39
    def read_with_retry(session = nil)
      attempt = 0
      begin
        attempt += 1
        yield
      rescue Error::SocketError, Error::SocketTimeoutError => e
        if attempt > cluster.max_read_retries || (session && session.in_transaction?)
          raise
        end
        log_retry(e)
        cluster.scan!(false)
        retry
      rescue Error::OperationFailure => e
        if cluster.sharded? && e.retryable? && !(session && session.in_transaction?)
          if attempt > cluster.max_read_retries
            raise
          end
          log_retry(e)
          sleep(cluster.read_retry_interval)
          retry
        else
          raise
        end
      end
    end