diff --git a/apps/emqx/src/emqx_listeners.erl b/apps/emqx/src/emqx_listeners.erl index 410519a6c..b8205a5f6 100644 --- a/apps/emqx/src/emqx_listeners.erl +++ b/apps/emqx/src/emqx_listeners.erl @@ -116,6 +116,7 @@ format_raw_listeners({Type0, Conf}) -> fun ({LName, LConf0}) when is_map(LConf0) -> Bind = parse_bind(LConf0), + MaxConn = maps:get(<<"max_connections">>, LConf0, default_max_conn()), Running = is_running(Type, listener_id(Type, LName), LConf0#{bind => Bind}), LConf1 = maps:remove(<<"authentication">>, LConf0), LConf2 = maps:put(<<"running">>, Running, LConf1), @@ -124,7 +125,10 @@ format_raw_listeners({Type0, Conf}) -> true -> current_conns(Type, LName, Bind); false -> 0 end, - LConf = maps:put(<<"current_connections">>, CurrConn, LConf2), + LConf = maps:merge(LConf2, #{ + <<"current_connections">> => CurrConn, + <<"max_connections">> => ensure_max_conns(MaxConn) + }), {true, {Type0, LName, LConf}}; ({_LName, _MarkDel}) -> false @@ -994,3 +998,7 @@ unregister_ocsp_stapling_refresh(Type, Name) -> default_max_conn() -> <<"infinity">>. + +ensure_max_conns(<<"infinity">>) -> <<"infinity">>; +ensure_max_conns(MaxConn) when is_binary(MaxConn) -> binary_to_integer(MaxConn); +ensure_max_conns(MaxConn) -> MaxConn. diff --git a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl index a4ec3fe92..c47cea07e 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl @@ -140,6 +140,16 @@ t_list_listeners(Config) when is_list(Config) -> ?assertMatch(#{<<"max_connections">> := <<"infinity">>}, Create), ?assert(is_running(NewListenerId)), + Update2 = request(put, NewPath, [], Create#{<<"max_connections">> => 100}), + ?assertMatch(#{<<"max_connections">> := 100}, Update2), + Get2 = request(get, NewPath, [], []), + ?assertMatch(#{<<"max_connections">> := 100}, Get2), + + Update3 = request(put, NewPath, [], Create#{<<"max_connections">> => <<"123">>}), + ?assertMatch(#{<<"max_connections">> := 123}, Update3), + Get3 = request(get, NewPath, [], []), + ?assertMatch(#{<<"max_connections">> := 123}, Get3), + %% delete ?assertEqual([], delete(NewPath)), ?assertEqual({error, not_found}, is_running(NewListenerId)), diff --git a/changes/ce/fix-11042.en.md b/changes/ce/fix-11042.en.md new file mode 100644 index 000000000..07d778d8c --- /dev/null +++ b/changes/ce/fix-11042.en.md @@ -0,0 +1 @@ +Fix crash on `/api/listeners` when listener's max_connections is set to a string.