fix(limiter): refresh dispatcher limiter when retainer config updated
This commit is contained in:
parent
6ca58e5fbc
commit
fa99b65c91
|
@ -112,6 +112,10 @@
|
|||
%% If no bucket path is set in config, there will be no limit
|
||||
connect(_Type, undefined) ->
|
||||
{ok, emqx_htb_limiter:make_infinity_limiter()};
|
||||
%% Workaround.
|
||||
%% After API updated some config, the bucket name maybe become ‘’ (converted from empty binary)
|
||||
connect(_Type, '') ->
|
||||
{ok, emqx_htb_limiter:make_infinity_limiter()};
|
||||
connect(Type, BucketName) when is_atom(BucketName) ->
|
||||
case get_bucket_cfg(Type, BucketName) of
|
||||
undefined ->
|
||||
|
|
|
@ -201,6 +201,7 @@ init([]) ->
|
|||
|
||||
handle_call({update_config, NewConf, OldConf}, _, State) ->
|
||||
State2 = update_config(State, NewConf, OldConf),
|
||||
emqx_retainer_dispatcher:refresh_limiter(NewConf),
|
||||
{reply, ok, State2};
|
||||
handle_call(clean, _, #{context := Context} = State) ->
|
||||
clean(Context),
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
start_link/2,
|
||||
dispatch/2,
|
||||
refresh_limiter/0,
|
||||
refresh_limiter/1,
|
||||
wait_dispatch_complete/1,
|
||||
worker/0
|
||||
]).
|
||||
|
@ -51,13 +52,16 @@
|
|||
dispatch(Context, Topic) ->
|
||||
cast({?FUNCTION_NAME, Context, self(), Topic}).
|
||||
|
||||
%% sometimes it is necessary to reset the client's limiter after updated the limiter's config
|
||||
%% an limiter update handler maybe added later, now this is a workaround
|
||||
%% reset the client's limiter after updated the limiter's config
|
||||
refresh_limiter() ->
|
||||
Conf = emqx:get_config([retainer]),
|
||||
refresh_limiter(Conf).
|
||||
|
||||
refresh_limiter(Conf) ->
|
||||
Workers = gproc_pool:active_workers(?POOL),
|
||||
lists:foreach(
|
||||
fun({_, Pid}) ->
|
||||
gen_server:cast(Pid, ?FUNCTION_NAME)
|
||||
gen_server:cast(Pid, {?FUNCTION_NAME, Conf})
|
||||
end,
|
||||
Workers
|
||||
).
|
||||
|
@ -150,8 +154,8 @@ handle_call(Req, _From, State) ->
|
|||
handle_cast({dispatch, Context, Pid, Topic}, #{limiter := Limiter} = State) ->
|
||||
{ok, Limiter2} = dispatch(Context, Pid, Topic, undefined, Limiter),
|
||||
{noreply, State#{limiter := Limiter2}};
|
||||
handle_cast(refresh_limiter, State) ->
|
||||
BucketName = emqx_conf:get([retainer, flow_control, batch_deliver_limiter]),
|
||||
handle_cast({refresh_limiter, Conf}, State) ->
|
||||
BucketName = emqx_map_lib:deep_get([flow_control, batch_deliver_limiter], Conf, undefined),
|
||||
{ok, Limiter} = emqx_limiter_server:connect(batch, BucketName),
|
||||
{noreply, State#{limiter := Limiter}};
|
||||
handle_cast(Msg, State) ->
|
||||
|
|
Loading…
Reference in New Issue