summaryrefslogtreecommitdiff
path: root/lib/tasks/gitlab/check.rake
diff options
context:
space:
mode:
authorRobert Speicher <robert@gitlab.com>2015-12-15 18:36:28 +0000
committerRobert Speicher <robert@gitlab.com>2015-12-15 18:36:28 +0000
commit28a8d0b5db104be6d01ad647aefcd92ec9ec113e (patch)
tree670077cb83fd37f0b49bc7b135f1f356a4f46309 /lib/tasks/gitlab/check.rake
parent96a1558897c7628f8d49435647f052ec24a63986 (diff)
parentf8bf6c4b2c5fb41ae92df09b9f968d5d5d61bb2b (diff)
downloadgitlab-ce-28a8d0b5db104be6d01ad647aefcd92ec9ec113e.tar.gz
Merge branch 'add_user_repo_integrity_rake_task' into 'master'
Add user repository integrity check rake task Corrupt repositories and stuck lock files can cause weird issues in GitLab. Often we know which user is having these problems and then we have to go hunt down which repository is causing it. Several times recently that involved me running queries in the rails console to get an array of projects and then writing a quick Ruby script to loop through and run `git fsck`. This last time I also had to check for the existence of `config.lock` and ref lock files. This rake task will eliminate all of those steps and allow an admin to simply specify a username. I also added the lock file checks to the existing `gitlab:repo:check` task which goes through all projects. See merge request !2080
Diffstat (limited to 'lib/tasks/gitlab/check.rake')
-rw-r--r--lib/tasks/gitlab/check.rake56
1 files changed, 52 insertions, 4 deletions
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index b5af3d88b4c..0469c5a61c3 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -822,10 +822,27 @@ namespace :gitlab do
namespace_dirs.each do |namespace_dir|
repo_dirs = Dir.glob(File.join(namespace_dir, '*'))
- repo_dirs.each do |dir|
- puts "\nChecking repo at #{dir}"
- system(*%W(#{Gitlab.config.git.bin_path} fsck), chdir: dir)
- end
+ repo_dirs.each { |repo_dir| check_repo_integrity(repo_dir) }
+ end
+ end
+ end
+
+ namespace :user do
+ desc "GitLab | Check the integrity of a specific user's repositories"
+ task :check_repos, [:username] => :environment do |t, args|
+ username = args[:username] || prompt("Check repository integrity for which username? ".blue)
+ user = User.find_by(username: username)
+ if user
+ repo_dirs = user.authorized_projects.map do |p|
+ File.join(
+ Gitlab.config.gitlab_shell.repos_path,
+ "#{p.path_with_namespace}.git"
+ )
+ end
+
+ repo_dirs.each { |repo_dir| check_repo_integrity(repo_dir) }
+ else
+ puts "\nUser '#{username}' not found".red
end
end
end
@@ -952,4 +969,35 @@ namespace :gitlab do
false
end
end
+
+ def check_repo_integrity(repo_dir)
+ puts "\nChecking repo at #{repo_dir.yellow}"
+
+ git_fsck(repo_dir)
+ check_config_lock(repo_dir)
+ check_ref_locks(repo_dir)
+ end
+
+ def git_fsck(repo_dir)
+ puts "Running `git fsck`".yellow
+ system(*%W(#{Gitlab.config.git.bin_path} fsck), chdir: repo_dir)
+ end
+
+ def check_config_lock(repo_dir)
+ config_exists = File.exist?(File.join(repo_dir,'config.lock'))
+ config_output = config_exists ? 'yes'.red : 'no'.green
+ puts "'config.lock' file exists?".yellow + " ... #{config_output}"
+ end
+
+ def check_ref_locks(repo_dir)
+ lock_files = Dir.glob(File.join(repo_dir,'refs/heads/*.lock'))
+ if lock_files.present?
+ puts "Ref lock files exist:".red
+ lock_files.each do |lock_file|
+ puts " #{lock_file}"
+ end
+ else
+ puts "No ref lock files exist".green
+ end
+ end
end