lib/tasks/lint.rake can block indefinitely if stderr fills up
I made the mistake of generating .rubocop_todo.yml
with a newer version of rubocop-rspec present, and this introduced unrecognized cops that the haml_lint
task complained about. Since haml_lint
runs Rubocop in a way that causes config values to be re-read every file (https://github.com/sds/haml-lint/issues/301), I think the static-analysis
jobs got stuck. I suspect the stderr
pipe filled up, and the PID never stopped.
This patch seems to make things go again:
diff --git a/lib/tasks/lint.rake b/lib/tasks/lint.rake
index fa45b092833..7aab53491e6 100644
--- a/lib/tasks/lint.rake
+++ b/lib/tasks/lint.rake
@@ -37,14 +37,8 @@ unless Rails.env.production?
lint:static_verification
].each do |task|
- pid = Process.fork do
- rd_out, wr_out = IO.pipe
- rd_err, wr_err = IO.pipe
- stdout = $stdout.dup
- stderr = $stderr.dup
- $stdout.reopen(wr_out)
- $stderr.reopen(wr_err)
+ pid = Process.fork do
begin
Rake::Task[task].invoke
rescue SystemExit => ex
@@ -54,15 +48,7 @@ unless Rails.env.production?
msg = "*** Rake task #{task} raised #{ex.class}:"
raise ex
ensure
- $stdout.reopen(stdout)
- $stderr.reopen(stderr)
- wr_out.close
- wr_err.close
-
warn "\n#{msg}\n\n" if msg
-
- IO.copy_stream(rd_out, $stdout)
- IO.copy_stream(rd_err, $stderr)
end
end
@rymai @godfat I tested these changes locally, and they seem to do the right thing. I wasn't able to reproduce the same issues as mentioned in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/16732#note_58996412.
Edited by Stan Hu