diff options
author | John Cai <jcai@gitlab.com> | 2019-04-23 10:32:06 -0700 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2019-05-21 13:34:31 -0700 |
commit | 6c35fb59b79e7abc321cee65fc1730ce67908b6b (patch) | |
tree | dad50d3e2e3d3df05ac48fc81a93c37ea8c8c482 /app/services/projects | |
parent | bb5bbbaa1a64d18108470132bb2ed8ed5da52ce7 (diff) | |
download | gitlab-ce-6c35fb59b79e7abc321cee65fc1730ce67908b6b.tar.gz |
Add GitDeduplicationService for deduplication housekeepingjc-git-deduplication-service
GitDeduplicationService performs idempotent operations on deduplicated
projects.
Diffstat (limited to 'app/services/projects')
-rw-r--r-- | app/services/projects/git_deduplication_service.rb | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/app/services/projects/git_deduplication_service.rb b/app/services/projects/git_deduplication_service.rb new file mode 100644 index 00000000000..74d469ecf37 --- /dev/null +++ b/app/services/projects/git_deduplication_service.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module Projects + class GitDeduplicationService < BaseService + include ExclusiveLeaseGuard + + LEASE_TIMEOUT = 86400 + + delegate :pool_repository, to: :project + attr_reader :project + + def initialize(project) + @project = project + end + + def execute + try_obtain_lease do + unless project.has_pool_repository? + disconnect_git_alternates + break + end + + if source_project? && pool_can_fetch_from_source? + fetch_from_source + end + + project.link_pool_repository if same_storage_as_pool?(project.repository) + end + end + + private + + def disconnect_git_alternates + project.repository.disconnect_alternates + end + + def pool_can_fetch_from_source? + project.git_objects_poolable? && + same_storage_as_pool?(pool_repository.source_project.repository) + end + + def same_storage_as_pool?(repository) + pool_repository.object_pool.repository.storage == repository.storage + end + + def fetch_from_source + project.pool_repository.object_pool.fetch + end + + def source_project? + return unless project.has_pool_repository? + + project.pool_repository.source_project == project + end + + def lease_timeout + LEASE_TIMEOUT + end + + def lease_key + "git_deduplication:#{project.id}" + end + end +end |