Zoekt: Only enable global search when nodes are online

What does this MR do and why?

This is related to Zoekt attempts to search offline nodes (#543145 - closed)

I've discovered that Search::Zoekt::RoutingService returns offline nodes

Steps to reproduce

  1. Stop Zoekt processes
  2. Wait until the nodes are offline
  3. Execute
    Search::Zoekt::RoutingService.execute(Project.where(id: [7]))
  4. It will return offline nodes

This MR fixes this problem by ensuring that we only return online nodes.

Query plans

Before

def before
  ActiveRecord::Base.logger = Logger.new $stdout

  projects = Project.inside_path('gitlab-org')

  projects.without_order.joins(zoekt_repositories: { zoekt_index: { replica: :zoekt_enabled_namespace } })
    .merge(Search::Zoekt::EnabledNamespace.search_enabled).merge(Search::Zoekt::Replica.ready)
    .pluck(:id, :zoekt_node_id)

  true
end

After

def after
  ActiveRecord::Base.logger = Logger.new $stdout

  projects = Project.inside_path('gitlab-org')

  projects.without_order
    .joins(zoekt_repositories: { zoekt_index: { replica: :zoekt_enabled_namespace, node: nil } })
    .merge(Search::Zoekt::EnabledNamespace.search_enabled)
    .merge(Search::Zoekt::Replica.ready)
    .merge(Search::Zoekt::Node.online)
    .pluck(:id, :zoekt_node_id)

  true
end

References

Screenshots or screen recordings

Before After

How to set up and validate locally

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Related to #550604 (closed)

Edited by Dmitry Gruzd

Merge request reports

Loading