From 8df7b1a1be276bab562171bd4335200f2bd975c8 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 7 Jun 2023 18:15:14 +0800 Subject: [PATCH] fix(gateway): fix http-api 500 issue if setting max_connections to infinity --- .../src/emqx_gateway_api_listeners.erl | 16 ++++++++++++++-- apps/emqx_gateway/src/emqx_gateway_schema.erl | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/apps/emqx_gateway/src/emqx_gateway_api_listeners.erl b/apps/emqx_gateway/src/emqx_gateway_api_listeners.erl index 7c0b8c4bf..a6d1f3139 100644 --- a/apps/emqx_gateway/src/emqx_gateway_api_listeners.erl +++ b/apps/emqx_gateway/src/emqx_gateway_api_listeners.erl @@ -304,7 +304,6 @@ do_listeners_cluster_status(Listeners) -> status => #{ running => Running, current_connections => Curr, - %% XXX: Since it is taken from raw-conf, it is possible a string max_connections => int(Max) } } @@ -314,10 +313,15 @@ do_listeners_cluster_status(Listeners) -> Listeners ). +int(infinity) -> + infinity; +int(<<"infinity">>) -> + infinity; int(B) when is_binary(B) -> binary_to_integer(B); int(I) when is_integer(I) -> I. + aggregate_listener_status(NodeStatus) -> aggregate_listener_status(NodeStatus, 0, 0, undefined). @@ -330,11 +334,19 @@ aggregate_listener_status( CurrAcc, RunningAcc ) -> + NMaxAcc = plus_max_connections(MaxAcc, Max), NRunning = aggregate_running(Running, RunningAcc), - aggregate_listener_status(T, MaxAcc + Max, Current + CurrAcc, NRunning); + aggregate_listener_status(T, NMaxAcc, Current + CurrAcc, NRunning); aggregate_listener_status([], MaxAcc, CurrAcc, RunningAcc) -> {MaxAcc, CurrAcc, RunningAcc}. +plus_max_connections(_, infinity) -> + infinity; +plus_max_connections(infinity, _) -> + infinity; +plus_max_connections(A, B) when is_integer(A) andalso is_integer(B) -> + A + B. + aggregate_running(R, R) -> R; aggregate_running(R, undefined) -> R; aggregate_running(_, _) -> inconsistent. diff --git a/apps/emqx_gateway/src/emqx_gateway_schema.erl b/apps/emqx_gateway/src/emqx_gateway_schema.erl index 3c5706e82..96eeb3f62 100644 --- a/apps/emqx_gateway/src/emqx_gateway_schema.erl +++ b/apps/emqx_gateway/src/emqx_gateway_schema.erl @@ -266,7 +266,7 @@ common_listener_opts() -> )}, {max_connections, sc( - integer(), + hoconsc:union([infinity, pos_integer()]), #{ default => 1024, desc => ?DESC(gateway_common_listener_max_connections)