From a878cf13734bfaa0f1f0db187a4a4aa436057be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Tue, 20 Sep 2016 20:39:30 -0300 Subject: Set a low IO priority for storage moves to lower performance impact --- CHANGELOG | 3 +++ lib/gitlab_projects.rb | 12 +++++++++++- spec/gitlab_projects_spec.rb | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 94ba641..57b074a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +v3.6.1 + - Set a low IO priority for storage moves to lower performance impact + v3.6.0 - Added full support for `git-lfs-authenticate` to properly handle LFS requests and pass them on to Workhorse diff --git a/lib/gitlab_projects.rb b/lib/gitlab_projects.rb index a40cc4f..3d92cf2 100644 --- a/lib/gitlab_projects.rb +++ b/lib/gitlab_projects.rb @@ -316,7 +316,17 @@ class GitlabProjects if wait_for_pushes $logger.info "Syncing project #{@project_name} from <#{full_path}> to <#{new_full_path}>." - system(*%W(rsync -a --delete #{source_path} #{new_full_path})) + + # Set a low IO priority with ionice to not choke the server on moves + rsync_path = 'ionice -c2 -n7 rsync' + result = system(*%W(#{rsync_path} -a --delete --rsync-path="#{rsync_path}" #{source_path} #{new_full_path})) + + unless result + # If the command fails with `ionice` (maybe because we're on a OS X + # development machine), try again without `ionice`. + rsync_path = 'rsync' + system(*%W(#{rsync_path} -a --delete --rsync-path="#{rsync_path}" #{source_path} #{new_full_path})) + end else $logger.error "mv-storage failed: source path <#{full_path}> is waiting for pushes to finish." false diff --git a/spec/gitlab_projects_spec.rb b/spec/gitlab_projects_spec.rb index 19646e3..bc615d4 100644 --- a/spec/gitlab_projects_spec.rb +++ b/spec/gitlab_projects_spec.rb @@ -212,6 +212,7 @@ describe GitlabProjects do before do FileUtils.mkdir_p(tmp_repo_path) + FileUtils.mkdir_p(File.join(tmp_repo_path, 'hooks')) # Add some contents to copy FileUtils.mkdir_p(alternative_storage_path) allow_any_instance_of(GitlabReferenceCounter).to receive(:value).and_return(0) end @@ -222,6 +223,8 @@ describe GitlabProjects do File.exists?(tmp_repo_path).should be_true gl_projects.exec File.exists?(new_repo_path).should be_true + # Make sure the target directory isn't empty (i.e. contents were copied) + FileUtils.cd(new_repo_path) { Dir['**/*'].length.should_not be(0) } end it "should fail if no destination path is provided" do -- cgit v1.2.1