From 406234367544a4207141230683dddaccd98fb21a Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 21 Jul 2017 08:19:20 +0200 Subject: fix: filedescriptor leak from http_adapters Now we reuse a single adapter for all requests triggered by an incoming request. Then we .terminate the adapter. Includes a regression test. --- lib/nickserver/dispatcher.rb | 18 ++++++-------- lib/nickserver/reel_server.rb | 29 ++++++++++++++++++---- lib/nickserver/request_handlers/base.rb | 9 ++++--- .../request_handlers/fingerprint_handler.rb | 2 +- .../request_handlers/hkp_email_handler.rb | 2 +- .../request_handlers/leap_email_handler.rb | 2 +- .../request_handlers/local_email_handler.rb | 2 +- lib/nickserver/source.rb | 6 +---- 8 files changed, 41 insertions(+), 29 deletions(-) (limited to 'lib') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 71e71cf..dfd53e5 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -24,21 +24,23 @@ require 'nickserver/request_handlers/fingerprint_handler' module Nickserver class Dispatcher - - def initialize(responder) + def initialize(responder, adapter = nil) @responder = responder + @adapter = adapter end def respond_to(params, headers) request = Nickserver::Request.new params, headers response = handle request - send_response response + responder.respond response.status, response.content end protected + attr_reader :responder, :adapter + def handle(request) - handler_chain.handle request + handler_chain.handle request, adapter end def handler_chain @@ -51,7 +53,7 @@ module Nickserver RequestHandlers::LeapEmailHandler, RequestHandlers::HkpEmailHandler, RequestHandlers::FingerprintHandler, - Proc.new {|_req| proxy_error_response }, + Proc.new { proxy_error_response }, Proc.new { Nickserver::Response.new(404, "404 Not Found\n") } chain.continue_on HTTP::ConnectionError return chain @@ -65,11 +67,5 @@ module Nickserver end end - def send_response(response) - responder.respond response.status, response.content - end - - attr_reader :responder - end end diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index c378aca..9626466 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -10,6 +10,8 @@ require 'nickserver/logging_responder' module Nickserver class ReelServer < Reel::Server::HTTP + DEFAULT_ADAPTER_CLASS = Nickserver::Adapters::CelluloidHttp + def self.start(options = {}) new(options[:host], options[:port]) end @@ -35,20 +37,37 @@ module Nickserver protected def handle_request(request) + logging_request(request) do + with_http_adapter do |adapter| + handler = handler_for(request, adapter) + handler.respond_to params(request), request.headers + end + end + rescue StandardError => e + request.respond 500, "{}" + end + + def logging_request(request) logger.info "#{request.method} #{request.uri}" logger.debug " #{params(request)}" - handler = handler_for(request) - handler.respond_to params(request), request.headers + yield rescue StandardError => e logger.error e logger.error e.backtrace.join "\n " - request.respond 500, "{}" + raise + end + + def with_http_adapter + adapter = DEFAULT_ADAPTER_CLASS.new + yield adapter + ensure + adapter.terminate if adapter.respond_to? :terminate end - def handler_for(request) + def handler_for(request, adapter) # with reel the request is the responder responder = LoggingResponder.new(request, logger) - Dispatcher.new(responder) + Dispatcher.new(responder, adapter) end def params(request) diff --git a/lib/nickserver/request_handlers/base.rb b/lib/nickserver/request_handlers/base.rb index e5d8992..495a6da 100644 --- a/lib/nickserver/request_handlers/base.rb +++ b/lib/nickserver/request_handlers/base.rb @@ -2,16 +2,17 @@ module Nickserver module RequestHandlers class Base - def self.call(request) - new(request).handle + def self.call(request, adapter = nil) + new(request, adapter).handle end - def initialize(request) + def initialize(request, adapter) @request = request + @adapter = adapter end protected - attr_reader :request + attr_reader :request, :adapter end end end diff --git a/lib/nickserver/request_handlers/fingerprint_handler.rb b/lib/nickserver/request_handlers/fingerprint_handler.rb index 5b2dc7d..ac3c3c8 100644 --- a/lib/nickserver/request_handlers/fingerprint_handler.rb +++ b/lib/nickserver/request_handlers/fingerprint_handler.rb @@ -22,7 +22,7 @@ module Nickserver end def source - Nickserver::Hkp::Source.new + Nickserver::Hkp::Source.new adapter end end diff --git a/lib/nickserver/request_handlers/hkp_email_handler.rb b/lib/nickserver/request_handlers/hkp_email_handler.rb index 2f73773..393ef87 100644 --- a/lib/nickserver/request_handlers/hkp_email_handler.rb +++ b/lib/nickserver/request_handlers/hkp_email_handler.rb @@ -16,7 +16,7 @@ module Nickserver end def source - Nickserver::Hkp::Source.new + Nickserver::Hkp::Source.new adapter end end diff --git a/lib/nickserver/request_handlers/leap_email_handler.rb b/lib/nickserver/request_handlers/leap_email_handler.rb index bdebc23..bc3ddef 100644 --- a/lib/nickserver/request_handlers/leap_email_handler.rb +++ b/lib/nickserver/request_handlers/leap_email_handler.rb @@ -13,7 +13,7 @@ module Nickserver protected def source - @source ||= Nicknym::Source.new + @source ||= Nicknym::Source.new adapter end def remote_email? diff --git a/lib/nickserver/request_handlers/local_email_handler.rb b/lib/nickserver/request_handlers/local_email_handler.rb index 9165ef2..08147a0 100644 --- a/lib/nickserver/request_handlers/local_email_handler.rb +++ b/lib/nickserver/request_handlers/local_email_handler.rb @@ -21,7 +21,7 @@ module Nickserver end def source - Nickserver::CouchDB::Source.new + Nickserver::CouchDB::Source.new adapter end end diff --git a/lib/nickserver/source.rb b/lib/nickserver/source.rb index dc0669a..934407a 100644 --- a/lib/nickserver/source.rb +++ b/lib/nickserver/source.rb @@ -1,11 +1,7 @@ -require 'nickserver/adapters/celluloid_http' - module Nickserver class Source - DEFAULT_ADAPTER_CLASS = Nickserver::Adapters::CelluloidHttp - - def initialize(adapter = DEFAULT_ADAPTER_CLASS.new) + def initialize(adapter = nil) @adapter = adapter end -- cgit v1.2.3