summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2022-06-07 10:51:28 +0200
committerJean Boussier <jean.boussier@gmail.com>2022-06-07 13:19:34 +0200
commitb1e6e58cd1393bf85ae14b82fe2f944192dc336e (patch)
tree256c5f070fdaac2fdcc68aeb7fa419ccd121833e
parentf075be3dcb4b82b89496d1820002bf3d80f653ef (diff)
Refactor TestThreadInstrumentation to investigate CI flakiness
`test_thread_instrumentation_fork_safe` has been failing occasionaly on Ubuntu and Arch. At this stage we're not sure why, all we know is that the child exit with status 1. I suspect that something entirely unrelated cause the forked children to fail on exit, so by using `exit!(0)` and doing assertions in the parent I hope to be resilient to that.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5983
-rw-r--r--test/-ext-/thread/test_instrumentation_api.rb34
1 files changed, 24 insertions, 10 deletions
diff --git a/test/-ext-/thread/test_instrumentation_api.rb b/test/-ext-/thread/test_instrumentation_api.rb
index 08bcda7ed9..d110348d73 100644
--- a/test/-ext-/thread/test_instrumentation_api.rb
+++ b/test/-ext-/thread/test_instrumentation_api.rb
@@ -10,10 +10,10 @@ class TestThreadInstrumentation < Test::Unit::TestCase
Bug::ThreadInstrumentation::register_callback
begin
- threads = 5.times.map { Thread.new { sleep 0.5; 1 + 1; sleep 0.2 } }
- threads.each(&:join)
- Bug::ThreadInstrumentation.counters.each do |c|
- assert_predicate c,:nonzero?
+ threaded_cpu_work
+ counters = Bug::ThreadInstrumentation.counters
+ counters.each do |c|
+ assert_predicate c,:nonzero?, "Call counters: #{counters.inspect}"
end
ensure
Bug::ThreadInstrumentation::unregister_callback
@@ -26,17 +26,26 @@ class TestThreadInstrumentation < Test::Unit::TestCase
require '-test-/thread/instrumentation'
Bug::ThreadInstrumentation::register_callback
+ read_pipe, write_pipe = IO.pipe
+
begin
pid = fork do
Bug::ThreadInstrumentation.reset_counters
- threads = 5.times.map { Thread.new { sleep 0.5; 1 + 1; sleep 0.2 } }
- threads.each(&:join)
- Bug::ThreadInstrumentation.counters.each do |c|
- assert_predicate c,:nonzero?
- end
+ threaded_cpu_work
+
+ write_pipe.write(Marshal.dump(Bug::ThreadInstrumentation.counters))
+ write_pipe.close
+ exit!(0)
end
+ write_pipe.close
_, status = Process.wait2(pid)
assert_predicate status, :success?
+
+ counters = Marshal.load(read_pipe)
+ read_pipe.close
+ counters.each do |c|
+ assert_predicate c,:nonzero?, "Call counters: #{counters.inspect}"
+ end
ensure
Bug::ThreadInstrumentation::unregister_callback
end
@@ -46,5 +55,10 @@ class TestThreadInstrumentation < Test::Unit::TestCase
require '-test-/thread/instrumentation'
assert Bug::ThreadInstrumentation::register_and_unregister_callbacks
end
-end
+ private
+
+ def threaded_cpu_work
+ 5.times.map { Thread.new { 100.times { |i| i + i } } }.each(&:join)
+ end
+end