diff options
Diffstat (limited to 'app/models/project.rb')
-rw-r--r-- | app/models/project.rb | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/app/models/project.rb b/app/models/project.rb index 9e736a3b03c..f5dc58cd67f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1585,6 +1585,7 @@ class Project < ActiveRecord::Base import_state.remove_jid update_project_counter_caches after_create_default_branch + join_pool_repository refresh_markdown_cache! end @@ -1981,8 +1982,48 @@ class Project < ActiveRecord::Base Gitlab::CurrentSettings.max_attachment_size.megabytes.to_i end + def object_pool_params + return {} unless !forked? && git_objects_poolable? + + { + repository_storage: repository_storage, + pool_repository: pool_repository || create_new_pool_repository + } + end + + # Git objects are only poolable when the project is or has: + # - Hashed storage -> The object pool will have a remote to its members, using relative paths. + # If the repository path changes we would have to update the remote. + # - Public -> User will be able to fetch Git objects that might not exist + # in their own repository. + # - Repository -> Else the disk path will be empty, and there's nothing to pool + def git_objects_poolable? + hashed_storage?(:repository) && + public? && + repository_exists? && + Gitlab::CurrentSettings.hashed_storage_enabled && + Feature.enabled?(:object_pools, self) + end + private + def create_new_pool_repository + pool = begin + create_or_find_pool_repository!(shard: Shard.by_name(repository_storage), source_project: self) + rescue ActiveRecord::RecordNotUnique + retry + end + + pool.schedule + pool + end + + def join_pool_repository + return unless pool_repository + + ObjectPool::JoinWorker.perform_async(pool_repository.id, self.id) + end + def use_hashed_storage if self.new_record? && Gitlab::CurrentSettings.hashed_storage_enabled self.storage_version = LATEST_STORAGE_VERSION |