Geo: Non-existent repositories get in a stuck state of never being synched

I took project ID 4498064, which has a non-existent repository on GitLab.com. Then I ran:

irb(main):007:0> serv = Geo::RepositorySyncService.new(proj)

Immediately, I got back:

Gitlab::Git::Repository::NoRepository: 5:GetRepoPath: not a git repository '/var/opt/gitlab/git-data-file12/repositories/namespace/projectgit'
        from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/git/repository.rb:1340:in `rescue in gitaly_migrate'
        from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/git/repository.rb:1337:in `gitaly_migrate'
        from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/git/repository.rb:202:in `local_branches'
        from /opt/gitlab/embedded/service/gitlab-rails/app/models/repository.rb:750:in `local_branches'
        from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/instrumentation.rb:161:in `branches'
        from /opt/gitlab/embedded/service/gitlab-rails/app/models/repository.rb:349:in `expire_branch_cache'
        from /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/instrumentation.rb:161:in `expire_branch_cache'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/models/ee/repository.rb:21:in `after_sync'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/services/geo/repository_sync_service.rb:44:in `expire_repository_caches'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/services/geo/repository_sync_service.rb:31:in `sync_repository'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/services/geo/base_sync_service.rb:33:in `block in execute'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/services/concerns/exclusive_lease_guard.rb:22:in `try_obtain_lease'
        from /opt/gitlab/embedded/service/gitlab-rails/ee/app/services/geo/base_sync_service.rb:27:in `execute'
        from (irb):7
        from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/console.rb:110:in `start'
        from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/console.rb:9:in `start'
        from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:9:in `require'
        from bin/rails:9:in `<main>'

I think what happens:

  1. We attempt to download this repo from GitLab.com
  2. We receive a Gitlab::Git::Repository::NoRepository exception somewhere, so https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/4757/diffs doesn't ever get the chance to mark this repo as sync
  3. We mark this repo to be redownloaded
  4. Repeat step 1
Assignee Loading
Time tracking Loading