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

housekeeping_service.rb 2.23 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
10 11
    # Timeout set to 24h
    LEASE_TIMEOUT = 86400
12

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

19 20 21 22 23
    def initialize(project)
      @project = project
    end

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

27 28
      yield if block_given?

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

    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?
84
      Gitlab::CurrentSettings.housekeeping_enabled
Jacob Vosmaer's avatar
Jacob Vosmaer committed
85 86 87
    end

    def gc_period
88
      Gitlab::CurrentSettings.housekeeping_gc_period
Jacob Vosmaer's avatar
Jacob Vosmaer committed
89 90 91
    end

    def full_repack_period
92
      Gitlab::CurrentSettings.housekeeping_full_repack_period
Jacob Vosmaer's avatar
Jacob Vosmaer committed
93 94 95
    end

    def repack_period
96
      Gitlab::CurrentSettings.housekeeping_incremental_repack_period
Jacob Vosmaer's avatar
Jacob Vosmaer committed
97
    end
98 99
  end
end