Bug #9365
closedSporadic TypeError (wrong argument type Thread (expected VM/thread)) from IO#close (via Net:HTTP)
Description
I'm seeing the occasional error being thrown from Net:HTTP from a Rails app running under unicorn:
TypeError (wrong argument type Thread (expected VM/thread))
The two difference stack traces I see point back to IO#close:
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb: 88:in close' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb: 88:in
close'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 946:in do_finish' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 854:in
ensure in start'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 854:in start' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1367:in
request'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1390:in send_entity' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1179:in
post'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb: 88:in close' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb: 88:in
close'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 946:in do_finish' /opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 854:in
start'
/opt/rubies/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb: 582:in `start'
Flipping through the source, I can see that we're calling the following under the hood:
void
rb_thread_fd_close(int fd)
{
st_foreach(GET_THREAD()->vm->living_threads, thread_fd_close_i, (st_index_t)fd);
}
thread_fd_close_i is unpacking a thread out of GET_THREAD()->vm->living_threads but is expected a Thread and not a VM/Thread.
These errors only seem to occur sporadically (78 in the past 30 days) and seem to happen during quiet times. The only other place I've been able to find this mentioned is on the Twitters [1]
I'd like to dig further, but I'm a bit out of my depth at debugging ruby runtimes.
HALP
Updated by ggiesemann (Geoffrey Giesemann) over 10 years ago
Any love?
Updated by normalperson (Eric Wong) over 10 years ago
Thanks for the bug report, I think we need more info...
What else are you running? (threads, weird extensions, etc)
Mainly, which C extensions which touch threading?
And how many threads do you need to reproduce this issue with?
Thanks.
Updated by normalperson (Eric Wong) over 10 years ago
I haven't been able to reproduce this. It appears something is
corrupting the typed_flag in the thread VALUE before IO#close.
Do you get segfaults or other unexplained errors?
Does this happen near/when unicorn worker processes exit/spawn?
Thanks for any more info you can provide.
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Status changed from Open to Closed
- Backport deleted (
1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN)