Description
Context
By bin/dev
, I mean the sort of wrapper script that started shipping with Rails 7, which is just calling exec foreman start -f Procfile.dev
to launch multiple processes at once. This is similar to how heroku local
, which uses node-foreman
works. The idea is a developer only has to run a single command (bin/dev
) and several processes will be spun up. We've been using a setup very similar to this for a long time and it's been rock solid.
We also use the debug
Gem to aid with debugging, and use RUBY_DEBUG_IRB_CONSOLE=true
to set IRB as our debug console. Again, this has been solid for a long time.
Today our IRB was upgraded from 1.14.1
to something newer and we started seeing errors when trying to start processes via bin/dev
.
The error
I did some digging and as of IRB 1.14.2
we see the following errors when trying to launch our Rails app via bin/dev
:
8:58:46 PM web.1 | ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/reline-0.6.1/lib/reline/io/ansi.rb:178:in `winsize': Operation not supported on socket - <STDIN> (Errno::EOPNOTSUPP)
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/reline-0.6.1/lib/reline/io/ansi.rb:178:in `get_screen_size'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/reline-0.6.1/lib/reline.rb:208:in `get_screen_size'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/3.2.0/forwardable.rb:240:in `get_screen_size'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/irb-1.14.2/lib/irb/pager.rb:58:in `content_exceeds_screen_height?'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/irb-1.14.2/lib/irb/pager.rb:11:in `page_content'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/irb-1.14.2/lib/irb/debug/ui.rb:51:in `puts'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:1231:in `config_show'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:1251:in `config_set'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:1271:in `config_command'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:1081:in `block in register_default_command'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:1165:in `process_command'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:450:in `wait_command'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:405:in `block in wait_command_loop'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:404:in `loop'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:404:in `wait_command_loop'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:296:in `process_event'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:255:in `session_server_main'
8:58:46 PM web.1 | from ~/.rbenv/versions/3.2.7/lib/ruby/gems/3.2.0/gems/debug-1.10.0/lib/debug/session.rb:207:in `block in activate'
8:58:46 PM web.1 | #<Errno::EOPNOTSUPP: Operation not supported on socket - <STDIN>>
Disabling RUBY_DEBUG_IRB_CONSOLE
or removing the debug
gem allows the process(es) to launch as expected. I was able to narrow the problem down to the change to page output in irb:rdbg sessions. If I revert that change, everything works again!
Looking at the code, the call from IRB::Debug::UI#puts
to IRB::Pager.page_content
is breaking because - I think - the attached "screen" is not a TTY, but Reline.get_screen_size
is expecting it to be. So an error is raised, but we're not handling it. Maybe we should be?
Or… I wonder if the call to #content_exceeds_screen_height?
should be guarded by #should_page?
?