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

openSUSE Build Service is sponsored by