class Solr::Request::Runner

TODO: Add documentation about request running

Attributes

node_selection_strategy[R]
request[R]
response_parser[R]

Public Class Methods

call(opts) click to toggle source
# File lib/solr/request/runner.rb, line 18
def self.call(opts)
  new(**opts).call
end
new(request:, node_selection_strategy: Solr::Request::DefaultNodeSelectionStrategy, solr_connection: Solr::Connection) click to toggle source
# File lib/solr/request/runner.rb, line 22
def initialize(request:,
               node_selection_strategy: Solr::Request::DefaultNodeSelectionStrategy,
               solr_connection: Solr::Connection)
  @request = request
  @response_parser = response_parser
  @node_selection_strategy = node_selection_strategy
  @solr_connection = solr_connection
end

Public Instance Methods

call() click to toggle source
# File lib/solr/request/runner.rb, line 31
def call
  solr_url_errors = {}
  solr_urls.each do |node_url|
    request_url = build_request_url(url: node_url,
                                    path: request.path,
                                    url_params: request.url_params)
    begin
      raw_response = @solr_connection.call(url: request_url.to_s, method: request.method, body: request.body)
      solr_response = Solr::Response::Parser.call(raw_response)
      raise Solr::Errors::SolrQueryError, solr_response.error_message unless solr_response.ok?
      return solr_response
    rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::EADDRNOTAVAIL, Timeout::Error => e
      if Solr.master_slave_enabled?
        Solr.configuration.nodes_gray_list.add(node_url)
      end
      solr_url_errors[node_url] = "#{e.class.name} - #{e.message}"
      # Try next node
    end
  end

  raise Solr::Errors::SolrConnectionFailedError.new(solr_url_errors)
end

Private Instance Methods

collection_name() click to toggle source
# File lib/solr/request/runner.rb, line 72
def collection_name
  Solr.current_core_config.name
end
solr_urls() click to toggle source
# File lib/solr/request/runner.rb, line 56
def solr_urls
  @solr_urls ||= begin
    urls = if Solr.node_url_override
      [File.join(Solr.node_url_override, collection_name.to_s)]
    elsif Solr.cloud_enabled? || Solr.master_slave_enabled?
      node_selection_strategy.call(collection_name)
    else
      [Solr.current_core_config.url]
    end
    unless urls && urls.any?
      raise Solr::Errors::NoActiveSolrNodesError
    end
    urls
  end
end