Zoekt: [Rails] Allow indexing projects without a repository

Background

Currently, we have two issues with indexing non-existing and empty repositories:

  • empty_repo? check that blows up when used with non-existing repositories
  • gitaly_payload that blows up when used with such a repository

Proposal

We should:

  1. Replace project.empty_repo? with !project.repo_exists?
  2. Allow returning empty gitaly connection info if there's no repository, or it's empty (!project.repo_exists?) to fix the existing exceptions (please guard this via ::Search::Zoekt.skip_empty_repositories? or another FF) to ensure that we update the indexer before enabling the FF
  3. Send a flag MissingRepo: !project.repo_exists? as part of the index_repo_payload
Click to expand

Potential diff:

diff --git i/ee/app/services/search/zoekt/indexing_task_service.rb w/ee/app/services/search/zoekt/indexing_task_service.rb
index fcef625db549..756cc7ff9140 100644
--- i/ee/app/services/search/zoekt/indexing_task_service.rb
+++ w/ee/app/services/search/zoekt/indexing_task_service.rb
@@ -57,7 +57,7 @@ def logger
       def preflight_check?
         return true if task_type == :delete_repo
         return false unless project
-        return false if ::Search::Zoekt.skip_empty_repositories? && project.empty_repo?
+        return false if ::Search::Zoekt.skip_empty_repositories? && !project.repo_exists?
 
         true
       end
diff --git i/ee/app/services/search/zoekt/task_serializer_service.rb w/ee/app/services/search/zoekt/task_serializer_service.rb
index 957d62f57311..41356955f142 100644
--- i/ee/app/services/search/zoekt/task_serializer_service.rb
+++ w/ee/app/services/search/zoekt/task_serializer_service.rb
@@ -101,6 +101,8 @@ def delete_graph_repo_payload
       end
 
       def gitaly_payload(project)
+        return {} unless project.repo_exists?
+
         repository_storage = project.repository_storage
         connection_info = Gitlab::GitalyClient.connection_data(repository_storage)
         repository_path = "#{project.repository.disk_path}.git"

Note

We might have other empty_repo? checks in the Zoekt codebase. Ideally, we should replace these as well

Edited by Dmitry Gruzd