https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112021-01-12T01:12:08ZRuby Issue Tracking SystemRuby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898532021-01-12T01:12:08Zprajjwal (Prajjwal Singh)
<ul><li><strong>File</strong> <a href="/attachments/8687">ractor.crash</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/8687/ractor.crash">ractor.crash</a> added</li></ul> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898552021-01-12T01:42:42Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/17489">Bug #17489</a>: Ractor segfaults</i> added</li></ul> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898562021-01-12T01:42:46Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>Thanks for the report.</p>
<p>Probably the same bug as <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Ractor segfaults (Closed)" href="https://bugs.ruby-lang.org/issues/17489">#17489</a></p> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898792021-01-12T08:04:04Zko1 (Koichi Sasada)
<ul></ul><p>I couldn't reproduce it. Could you tell me <code>ARGV[0]</code>?</p>
<p>BTW please fill "ruby -v:" filed with your environment (even if it is in crash log)</p>
<blockquote>
<p>ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]</p>
</blockquote> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898822021-01-12T10:21:01Zprajjwal (Prajjwal Singh)
<ul></ul><p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/17">@ko1 (Koichi Sasada)</a></p>
<p>It crashes for any value of ARGV[0] between 1 and 25 (that I tested).</p>
<p>The fact that its happening so consistently for me and not for you makes me wonder if the problem stems from my version of Linux or GCC? Some other compile time option perhaps?</p>
<p>Here's my GCC version:</p>
<pre><code>Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC)
</code></pre>
<p>And Linux:</p>
<pre><code>Linux Wraith 5.9.14-arch1-1 #1 SMP PREEMPT Sat, 12 Dec 2020 14:37:12 +0000 x86_64 GNU/Linux
</code></pre>
<p>Ruby Configure Args</p>
<pre><code>'--prefix=/home/prajjwal/.rbenv/versions/3.0.0' '--enable-shared' 'LDFLAGS=-L/home/prajjwal/.rbenv/versions/3.0.0/lib ' 'CPPFLAGS=-I/home/prajjwal/.rbenv/versions/3.0.0/include '
</code></pre> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898832021-01-12T10:21:27Zprajjwal (Prajjwal Singh)
<ul><li><strong>ruby -v</strong> changed from <i>3.0.0</i> to <i>ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]</i></li></ul> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=898862021-01-12T11:15:15Zprajjwal (Prajjwal Singh)
<ul></ul><p>Just confirmed that it only segfaults when ruby is configured with the <code>--enable-shared</code> option (which <code>rbenv</code> does by default).</p>
<p>Even more info:</p>
<pre><code>glibc 2.32-5
</code></pre> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=901402021-01-29T08:40:36Zko1 (Koichi Sasada)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li></ul> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=904712021-02-18T07:26:27Zko1 (Koichi Sasada)
<ul></ul><p>hmm I can't reproduce it yet. Can someone try it and get more information about it?</p> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=969472022-03-21T00:32:08Zwanabe (_ wanabe)s.wanabe@gmail.com
<ul></ul><p>I confirmed with 3.0.0 that the issue is reproducible.<br>
According to <code>git bisect</code>, it seems to be fixed in fff1edf23ba28267bf57097c269f7fa87530e3fa and d0d6227a0da5925acf946a09191f172daf53baf2.</p>
<pre><code>$ (git checkout origin/ruby_3_0 && git cherry-pick d0d6227a0da5925acf946a09191f172daf53baf2 fff1edf23ba28267bf57097c269f7fa87530e3fa && make miniruby -j8 ) >/dev/null 2>&1 && ./miniruby -v -W0 segv.rb
ruby 3.0.4p197 (2022-03-13 revision b04eb796e4) [x86_64-linux]
$ (git checkout origin/ruby_3_0 && make miniruby -j8 ) >/dev/null 2>&1 && ./miniruby -v -W0 segv.rbruby 3.0.4p197 (2022-03-13 revision f404b21f84) [x86_64-linux]
<internal:ractor>:627: [BUG] Segmentation fault at 0x0000000000000020
ruby 3.0.4p197 (2022-03-13 revision f404b21f84) [x86_64-linux]
-- Control frame information -----------------------------------------------
c:0003 p:0003 s:0015 e:000014 METHOD <internal:ractor>:627
c:0002 p:0019 s:0008 e:000007 BLOCK segv.rb:13 [FINISH]
c:0001 p:---- s:0003 e:000002 (none) [FINISH]
-- Ruby level backtrace information ----------------------------------------
segv.rb:13:in `block (4 levels) in <main>'
<internal:ractor>:627:in `yield'
-- Machine register context ------------------------------------------------
RIP: 0x0000560d0246f8d8 RBP: 0x00007f1c80f28920 RSP: 0x00007f1c80f28800
RAX: 0x0000000000000000 RBX: 0x00007f1c80f28810 RCX: 0x0000000000000000
RDX: 0x0000000000000001 RDI: 0x0000560d04738b98 RSI: 0x0000000000000000
R8: 0x0000560d04738e10 R9: 0x0000000000000000 R10: 0x0000000000000001
R11: 0x0000000000000002 R12: 0x00007f1c80f28820 R13: 0x0000560d04738b70
R14: 0x0000560d047416b8 R15: 0x00007f1c80f28810 EFL: 0x0000000000010246
-- C level backtrace information -------------------------------------------
./miniruby(rb_vm_bugreport+0x4a4) [0x560d02565b34]
./miniruby(rb_bug_for_fatal_signal+0xf4) [0x560d02369a54]
./miniruby(sigsegv+0x4d) [0x560d024bae1d]
[0x7f1c85894520]
./miniruby(ractor_select+0x478) [0x560d0246f8d8]
./miniruby(builtin_inline_class_627+0x3e) [0x560d0247019e]
./miniruby(vm_exec_core+0x32cd) [0x560d0254d31d]
./miniruby(rb_vm_exec+0x1a2) [0x560d0254f8d2]
./miniruby(thread_do_start_proc+0x339) [0x560d025057d9]
./miniruby(thread_start_func_2+0xc84) [0x560d02506554]
./miniruby(thread_start_func_1+0xde) [0x560d0250682e]
[0x7f1c858e6947]
[0x7f1c85976a44]
-- Other runtime information -----------------------------------------------
(snip)
</code></pre>
<p>And the following script has been modified to make it easier to try.</p>
<pre><code>1000.times do |q|
producer = Ractor.new do
1000.times do |i|
Ractor.yield true
end
end
workers = (1..10).map do
Ractor.new producer do |producer|
while n = producer.take
Ractor.yield nil
end
rescue Ractor::ClosedError
end
end
loop do
_r, prime = Ractor.select(*workers)
end
end
</code></pre> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=969492022-03-21T06:47:18Zwanabe (_ wanabe)s.wanabe@gmail.com
<ul></ul><p>I guess that the btest failure of ruby_3_0 branch on icc-x64 env may be fixed by <code>git cherry-pick d0d6227a0da5925acf946a09191f172daf53baf2 fff1edf23ba28267bf57097c269f7fa87530e3fa</code>.<br>
(An example of this failure is <a href="http://rubyci.s3.amazonaws.com/icc-x64/ruby-3.0/log/20220321T004434Z.log.html.gz#test.rb" class="external">http://rubyci.s3.amazonaws.com/icc-x64/ruby-3.0/log/20220321T004434Z.log.html.gz#test.rb</a>)</p> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=969512022-03-21T07:10:57Znagachika (Tomoyuki Chikanaga)nagachika00@gmail.com
<ul><li><strong>Backport</strong> changed from <i>2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN</i> to <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED</i></li></ul> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=969522022-03-21T07:53:53Znagachika (Tomoyuki Chikanaga)nagachika00@gmail.com
<ul><li><strong>Backport</strong> changed from <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED</i> to <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONE</i></li></ul><p>ruby_3_0 a72b7b898c69a116d754d599e8bb061761015255 merged revision(s) d0d6227a0da5925acf946a09191f172daf53baf2,fff1edf23ba28267bf57097c269f7fa87530e3fa.</p> Ruby master - Bug #17529: Ractor Segfaults with GC enabledhttps://bugs.ruby-lang.org/issues/17529?journal_id=969532022-03-21T07:54:21Znagachika (Tomoyuki Chikanaga)nagachika00@gmail.com
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Applied in changeset <a class="changeset" title="merge revision(s) d0d6227a0da5925acf946a09191f172daf53baf2,fff1edf23ba28267bf57097c269f7fa87530e3..." href="https://bugs.ruby-lang.org/projects/ruby-master/repository/git/revisions/a72b7b898c69a116d754d599e8bb061761015255">git|a72b7b898c69a116d754d599e8bb061761015255</a>.</p>
<hr>
<p>merge revision(s) d0d6227a0da5925acf946a09191f172daf53baf2,fff1edf23ba28267bf57097c269f7fa87530e3fa: [Backport <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Ractor Segfaults with GC enabled (Closed)" href="https://bugs.ruby-lang.org/issues/17529">#17529</a>]</p>
<pre><code> alen should be actions number on ractor_select()
alen was number of rs, but it should be actions number
(taking ractors + receiving + yielding).
---
ractor.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
fix Ractor.yield(obj, move: true)
Ractor.yield(obj, move: true) and
Ractor.select(..., yield_value: obj, move: true) tried to yield a
value with move semantices, but if the trial is faild, the obj
should not become a moved object.
To keep this rule, `wait_moving` wait status is introduced.
New yield/take process:
(1) If a ractor tried to yield (move:true), make taking racotr's
wait status `wait_moving` and make a moved object by
`ractor_move(obj)` and wakeup taking ractor.
(2) If a ractor tried to take a message from a ractor waiting fo
yielding (move:true), wakeup the ractor and wait for (1).
---
bootstraptest/test_ractor.rb | 25 +++++++++++++++
ractor.c | 73 +++++++++++++++++++++++++++++++++++---------
ractor_core.h | 1 +
3 files changed, 84 insertions(+), 15 deletions(-)
</code></pre>