oracle / truffleruby

A high performance implementation of the Ruby programming language, built on GraalVM.
https://www.graalvm.org/ruby/
Other
3.02k stars 185 forks source link

Concurrency issue with proxy reuse and net-http-persistent #2575

Open brauliobo opened 2 years ago

brauliobo commented 2 years ago

I'm using mechanize (which uses net-http-persistent) to share a pool of connections. I have a set of proxies (20) that are being reused by multiple threads using mechanize.

With truffleruby (and not with MRI), the error below happens, and it seems it is blocking concurrent connections to the same IP.

Errno::EALREADY: trip_advisor: Failed to open TCP connection to 154.7.232.202:21240 (Operation already in progress - connect(2))
<internal:core> core/errno.rb:54:in `handle_errno'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/truffle/error.rb:82:in `connect_nonblock'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/socket.rb:367:in `__connect_nonblock'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:1274:in `connect_nonblock'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:116:in `connect_internal'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:197:in `connect'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:702:in `block in tcp'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:287:in `each'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:287:in `foreach'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/truffle/socket/mri.rb:692:in `tcp'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/mri/net/http.rb:962:in `connect'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/mri/net/http.rb:943:in `do_start'
/home/braulio/.rvm/rubies/truffleruby-21.3.0/lib/mri/net/http.rb:938:in `start'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/net-http-persistent-4.0.1/lib/net/http/persistent.rb:655:in `start'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/net-http-persistent-4.0.1/lib/net/http/persistent.rb:595:in `connection_for'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/net-http-persistent-4.0.1/lib/net/http/persistent.rb:885:in `request'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/mechanize-2.8.3/lib/mechanize/http/agent.rb:283:in `fetch'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/mechanize-2.8.3/lib/mechanize.rb:465:in `get'
/home/braulio/Projects/olery/Review-collector/lib/review_collector/mechanize.rb:100:in `block in call'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
<internal:core> core/integer.rb:148:in `times'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
... (application closed source part)
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:363:in `run_task'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:352:in `block (3 levels) in create_worker'
<internal:core> core/kernel.rb:407:in `loop'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:335:in `block (2 levels) in create_worker'
<internal:core> core/throw_catch.rb:36:in `catch'
/home/braulio/.rvm/gems/truffleruby-21.3.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:334:in `block in create_worker'
bjfish commented 2 years ago

@brauliobo Do you have steps or some example code to reproduce this error? Thanks.