From: eregontp@... Date: 2020-09-29T17:27:25+00:00 Subject: [ruby-core:100223] [Ruby master Bug#17203] Logger::Formatter won't work with non main Ractor Issue #17203 has been updated by Eregon (Benoit Daloze). I tried to make an example why sharing a mutable object is problematic, but I think I just got more confused :D ``` ruby -e '$stdout.instance_variable_set(:@private, Object.new); p $stdout.object_id; p $stdout.instance_variables; Ractor.new { p $stdout.object_id; p $stdout.instance_variables; p $ $stdout.instance_variable_get(:@private) }.take' 60 [:@private] :38: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues. 80 [] nil ``` So `$stdout` in each Ractor is a different object? Might be a good way to still let `p/print/puts` work in Ractors. The $stdout variable is Ractor-local, so that might make sense. This sometimes trigger a [BUG]: ``` $ ruby -e 'p $stdout.object_id; 10.times.map { Ractor.new { p $stdout.object_id } }; sleep 1' 60 :38: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues. 80 100 120 140 160 180220200 240 260 -e: [BUG] Object ID seen, but not in mapping table: 0x000055a75f933080 [0 U] T_ZOMBIE ruby 3.0.0dev (2020-09-29T15:32:22Z master c38605de6b) [x86_64-linux] -- Control frame information ----------------------------------------------- c:0001 p:0000 s:0003 E:000b10 (none) [FINISH] -- C level backtrace information ------------------------------------------- [0x55a75e3b5c6e] /home/eregon/prefix/ruby-master/bin/ruby(rb_bug+0xe5) [0x55a75e1be426] error.c:723 /home/eregon/prefix/ruby-master/bin/ruby(obj_free_object_id+0x19) [0x55a75e1e9fe8] gc.c:2691 /home/eregon/prefix/ruby-master/bin/ruby(finalize_list) gc.c:2679 [0x55a75e1ee213] /home/eregon/prefix/ruby-master/bin/ruby(rb_ec_cleanup+0x2e8) [0x55a75e1cf558] eval.c:173 [0x55a75e1cfcc1] /home/eregon/prefix/ruby-master/bin/ruby(main+0x6f) [0x55a75e1c32ef] ./main.c:50 ``` ---------------------------------------- Bug #17203: Logger::Formatter won't work with non main Ractor https://bugs.ruby-lang.org/issues/17203#change-87812 * Author: maciej.mensfeld (Maciej Mensfeld) * Status: Open * Priority: Normal * Assignee: ko1 (Koichi Sasada) * ruby -v: ruby 3.0.0preview1 (2020-09-25 master 0096d2b895) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- ``` ruby class Rogger < Ractor def self.new super do # STDOUT cannot be referenced but $stdout can logger = ::Logger.new($stdout) # Run the requested operations on our logger instance while data = recv logger.public_send(data[0], *data[1]) end end end # Really cheap logger API :) def method_missing(m, *args, &_block) self << [m, *args] end end class Rails LOGGER = Rogger.new def self.logger LOGGER end end Ractor.new do Rails.logger.info "Hello" end ``` running this ends up with: ```bash terminated with exception (report_on_exception is true): ruby/3.0.0/logger/formatter.rb:15:in `call': can not access global variables $$ from non-main Ractors (RuntimeError) from ruby/3.0.0/logger.rb:586:in `format_message' from ruby/3.0.0/logger.rb:476:in `add' from ruby/3.0.0/logger.rb:529:in `info' from test.rb:23:in `public_send' from test.rb:23:in `block in new' ``` however the same with fixed formatter works. PR: https://github.com/ruby/ruby/pull/3600 All of the code examples are here: https://mensfeld.pl/2020/09/building-a-ractor-based-logger-that-will-work-with-non-ractor-compatible-code/ -- https://bugs.ruby-lang.org/ Unsubscribe: