summaryrefslogtreecommitdiff
path: root/app/workers/authorized_projects_worker.rb
blob: fccddb70d189d62d4a84d686d2bca54a008c355a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class AuthorizedProjectsWorker
  include Sidekiq::Worker
  include DedicatedSidekiqQueue

  LEASE_TIMEOUT = 1.minute.to_i

  def self.bulk_perform_async(args_list)
    Sidekiq::Client.push_bulk('class' => self, 'args' => args_list)
  end

  def perform(user_id)
    user = User.find_by(id: user_id)

    refresh(user) if user
  end

  def refresh(user)
    lease_key = "refresh_authorized_projects:#{user.id}"
    lease = Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT)

    until uuid = lease.try_obtain
      # Keep trying until we obtain the lease. If we don't do so we may end up
      # not updating the list of authorized projects properly. To prevent
      # hammering Redis too much we'll wait for a bit between retries.
      sleep(1)
    end

    begin
      user.refresh_authorized_projects
    ensure
      Gitlab::ExclusiveLease.cancel(lease_key, uuid)
    end
  end
end