Skip to content

Commit

Permalink
Merge pull request #11042 from zhongwencool/max-connections-string
Browse files Browse the repository at this point in the history
fix: api_listener crash when setting max_connnections as string
  • Loading branch information
HJianBo committed Jun 14, 2023
2 parents d9cf9c2 + feb08b1 commit 86d3b70
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
10 changes: 9 additions & 1 deletion apps/emqx/src/emqx_listeners.erl
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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
Expand Down Expand Up @@ -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.
10 changes: 10 additions & 0 deletions apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -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)),
Expand Down
1 change: 1 addition & 0 deletions changes/ce/fix-11042.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix crash on `/api/listeners` when listener's max_connections is set to a string.

0 comments on commit 86d3b70

Please sign in to comment.