summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Rodríguez <alejorro70@gmail.com>2016-09-20 20:39:30 -0300
committerAlejandro Rodríguez <alejorro70@gmail.com>2016-09-20 20:39:30 -0300
commita878cf13734bfaa0f1f0db187a4a4aa436057be5 (patch)
tree043920023bb71abf311eca44f62b1443bf63a859
parent894d8c16866b58e74791c933968a5a08c7aeb901 (diff)
downloadgitlab-shell-ionice-mv.tar.gz
Set a low IO priority for storage moves to lower performance impactionice-mv
-rw-r--r--CHANGELOG3
-rw-r--r--lib/gitlab_projects.rb12
-rw-r--r--spec/gitlab_projects_spec.rb3
3 files changed, 17 insertions, 1 deletions
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