socketry / async-http

MIT License
298 stars 45 forks source link

How to rescue from warnings / failures (Protocol::HTTP2::GoawayError) #119

Open 9mm opened 1 year ago

9mm commented 1 year ago

I notice while async-http is running, after a few minutes I will get a Protocol::HTTP2::GoawayError, and then immediately after get OpenSSL::SSL::SSLError: SSL_write

In the short term, can I just rescue from any warning and wait 10 seconds and retry? Something like this:

begin
  Async do
    ...
  end
rescue
  sleep 10
  retry
end
    2m     warn: Async::Task [oid=0x9d8] [ec=0x9ec] [pid=22498] [2023-05-26 18:49:27 +0000]
               | Task may have ended with unhandled exception.
               |   Protocol::HTTP2::GoawayError:
               |   → /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/connection.rb:205 in `receive_goaway'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/goaway_frame.rb:41 in `apply'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/connection.rb:155 in `read_frame'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/protocol/http2/connection.rb:111 in `block in read_in_background'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:158 in `block in run'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:310 in `block in schedule'
    2m     warn: Async::Task [oid=0xa00] [ec=0xa14] [pid=22498] [2023-05-26 18:49:27 +0000]
               | Task may have ended with unhandled exception.
               |   Protocol::HTTP2::GoawayError:
               |   → /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/connection.rb:205 in `receive_goaway'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/goaway_frame.rb:41 in `apply'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/connection.rb:155 in `read_frame'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/protocol/http2/connection.rb:111 in `block in read_in_background'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:158 in `block in run'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:310 in `block in schedule'
    2m     warn: Async::Task [oid=0xa50] [ec=0xa64] [pid=22498] [2023-05-26 18:49:27 +0000]
               | Task may have ended with unhandled exception.
               |   OpenSSL::SSL::SSLError: SSL_write
               |   → /usr/lib/ruby/3.1.0/openssl/buffering.rb:415 in `syswrite_nonblock'
               |     /usr/lib/ruby/3.1.0/openssl/buffering.rb:415 in `write_nonblock'
               |     /var/lib/gems/3.1.0/gems/async-io-1.34.3/lib/async/io/generic.rb:216 in `async_send'
               |     /var/lib/gems/3.1.0/gems/async-io-1.34.3/lib/async/io/generic.rb:62 in `block in wrap_blocking_method'
               |     /var/lib/gems/3.1.0/gems/async-io-1.34.3/lib/async/io/generic.rb:156 in `write'
               |     /var/lib/gems/3.1.0/gems/async-io-1.34.3/lib/async/io/stream.rb:162 in `block in flush'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/semaphore.rb:87 in `acquire'
               |     /var/lib/gems/3.1.0/gems/async-io-1.34.3/lib/async/io/stream.rb:157 in `flush'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/protocol/http2/connection.rb:97 in `write_frames'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/stream.rb:145 in `write_headers'
               |     /var/lib/gems/3.1.0/gems/protocol-http2-0.15.1/lib/protocol/http2/stream.rb:159 in `send_headers'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/protocol/http2/response.rb:204 in `send_request'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/protocol/http2/client.rb:54 in `call'
               |     /var/lib/gems/3.1.0/gems/protocol-http-0.24.1/lib/protocol/http/request.rb:54 in `call'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/client.rb:185 in `make_response'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/client.rb:108 in `call'
               |     /var/lib/gems/3.1.0/gems/protocol-http-0.24.1/lib/protocol/http/middleware.rb:33 in `call'
               |     /var/lib/gems/3.1.0/gems/protocol-http-0.24.1/lib/protocol/http/accept_encoding.rb:35 in `call'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/internet.rb:67 in `call'
               |     /var/lib/gems/3.1.0/gems/async-http-0.60.1/lib/async/http/internet.rb:80 in `block (2 levels) in <class
               |     async.rb:119 in `block (3 levels) in <main>'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/semaphore.rb:68 in `block in async'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:158 in `block in run'
               |     /var/lib/gems/3.1.0/gems/async-2.5.1/lib/async/task.rb:310 in `block in schedule'
    2m     warn: Async::Task [oid=0xa78] [ec=0xa8c] [pid=22498] [2023-05-26 18:49:27 +0000]
9mm commented 1 year ago

For anyone who wonders the same thing (probably no one 🦗🦗)

I did this

Async do |parent|
  semaphore.async do
    begin
      ...
    rescue
      parent.stop
    end
rescue Async::Stop
  # handle retry
end