File 2921-feat-atomic-get_handler_configs.patch of Package erlang
From 27042fa13d1cf8979df55444a4f82f289bcf0add Mon Sep 17 00:00:00 2001
From: Marko Mindek <marko.mindek@gmail.com>
Date: Tue, 21 Oct 2025 02:10:02 +0200
Subject: [PATCH] feat: atomic get_handler_configs
---
lib/kernel/src/logger.erl | 17 +++++++++--------
lib/kernel/src/logger_config.erl | 6 +++++-
lib/kernel/test/logger_SUITE.erl | 25 +++++++++++++++++++++++++
3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl
index 5070859f7c..6bc993eec7 100644
--- a/lib/kernel/src/logger.erl
+++ b/lib/kernel/src/logger.erl
@@ -553,21 +553,22 @@ get_primary_config() ->
Config :: handler_config().
get_handler_config(HandlerId) ->
case logger_config:get(?LOGGER_TABLE,HandlerId) of
- {ok,#{module:=Module}=Config} ->
- {ok,try Module:filter_config(Config)
- catch _:_ -> Config
- end};
+ {ok, Config} ->
+ {ok, filter_config(Config)};
Error ->
Error
end.
+filter_config(#{module:=Module}=Config) ->
+ try Module:filter_config(Config)
+ catch _:_ -> Config
+ end.
+
-spec get_handler_config() -> [Config] when
Config :: handler_config().
get_handler_config() ->
- [begin
- {ok,Config} = get_handler_config(HandlerId),
- Config
- end || HandlerId <- get_handler_ids()].
+ Configs = logger_config:get(?LOGGER_TABLE),
+ [filter_config(Config) || Config <- Configs].
-spec get_handler_ids() -> [HandlerId] when
HandlerId :: handler_id().
diff --git a/lib/kernel/src/logger_config.erl b/lib/kernel/src/logger_config.erl
index cfe6d45b83..621e210baa 100644
--- a/lib/kernel/src/logger_config.erl
+++ b/lib/kernel/src/logger_config.erl
@@ -25,7 +25,7 @@
-export([new/1,delete/2,
exist/2,
allow/1,allow/2,
- get/2, get/3,
+ get/1, get/2, get/3,
create/3, set/3,
set_module_level/2,unset_module_level/1,
get_module_level/0,
@@ -90,6 +90,10 @@ exist(Tid,What) ->
get_primary_level() ->
persistent_term:get({?MODULE,?PRIMARY_KEY},?NOTICE).
+get(Tid) ->
+ Configs = ets:match(Tid, {{?HANDLER_KEY, '_'}, '$1'}),
+ lists:flatten(Configs).
+
get(Tid,What) ->
case ets:lookup(Tid,table_key(What)) of
[{_,Config}] ->
diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl
index d381309a7f..d0b33cec22 100644
--- a/lib/kernel/test/logger_SUITE.erl
+++ b/lib/kernel/test/logger_SUITE.erl
@@ -84,6 +84,7 @@ all() ->
multiple_handlers,
add_remove_filter,
change_config,
+ get_config_error,
set_formatter,
log_no_levels,
log_all_levels_api,
@@ -298,6 +299,30 @@ change_config(cleanup,Config) ->
logger:set_primary_config(PC),
ok.
+get_config_error(_Config) ->
+ Self = self(),
+ register(callback_receiver,Self),
+ HandlerCnt = 2000,
+ HandlerIds = [list_to_atom("handler-"++integer_to_list(Idx)) || Idx <- lists:seq(1,HandlerCnt)],
+ [ok = logger:add_handler(HId,?MODULE,#{}) || HId <- HandlerIds],
+ RemoveFun = fun () ->
+ Self ! started,
+ [ok = logger:remove_handler(HId) || HId <- HandlerIds],
+ Self ! removed
+ end,
+ Remove = spawn(RemoveFun),
+ receive
+ started -> ok
+ end,
+ ?assertNotException(_, _, logger:get_handler_config()),
+ %% Just to make sure RemoveFun did not die before.
+ %% If line below fails please raise HandlerCnt by factor of 2
+ ?assert(erlang:is_process_alive(Remove)),
+ receive
+ removed -> ok
+ end,
+ ok.
+
set_formatter(_Config) ->
{error,{not_found,h1}}=logger:set_handler_config(h1,formatter,{?MODULE,[]}),
ok = logger:add_handler(h1,?MODULE,#{level=>notice,filter_default=>log}),
--
2.51.0