Class: ProjectCacheWorker

Inherits:
Object
  • Object
show all
Includes:
ApplicationWorker
Defined in:
app/workers/project_cache_worker.rb

Overview

Worker for updating any project specific caches.

Constant Summary collapse

LEASE_TIMEOUT =
15.minutes.to_i

Constants included from ApplicationWorker

ApplicationWorker::LOGGING_EXTRA_KEY

Constants included from WorkerAttributes

WorkerAttributes::NAMESPACE_WEIGHTS, WorkerAttributes::VALID_RESOURCE_BOUNDARIES, WorkerAttributes::VALID_URGENCIES

Instance Method Summary collapse

Methods included from Gitlab::SidekiqVersioning::Worker

#job_version

Methods included from WorkerContext

#with_context

Instance Method Details

#perform(project_id, files = [], statistics = [], refresh_statistics = true) ⇒ Object

project_id - The ID of the project for which to flush the cache. files - An Array containing extra types of files to refresh such as

`:readme` to flush the README and `:changelog` to flush the
CHANGELOG.

statistics - An Array containing columns from ProjectStatistics to

refresh, if empty all columns will be refreshed

refresh_statistics - A boolean that determines whether project statistics should

be updated.

rubocop: disable CodeReuse/ActiveRecord


22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'app/workers/project_cache_worker.rb', line 22

def perform(project_id, files = [], statistics = [], refresh_statistics = true)
  project = Project.find_by(id: project_id)

  return unless project

  update_statistics(project, statistics) if refresh_statistics

  return unless project.repository.exists?

  project.repository.refresh_method_caches(files.map(&:to_sym))

  project.cleanup
end

#update_statistics(project, statistics = []) ⇒ Object

NOTE: triggering both an immediate update and one in 15 minutes if we successfully obtain the lease. That way, we only need to wait for the statistics to become accurate if they were already updated once in the last 15 minutes.


41
42
43
44
45
46
47
48
# File 'app/workers/project_cache_worker.rb', line 41

def update_statistics(project, statistics = [])
  return if Gitlab::Database.read_only?
  return unless try_obtain_lease_for(project.id, statistics)

  Projects::UpdateStatisticsService.new(project, nil, statistics: statistics).execute

  UpdateProjectStatisticsWorker.perform_in(LEASE_TIMEOUT, project.id, statistics)
end