X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3bd5f6c3f353059c15eeea51b16b2fdee694d504..794cecd80b3fc3c9812687fa9e4e269fb1e79c60:/services/api/app/middlewares/rack_socket.rb diff --git a/services/api/app/middlewares/rack_socket.rb b/services/api/app/middlewares/rack_socket.rb index 795df4a7fc..1b301e27ab 100644 --- a/services/api/app/middlewares/rack_socket.rb +++ b/services/api/app/middlewares/rack_socket.rb @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + require 'rack' require 'faye/websocket' require 'eventmachine' @@ -44,18 +48,26 @@ class RackSocket if forked && EM.reactor_running? EM.stop end - Thread.new { - EM.run - } + Thread.new do + begin + EM.run + ensure + ActiveRecord::Base.connection.close + end + end die_gracefully_on_signal end else # faciliates debugging Thread.abort_on_exception = true # just spawn a thread and start it up - Thread.new { - EM.run - } + Thread.new do + begin + EM.run + ensure + ActiveRecord::Base.connection.close + end + end end # Create actual handler instance object from handler class. @@ -69,7 +81,11 @@ class RackSocket def call env request = Rack::Request.new(env) if request.path_info == @endpoint and Faye::WebSocket.websocket?(env) - ws = Faye::WebSocket.new(env) + if @handler.overloaded? + return [503, {"Content-Type" => "text/plain"}, ["Too many connections, try again later."]] + end + + ws = Faye::WebSocket.new(env, nil, :ping => 30) # Notify handler about new connection @handler.on_connect ws