Skip to content

Tests in test_io.rb sometimes read no output #23

@wks

Description

@wks

Way to reproduce: Checkout the master branch of https://github.com/ruby/ruby and execute the following:

./autogen.sh
mkdir build-debug
cd build-debug
../configure --prefix=$PWD/install --disable-install-doc cppflags="-g3" --with-modular-gc=./gc-modules
make install -j
make modular-gc install-modular-gc MODULAR_GC=mmtk
RUST_LOG=off RUBY_GC_LIBRARY=mmtk make test-all TESTOPTS="--excludes-dir=../test/.excludes-mmtk -v" -j16

And some test cases will fail with the following output:

  1) Failure:
TestIO#test_dup [/home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_io.rb:1492]:
<"foo\n" + "bar\n"> expected but was
<"">.

  2) Failure:
TestIO#test_close_write [/home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_io.rb:1842]:
<"foobarbaz"> expected but was
<"">.

  3) Error:
TestEnumerable#test_reverse_each_memory_corruption:
Test::Unit::ProxyError: execution of Test::Unit::CoreAssertions#assert_normal_exit expired timeout (10 sec)
pid 2914630 killed by SIGTERM (signal 15)
| 

    /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_enum.rb:903:in 'TestEnumerable#test_reverse_each_memory_corruption'

  4) Error:
TestModule#test_prepend_gc:
Test::Unit::ProxyError: execution of Test::Unit::CoreAssertions#assert_separately expired timeout (10 sec)
pid 2929184 killed by SIGTERM (signal 15)
| 

    /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_module.rb:3080:in 'TestModule#test_prepend_gc'

  5) Error:
TestObjectSpace#test_finalizer:
Test::Unit::ProxyError: execution of Test::Unit::CoreAssertions#assert_in_out_err expired timeout (60 sec)
pid 2922050 killed by SIGKILL (signal 9)
| 

    /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_objectspace.rb:105:in 'TestObjectSpace#test_finalizer'

  6) Error:
TestWeakKeyMap#test_clear_bug_20691:
Test::Unit::ProxyError: execution of Test::Unit::CoreAssertions#assert_normal_exit expired timeout (10 sec)
pid 2980196 killed by SIGTERM (signal 15)
| 

    /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/test/ruby/test_weakkeymap.rb:65:in 'TestWeakKeyMap#test_clear_bug_20691'

Finished tests in 444.471065s, 64.3911 tests/s, 13663.5126 assertions/s.
28620 tests, 6073036 assertions, 2 failures, 4 errors, 119 skips

ruby -v: ruby 3.5.0dev (2025-04-03T01:14:58Z master b8e2bec914) +PRISM +GC[mmtk] [x86_64-linux]
make: *** [uncommon.mk:953: yes-test-all] Error 6

With -j4 or higher, it will almost guarantee to reproduce one of those failres. And the more threads there are, the higher the chance. They are not reproducible when testing with a single thread (without -j). They are not reproducible when not using the mmtk GC module, or when using the default GC as a GC module.

The first two failures are from test_io.rb. They use popen to launch another ruby process and provide some inputs. In both Failure 1 and Failure 2, it actually read empty string from the output of the sub ruby process.

Other failures expired with timeouts. I am not sure if they are related, so I listed them here, too.

And two stack traces from panics exist during testing. Because tests are executed in parallel, it is unclear which test case caused the panic.

thread '<unnamed>' panicked at src/collection.rs:64:18:
called `Result::unwrap()` on an `Err` value: Os { code: 11, kind: WouldBlock, message: "Resource temporarily unavailable" }
stack backtrace:
   0: rust_begin_unwind
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:692:5
   1: core::panicking::panic_fmt
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:75:14
   2: core::result::unwrap_failed
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/result.rs:1704:5
   3: core::result::Result<T,E>::unwrap
             at /home/wks/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs:1109:23
   4: <mmtk_ruby::collection::VMCollection as mmtk::vm::collection::Collection<mmtk_ruby::Ruby>>::spawn_gc_thread
             at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/gc/mmtk/src/collection.rs:40:52
   5: mmtk::scheduler::worker::WorkerGroup<VM>::spawn
             at /home/wks/.cargo/git/checkouts/mmtk-core-e070c0ac3da07192/051bc74/src/scheduler/worker.rs:393:13
   6: mmtk::scheduler::worker::WorkerGroup<VM>::initial_spawn
             at /home/wks/.cargo/git/checkouts/mmtk-core-e070c0ac3da07192/051bc74/src/scheduler/worker.rs:335:9
   7: mmtk::scheduler::scheduler::GCWorkScheduler<VM>::spawn_gc_threads
             at /home/wks/.cargo/git/checkouts/mmtk-core-e070c0ac3da07192/051bc74/src/scheduler/scheduler.rs:93:9
   8: mmtk::mmtk::MMTK<VM>::initialize_collection
             at /home/wks/.cargo/git/checkouts/mmtk-core-e070c0ac3da07192/051bc74/src/mmtk.rs:252:9
   9: mmtk::memory_manager::initialize_collection
             at /home/wks/.cargo/git/checkouts/mmtk-core-e070c0ac3da07192/051bc74/src/memory_manager.rs:496:5
  10: mmtk_initialize_collection
             at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/gc/mmtk/src/api.rs:158:5
  11: rb_gc_impl_ractor_cache_alloc
             at ./gc/mmtk/../../../gc/mmtk/mmtk.c:473:9
  12: rb_gc_ractor_cache_alloc
             at ./../gc.c:2976:12
  13: rb_ractor_main_alloc
             at ./../ractor.c:2074:23
  14: Init_BareVM
             at ./../vm.c:4296:43
  15: ruby_setup
             at ./../eval.c:79:5
  16: ruby_init
             at ./../eval.c:97:17
  17: rb_main
             at ./../main.c:41:5
  18: main
             at ./../main.c:62:12
  19: <unknown>
  20: __libc_start_main
  21: _start
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Ane the other:

