Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrate/20170523085324_migrate_old_traces.rb')
-rw-r--r--db/migrate/20170523085324_migrate_old_traces.rb79
1 files changed, 79 insertions, 0 deletions
diff --git a/db/migrate/20170523085324_migrate_old_traces.rb b/db/migrate/20170523085324_migrate_old_traces.rb
new file mode 100644
index 00000000000..473a1bebf46
--- /dev/null
+++ b/db/migrate/20170523085324_migrate_old_traces.rb
@@ -0,0 +1,79 @@
+require 'work_queue'
+
+class MigrateOldTraces < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ builds_with_traces(min_id || 0).each do |build|
+ work_queue.enqueue_b do
+ migrate_trace(build)
+ end
+ end
+
+ ensure
+ work_queue.join
+ end
+
+ def down
+ end
+
+ private
+
+ def migrate_trace(build)
+ source = source_trace(build)
+ target = target_trace(build)
+ return unless File.exists?(source)
+
+ ensure_path(target)
+ FileUtils.move(source, target)
+ end
+
+ def ensure_path(path)
+ directory = File.dirname(path)
+ unless Dir.exist?(default_directory)
+ FileUtils.mkdir_p(directory)
+ end
+ end
+
+ def source_trace(build)
+ File.join(Gitlab.config.gitlab_ci.builds_path,
+ build['created_at'].utc.strftime('%Y_%m'),
+ build['ci_id'].to_s,
+ build['id'].to_s + ".log")
+ end
+
+ def target_trace(build)
+ File.join(Gitlab.config.gitlab_ci.builds_path,
+ build['created_at'].utc.strftime('%Y_%m'),
+ build['project_id'].to_s,
+ build['id'].to_s + ".log")
+ end
+
+ def min_id
+ select_value <<-SQL.strip_heredoc
+ SELECT min(ci_builds.id) as min_id FROM ci_builds
+ JOIN projects ON ci_builds.project_id = projects.id
+ AND projects.ci_id IS NULL
+ SQL
+ end
+
+ def builds_with_traces(before_id)
+ select_all <<-SQL.strip_heredoc
+ SELECT ci_builds.id, ci_builds.project_id,
+ projects.ci_id, ci_builds.created_at
+ FROM ci_builds
+ JOIN projects ON ci_builds.project_id = projects.id
+ WHERE ci_builds.id < #{before_id}
+ AND ci_builds.erased_at IS NULL
+ AND projects.ci_id IS NOT NULL
+ SQL
+ end
+
+ def work_queue
+ @work_queue ||= WorkQueue.new(10)
+ end
+end