65 lines
1.3 KiB
Ruby
65 lines
1.3 KiB
Ruby
|
# 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
|