Fix broken reports_daemon specs
What does this MR do and why?
It seems that by merging !97532 (merged) we broke some specs.
Surprisingly, they pass on CI but break on my machine (OSX, GDK).
The explanation is:
- For failures 1-5: our CI is on Linux, which means Jemalloc reports would likely work properly not return
nil
. - For 6: This is quite surprising, not failing on CI points to the fact we have
/empty-dir
on CI boxes?🤔
This is a short-term fix in case the issue will break the master (should not) or will start causing issues for development (most likely; at least it does for me because I work with these components and run their specs).
The next step would be to rewrite Gitlab::Memory::ReportsDaemon
with BackgroundTask
.
➜ gitlab git:(372850-fix-reports-daemon-spec) bundle exec rspec spec/lib/gitlab/memory/reports_daemon_spec.rb
warning: parser/current is loading parser/ruby27, which recognizes2.7.6-compliant syntax, but you are running 2.7.5.
Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Run options: include {:focus=>true}
All examples were filtered out; ignoring {:focus=>true}
Test environment set up in 5.719102 seconds
FFF.FF..F
Failures:
1) Gitlab::Memory::ReportsDaemon#run_thread runs reports
Failure/Error: File.size(file_path.to_s)
#<File (class)> received :size with unexpected arguments
expected: (/\/tmp.*\.json/)
got: ("")
Diff:
@@ -1 +1 @@
-[/\/tmp.*\.json/]
+[""]
Please stub a default value first if message might be received with other args as well.
# ./lib/gitlab/memory/reports_daemon.rb:100:in `file_size'
# ./lib/gitlab/memory/reports_daemon.rb:47:in `block in run_thread'
# ./lib/gitlab/memory/reports_daemon.rb:38:in `each'
# ./lib/gitlab/memory/reports_daemon.rb:38:in `run_thread'
# ./spec/lib/gitlab/memory/reports_daemon_spec.rb:28:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:416:in `block (3 levels) in <top (required)>'
# ./spec/support/sidekiq_middleware.rb:9:in `with_sidekiq_server_middleware'
# ./spec/spec_helper.rb:407:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:403:in `block (3 levels) in <top (required)>'
# ./lib/gitlab/application_context.rb:56:in `with_raw_context'
# ./spec/spec_helper.rb:403:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:240:in `block (2 levels) in <top (required)>'
# ./spec/support/system_exit_detected.rb:7:in `block (2 levels) in <main>'
# ./spec/support/database/prevent_cross_joins.rb:106:in `block (3 levels) in <main>'
# ./spec/support/database/prevent_cross_joins.rb:60:in `with_cross_joins_prevented'
# ./spec/support/database/prevent_cross_joins.rb:106:in `block (2 levels) in <main>'
2) Gitlab::Memory::ReportsDaemon#run_thread logs report execution
Failure/Error: File.size(file_path.to_s)
#<File (class)> received :size with unexpected arguments
expected: (/\/tmp.*\.json/)
got: ("")
Diff:
@@ -1 +1 @@
-[/\/tmp.*\.json/]
+[""]
3) Gitlab::Memory::ReportsDaemon#run_thread sets real time duration gauge
Failure/Error: File.size(file_path.to_s)
#<File (class)> received :size with unexpected arguments
expected: (/\/tmp.*\.json/)
got: ("")
Diff:
@@ -1 +1 @@
-[/\/tmp.*\.json/]
+[""]
4) Gitlab::Memory::ReportsDaemon#run_thread when the report object returns invalid file path logs `0` as `perf_report_size_bytes`
Failure/Error: File.size(file_path.to_s)
#<File (class)> received :size with unexpected arguments
expected: (/\/tmp.*\.json/)
got: ("")
Diff:
@@ -1 +1 @@
-[/\/tmp.*\.json/]
+[""]
5) Gitlab::Memory::ReportsDaemon#run_thread sleep timers logic wakes up every (fixed interval + defined delta), sleeps between reports each cycle
Failure/Error: File.size(file_path.to_s)
#<File (class)> received :size with unexpected arguments
expected: (/\/tmp.*\.json/)
got: ("")
Diff:
@@ -1 +1 @@
-[/\/tmp.*\.json/]
+[""]
6) Gitlab::Memory::ReportsDaemon timer intervals settings when settings are passed through the environment uses provided values
Failure/Error: FileUtils.mkdir_p(@tmp_dir)
Errno::EROFS:
Read-only file system @ dir_s_mkdir - /empty-dir
# ./lib/gitlab/memory/reports/jemalloc_stats.rb:25:in `initialize'
# ./lib/gitlab/memory/reports_daemon.rb:27:in `new'
# ./lib/gitlab/memory/reports_daemon.rb:27:in `initialize'
# ./spec/lib/gitlab/memory/reports_daemon_spec.rb:127:in `new'
# ./spec/lib/gitlab/memory/reports_daemon_spec.rb:127:in `block (4 levels) in <top (required)>'
# ./spec/spec_helper.rb:416:in `block (3 levels) in <top (required)>'
# ./spec/support/sidekiq_middleware.rb:9:in `with_sidekiq_server_middleware'
# ./spec/spec_helper.rb:407:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:403:in `block (3 levels) in <top (required)>'
# ./lib/gitlab/application_context.rb:56:in `with_raw_context'
# ./spec/spec_helper.rb:403:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:240:in `block (2 levels) in <top (required)>'
# ./spec/support/system_exit_detected.rb:7:in `block (2 levels) in <main>'
# ./spec/support/database/prevent_cross_joins.rb:106:in `block (3 levels) in <main>'
# ./spec/support/database/prevent_cross_joins.rb:60:in `with_cross_joins_prevented'
# ./spec/support/database/prevent_cross_joins.rb:106:in `block (2 levels) in <main>'
Finished in 8.93 seconds (files took 12.82 seconds to load)
9 examples, 6 failures
Failed examples:
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:25 # Gitlab::Memory::ReportsDaemon#run_thread runs reports
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:31 # Gitlab::Memory::ReportsDaemon#run_thread logs report execution
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:60 # Gitlab::Memory::ReportsDaemon#run_thread sets real time duration gauge
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:53 # Gitlab::Memory::ReportsDaemon#run_thread when the report object returns invalid file path logs `0` as `perf_report_size_bytes`
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:85 # Gitlab::Memory::ReportsDaemon#run_thread sleep timers logic wakes up every (fixed interval + defined delta), sleeps between reports each cycle
rspec ./spec/lib/gitlab/memory/reports_daemon_spec.rb:126 # Gitlab::Memory::ReportsDaemon timer intervals settings when settings are passed through the environment uses provided values
How to set up and validate locally
Specs-only MR.
Run bundle exec rspec spec/lib/gitlab/memory/reports_daemon_spec.rb
on master
and on this branch.
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Related to #372850 (closed)
Edited by Aleksei Lipniagov