diff --git a/apps/emqx/src/emqx.app.src b/apps/emqx/src/emqx.app.src index 5ca8fc797..be68b438f 100644 --- a/apps/emqx/src/emqx.app.src +++ b/apps/emqx/src/emqx.app.src @@ -3,7 +3,7 @@ {id, "emqx"}, {description, "EMQX Core"}, % strict semver, bump manually! - {vsn, "5.0.25"}, + {vsn, "5.0.26"}, {modules, []}, {registered, []}, {applications, [ diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl index b9643dae4..64a8bf7a7 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl @@ -36,6 +36,7 @@ calc_capacity/1, extract_with_type/2, default_client_config/0, + default_bucket_config/0, short_paths_fields/1, get_listener_opts/1, get_node_opts/1, diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl index 488f47851..fcb1fd66c 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl @@ -131,6 +131,9 @@ connect(Id, Type, Cfg) -> -spec add_bucket(limiter_id(), limiter_type(), hocons:config() | undefined) -> ok. add_bucket(_Id, _Type, undefined) -> ok; +%% a bucket with an infinity rate shouldn't be added to this server, because it is always full +add_bucket(_Id, _Type, #{rate := infinity}) -> + ok; add_bucket(Id, Type, Cfg) -> ?CALL(Type, {add_bucket, Id, Cfg}). @@ -507,8 +510,6 @@ make_root(#{rate := Rate, burst := Burst}) -> correction => 0 }. -do_add_bucket(_Id, #{rate := infinity}, #{root := #{rate := infinity}} = State) -> - State; do_add_bucket(Id, #{rate := Rate} = Cfg, #{buckets := Buckets} = State) -> case maps:get(Id, Buckets, undefined) of undefined -> diff --git a/apps/emqx/test/emqx_ratelimiter_SUITE.erl b/apps/emqx/test/emqx_ratelimiter_SUITE.erl index 6f488eaa9..331fe1b3c 100644 --- a/apps/emqx/test/emqx_ratelimiter_SUITE.erl +++ b/apps/emqx/test/emqx_ratelimiter_SUITE.erl @@ -617,6 +617,24 @@ t_extract_with_type(_) -> ) ). +t_add_bucket(_) -> + Checker = fun(Size) -> + #{buckets := Buckets} = sys:get_state(emqx_limiter_server:whereis(bytes)), + ?assertEqual(Size, maps:size(Buckets), Buckets) + end, + DefBucket = emqx_limiter_schema:default_bucket_config(), + ?assertEqual(ok, emqx_limiter_server:add_bucket(?FUNCTION_NAME, bytes, undefined)), + Checker(0), + ?assertEqual(ok, emqx_limiter_server:add_bucket(?FUNCTION_NAME, bytes, DefBucket)), + Checker(0), + ?assertEqual( + ok, emqx_limiter_server:add_bucket(?FUNCTION_NAME, bytes, DefBucket#{rate := 100}) + ), + Checker(1), + ?assertEqual(ok, emqx_limiter_server:del_bucket(?FUNCTION_NAME, bytes)), + Checker(0), + ok. + %%-------------------------------------------------------------------- %% Test Cases Create Instance %%--------------------------------------------------------------------