falcon
falcon copied to clipboard
Graceful application restart
7.57s error: Falcon::Middleware::Proxy [oid=0x2b28b1031560] [pid=324885] [2020-04-21 00:41:19 +0000]
| Errno::ECONNREFUSED: Connection refused - connect(2) for /srv/http/www.codeotaku.com/application.ipc
| → /usr/lib/ruby/2.6.0/socket.rb:1213 in `__connect_nonblock'
| /usr/lib/ruby/2.6.0/socket.rb:1213 in `connect_nonblock'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/generic.rb:216 in `async_send'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/socket.rb:52 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/socket.rb:135 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/address_endpoint.rb:51 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/falcon-0.36.3/lib/falcon/proxy_endpoint.rb:52 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/client.rb:157 in `block in make_pool'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:181 in `create_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:210 in `block in available_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-1.24.2/lib/async/semaphore.rb:80 in `acquire'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:191 in `available_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:166 in `wait_for_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:76 in `acquire'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/client.rb:104 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/falcon-0.36.3/lib/falcon/middleware/proxy.rb:135 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/protocol-http-0.18.0/lib/protocol/http/middleware.rb:50 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/server.rb:64 in `block in accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/protocol/http1/server.rb:62 in `each'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/server.rb:53 in `accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/server.rb:32 in `block in accept_each'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/ssl_socket.rb:147 in `block in accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-1.24.2/lib/async/task.rb:258 in `block in make_fiber'
7.89s error: Async::Task [oid=0x2b28b1055604] [pid=324885] [2020-04-21 00:41:20 +0000]
| Errno::ECONNRESET: Connection reset by peer
| → /usr/lib/ruby/2.6.0/openssl/buffering.rb:182 in `sysread_nonblock'
| /usr/lib/ruby/2.6.0/openssl/buffering.rb:182 in `read_nonblock'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/generic.rb:216 in `async_send'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/generic.rb:69 in `block in wrap_blocking_method'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/stream.rb:261 in `fill_read_buffer'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/stream.rb:83 in `read'
| /usr/lib/ruby/gems/2.6.0/gems/protocol-http2-0.14.0/lib/protocol/http2/framer.rb:73 in `read_connection_preface'
| /usr/lib/ruby/gems/2.6.0/gems/protocol-http2-0.14.0/lib/protocol/http2/server.rb:44 in `read_connection_preface'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/protocol/http2.rb:70 in `server'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/protocol/https.rb:76 in `server'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/server.rb:49 in `accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/server.rb:32 in `block in accept_each'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/ssl_socket.rb:147 in `block in accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-1.24.2/lib/async/task.rb:258 in `block in make_fiber'
9.06s error: Falcon::Middleware::Proxy [oid=0x2b28b1031560] [pid=324885] [2020-04-21 00:41:21 +0000]
| Errno::ECONNREFUSED: Connection refused - connect(2) for /srv/http/www.codeotaku.com/application.ipc
| → /usr/lib/ruby/2.6.0/socket.rb:1213 in `__connect_nonblock'
| /usr/lib/ruby/2.6.0/socket.rb:1213 in `connect_nonblock'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/generic.rb:216 in `async_send'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/socket.rb:52 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/socket.rb:135 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-io-1.28.0/lib/async/io/address_endpoint.rb:51 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/falcon-0.36.3/lib/falcon/proxy_endpoint.rb:52 in `connect'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/client.rb:157 in `block in make_pool'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:181 in `create_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:210 in `block in available_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-1.24.2/lib/async/semaphore.rb:80 in `acquire'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:191 in `available_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:166 in `wait_for_resource'
| /usr/lib/ruby/gems/2.6.0/gems/async-pool-0.2.0/lib/async/pool/controller.rb:76 in `acquire'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/client.rb:104 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/falcon-0.36.3/lib/falcon/middleware/proxy.rb:135 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/protocol-http-0.18.0/lib/protocol/http/middleware.rb:50 in `call'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/server.rb:64 in `block in accept'
| /usr/lib/ruby/gems/2.6.0/gems/async-http-0.51.6/lib/async/http/protocol/http2/server.rb:74 in `block in each'
| /usr/lib/ruby/gems/2.6.0/gems/async-1.24.2/lib/async/task.rb:258 in `block in make_fiber'
When restarting an application, it can be unavailable for a short time.
Here are some example errors.
There are a couple of options:
- Adding a front-end cache to avoid this.
- Presenting a "Please wait a moment" page to the user.
- Waiting with a short timeout.