From dda5942d46f17ae11126688e5120e65bf217aa70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Wed, 6 Mar 2024 01:57:51 +0100 Subject: [PATCH 1/3] option --term-timeout force closes server X seconds after TERM fixes #112 --- src/amqproxy.cr | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/amqproxy.cr b/src/amqproxy.cr index 691cbc7..dfe37ce 100644 --- a/src/amqproxy.cr +++ b/src/amqproxy.cr @@ -10,6 +10,7 @@ class AMQProxy::CLI @listen_port = ENV["LISTEN_PORT"]? || 5673 @log_level : Log::Severity = Log::Severity::Info @idle_connection_timeout : Int32 = ENV.fetch("IDLE_CONNECTION_TIMEOUT", "5").to_i + @term_timeout = 0 @upstream = ENV["AMQP_URL"]? def parse_config(path) @@ -21,6 +22,7 @@ class AMQProxy::CLI when "upstream" then @upstream = value when "log_level" then @log_level = Log::Severity.parse(value) when "idle_connection_timeout" then @idle_connection_timeout = value.to_i + when "term_timeout" then @term_timeout = value.to_i else raise "Unsupported config #{name}/#{key}" end end @@ -50,6 +52,9 @@ class AMQProxy::CLI parser.on("-t IDLE_CONNECTION_TIMEOUT", "--idle-connection-timeout=SECONDS", "Maxiumum time in seconds an unused pooled connection stays open (default 5s)") do |v| @idle_connection_timeout = v.to_i end + parser.on("--term-timeout=SECONDS", "At TERM the server will wait this many seconds for clients to gracefully close their sockets (default: infinite)") do |v| + @term_timeout = v.to_i + end parser.on("-d", "--debug", "Verbose logging") { @log_level = Log::Severity::Debug } parser.on("-c FILE", "--config=FILE", "Load config file") { |v| parse_config(v) } parser.on("-h", "--help", "Show this help") { puts parser.to_s; exit 0 } @@ -86,8 +91,14 @@ class AMQProxy::CLI first_shutdown = false server.stop_accepting_clients server.disconnect_clients + if @term_timeout > 0 + spawn do + sleep @term_timeout + abort "Exiting with #{server.client_connections} client connections still open" + end + end else - server.close_sockets + abort "Exiting with #{server.client_connections} client connections still open" end end Signal::INT.trap &shutdown From e2cd98179569f0487c9c086a8e23d120b6480bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Mon, 6 May 2024 11:04:52 +0200 Subject: [PATCH 2/3] fixup! option --term-timeout force closes server X seconds after TERM --- src/amqproxy.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amqproxy.cr b/src/amqproxy.cr index dfe37ce..04545a4 100644 --- a/src/amqproxy.cr +++ b/src/amqproxy.cr @@ -13,7 +13,7 @@ class AMQProxy::CLI @term_timeout = 0 @upstream = ENV["AMQP_URL"]? - def parse_config(path) + def parse_config(path) # ameba:disable Metrics/CyclomaticComplexity INI.parse(File.read(path)).each do |name, section| case name when "main", "" From 070e0e13decba45eb59ee411f946bcc297d8c8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20H=C3=B6rberg?= Date: Mon, 6 May 2024 11:04:56 +0200 Subject: [PATCH 3/3] Allow --term-timout 0, -1 means infinite --- src/amqproxy.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/amqproxy.cr b/src/amqproxy.cr index 04545a4..902150a 100644 --- a/src/amqproxy.cr +++ b/src/amqproxy.cr @@ -10,7 +10,7 @@ class AMQProxy::CLI @listen_port = ENV["LISTEN_PORT"]? || 5673 @log_level : Log::Severity = Log::Severity::Info @idle_connection_timeout : Int32 = ENV.fetch("IDLE_CONNECTION_TIMEOUT", "5").to_i - @term_timeout = 0 + @term_timeout = -1 @upstream = ENV["AMQP_URL"]? def parse_config(path) # ameba:disable Metrics/CyclomaticComplexity @@ -91,7 +91,7 @@ class AMQProxy::CLI first_shutdown = false server.stop_accepting_clients server.disconnect_clients - if @term_timeout > 0 + if @term_timeout >= 0 spawn do sleep @term_timeout abort "Exiting with #{server.client_connections} client connections still open"