thread '<unnamed>' panicked at library/core/src/panicking.rs:218:5:
panic in a function that cannot unwind
stack backtrace:
   0:     0x7c1de895fcba - std::backtrace_rs::backtrace::libunwind::trace::h88deb10bd0145eb8
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5
   1:     0x7c1de895fcba - std::backtrace_rs::backtrace::trace_unsynchronized::he1036f5481c14dff
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7c1de895fcba - std::sys::backtrace::_print_fmt::hecc345b6e70c4b20
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/sys/backtrace.rs:66:9
   3:     0x7c1de895fcba - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::he089f96442833f67
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/sys/backtrace.rs:39:26
   4:     0x7c1de89af233 - core::fmt::rt::Argument::fmt::h1f77cded99c71a14
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/fmt/rt.rs:177:76
   5:     0x7c1de89af233 - core::fmt::write::h2f210ed4c94745cb
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/fmt/mod.rs:1440:21
   6:     0x7c1de8953fd3 - std::io::Write::write_fmt::h7de08171ab770fb2
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/io/mod.rs:1887:15
   7:     0x7c1de895fb02 - std::sys::backtrace::BacktraceLock::print::h810fbd31421329e6
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/sys/backtrace.rs:42:9
   8:     0x7c1de89621e0 - std::panicking::default_hook::{{closure}}::hbaad47ed9dc6356d
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:295:22
   9:     0x7c1de8961fc0 - std::panicking::default_hook::h24e207139139d40a
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:322:9
  10:     0x7c1de89da0d3 - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h9406535c96a49a68
                               at /home/wks/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2007:9
  11:     0x7c1de8ab90d0 - mmtk_ruby::set_panic_hook::{{closure}}::h79df8c0383cf6a55
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/gc/mmtk/src/lib.rs:130:13
  12:     0x7c1de8962a83 - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h3af32c23caf5c679
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/alloc/src/boxed.rs:2007:9
  13:     0x7c1de8962a83 - std::panicking::rust_panic_with_hook::ha9131beeb2ddc506
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:836:13
  14:     0x7c1de8962726 - std::panicking::begin_panic_handler::{{closure}}::h1bba0eaeb6da506f
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:694:13
  15:     0x7c1de89601b9 - std::sys::backtrace::__rust_end_short_backtrace::h1d1ca3eade483f4c
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/sys/backtrace.rs:168:18
  16:     0x7c1de89623ed - rust_begin_unwind
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:692:5
  17:     0x7c1de85891dd - core::panicking::panic_nounwind_fmt::runtime::hdd2d1a56a8b6cee7
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:117:22
  18:     0x7c1de85891dd - core::panicking::panic_nounwind_fmt::h0d5ff668f956fac4
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/intrinsics/mod.rs:3869:9
  19:     0x7c1de8589272 - core::panicking::panic_nounwind::h385b7d9bda51382d
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:218:5
  20:     0x7c1de8589436 - core::panicking::panic_cannot_unwind::h757b6ea37bf9b60a
                               at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:307:5
  21:     0x7c1de858cf92 - mmtk_initialize_collection
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/gc/mmtk/src/api.rs:157:1
  22:     0x7c1de858a778 - rb_gc_impl_ractor_cache_alloc
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/gc/mmtk/../../../gc/mmtk/mmtk.c:473:9
  23:     0x61de561f74ae - rb_gc_ractor_cache_alloc
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../gc.c:2976:12
  24:     0x61de56295c6c - rb_ractor_main_alloc
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../ractor.c:2074:23
  25:     0x61de563acf7d - Init_BareVM
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../vm.c:4296:43
  26:     0x61de561cb6cd - ruby_setup
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../eval.c:79:5
  27:     0x61de561cb803 - ruby_init
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../eval.c:97:17
  28:     0x61de561c7e53 - rb_main
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../main.c:41:5
  29:     0x61de561c7ec9 - main
                               at /home/wks/projects/mmtk-github/parallels/ruby-master/ruby/build-debug/../main.c:62:12
  30:     0x7c1de9789488 - <unknown>
  31:     0x7c1de978954c - __libc_start_main
  32:     0x61de561c7d45 - _start
  33:                0x0 - <unknown>
thread caused non-unwinding panic. aborting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions