summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2018-02-06 17:49:00 +0000
committerDouwe Maan <douwe@gitlab.com>2018-02-06 17:49:00 +0000
commit7095c2bf4064911568ae1574752adbc066c5347d (patch)
tree6d82c5ba0928781061185ac365e9bd7a82119cd1
parenta480ee184b88a9945207dc2e4e387bb6ef0c2df9 (diff)
parent285d5d526b1d568580b63488b8832cfc9ef19077 (diff)
downloadgitlab-ce-7095c2bf4064911568ae1574752adbc066c5347d.tar.gz
Merge branch '42730-close-rugged-repository' into 'master'
Resolve "ProjectCacheWorker leaks file descriptors" Closes #42730 See merge request gitlab-org/gitlab-ce!16930
-rw-r--r--app/models/project.rb5
-rw-r--r--app/models/repository.rb4
-rw-r--r--app/workers/project_cache_worker.rb2
-rw-r--r--changelogs/unreleased/42730-close-rugged-repository.yml5
-rw-r--r--lib/gitlab/git/repository.rb4
5 files changed, 19 insertions, 1 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index 12d5f28f5ea..33085151217 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -511,10 +511,13 @@ class Project < ActiveRecord::Base
@repository ||= Repository.new(full_path, self, disk_path: disk_path)
end
- def reload_repository!
+ def cleanup
+ @repository&.cleanup
@repository = nil
end
+ alias_method :reload_repository!, :cleanup
+
def container_registry_url
if Gitlab.config.registry.enabled
"#{Gitlab.config.registry.host_port}/#{full_path.downcase}"
diff --git a/app/models/repository.rb b/app/models/repository.rb
index f1abe5c3e07..3d6f8f0c305 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -93,6 +93,10 @@ class Repository
alias_method :raw, :raw_repository
+ def cleanup
+ @raw_repository&.cleanup
+ end
+
# Return absolute path to repository
def path_to_repo
@path_to_repo ||= File.expand_path(
diff --git a/app/workers/project_cache_worker.rb b/app/workers/project_cache_worker.rb
index f19bcbf946a..a993b4b2680 100644
--- a/app/workers/project_cache_worker.rb
+++ b/app/workers/project_cache_worker.rb
@@ -18,6 +18,8 @@ class ProjectCacheWorker
update_statistics(project, statistics.map(&:to_sym))
project.repository.refresh_method_caches(files.map(&:to_sym))
+
+ project.cleanup
end
def update_statistics(project, statistics = [])
diff --git a/changelogs/unreleased/42730-close-rugged-repository.yml b/changelogs/unreleased/42730-close-rugged-repository.yml
new file mode 100644
index 00000000000..a632f5030a5
--- /dev/null
+++ b/changelogs/unreleased/42730-close-rugged-repository.yml
@@ -0,0 +1,5 @@
+---
+title: Close low level rugged repository in project cache worker
+merge_request: 16930
+author: Bastian Blank
+type: fixed
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index a8260b99661..d7510061def 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -128,6 +128,10 @@ module Gitlab
raise NoRepository.new('no repository for such path')
end
+ def cleanup
+ @rugged&.close
+ end
+
def circuit_breaker
@circuit_breaker ||= Gitlab::Git::Storage::CircuitBreaker.for_storage(storage)
end