GitLab wurde erfolgreich aktualisiert. Durch regelmäßige Updates bleibt das THM GitLab sicher. Danke für Ihre Geduld.

housekeeping_service.rb 2.25 KB
Newer Older
1 2 3 4 5
# Projects::HousekeepingService class
#
# Used for git housekeeping
#
# Ex.
6
#   Projects::HousekeepingService.new(project).execute
7 8 9
#
module Projects
  class HousekeepingService < BaseService
Jacob Vosmaer's avatar
Jacob Vosmaer committed
10 11
    include Gitlab::CurrentSettings

12 13
    # Timeout set to 24h
    LEASE_TIMEOUT = 86400
14

15 16 17 18 19 20
    class LeaseTaken < StandardError
      def to_s
        "Somebody already triggered housekeeping for this project in the past #{LEASE_TIMEOUT / 60} minutes"
      end
    end

21 22 23 24 25
    def initialize(project)
      @project = project
    end

    def execute
Jacob Vosmaer's avatar
Jacob Vosmaer committed
26 27
      lease_uuid = try_obtain_lease
      raise LeaseTaken unless lease_uuid.present?
Jacob Vosmaer's avatar
Jacob Vosmaer committed
28

Jacob Vosmaer's avatar
Jacob Vosmaer committed
29
      execute_gitlab_shell_gc(lease_uuid)
Jacob Vosmaer's avatar
Jacob Vosmaer committed
30 31 32
    end

    def needed?
Jacob Vosmaer's avatar
Jacob Vosmaer committed
33
      pushes_since_gc > 0 && period_match? && housekeeping_enabled?
Jacob Vosmaer's avatar
Jacob Vosmaer committed
34 35 36
    end

    def increment!
Yorick Peterse's avatar
Yorick Peterse committed
37 38
      Gitlab::Metrics.measure(:increment_pushes_since_gc) do
        @project.increment_pushes_since_gc
39
      end
40 41 42 43
    end

    private

Jacob Vosmaer's avatar
Jacob Vosmaer committed
44 45
    def execute_gitlab_shell_gc(lease_uuid)
      GitGarbageCollectWorker.perform_async(@project.id, task, lease_key, lease_uuid)
46
    ensure
Jacob Vosmaer's avatar
Jacob Vosmaer committed
47 48 49 50
      if pushes_since_gc >= gc_period
        Gitlab::Metrics.measure(:reset_pushes_since_gc) do
          @project.reset_pushes_since_gc
        end
51 52 53
      end
    end

54
    def try_obtain_lease
55
      Gitlab::Metrics.measure(:obtain_housekeeping_lease) do
Jacob Vosmaer's avatar
Jacob Vosmaer committed
56
        lease = ::Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT)
57 58
        lease.try_obtain
      end
59
    end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

    def lease_key
      "project_housekeeping:#{@project.id}"
    end

    def pushes_since_gc
      @project.pushes_since_gc
    end

    def task
      if pushes_since_gc % gc_period == 0
        :gc
      elsif pushes_since_gc % full_repack_period == 0
        :full_repack
      else
        :incremental_repack
      end
    end

    def period_match?
      [gc_period, full_repack_period, repack_period].any? { |period| pushes_since_gc % period == 0 }
    end

    def housekeeping_enabled?
      current_application_settings.housekeeping_enabled
    end

    def gc_period
      current_application_settings.housekeeping_gc_period
    end

    def full_repack_period
      current_application_settings.housekeeping_full_repack_period
    end

    def repack_period
      current_application_settings.housekeeping_incremental_repack_period
    end
98 99
  end
end