File 0595-kernel-socket-test-Tweaking.patch of Package erlang

From 207bf97d5674bece064c16ee7ec2520ee02cef5a Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 2 Aug 2021 14:51:31 +0200
Subject: [PATCH 2/4] [kernel|socket|test] Tweaking

Handle possible global register_name timeout (give it max
15 seconds) during suite init.
Also handle other registration failures.
Skip suite for any registration failures.
---
 lib/kernel/test/socket_SUITE.erl       | 27 ++++++++++++++----
 lib/kernel/test/socket_test_logger.erl | 39 ++++++++++++++++++++++++--
 2 files changed, 58 insertions(+), 8 deletions(-)

diff --git a/lib/kernel/test/socket_SUITE.erl b/lib/kernel/test/socket_SUITE.erl
index 27f8d86f53..8bb1711efb 100644
--- a/lib/kernel/test/socket_SUITE.erl
+++ b/lib/kernel/test/socket_SUITE.erl
@@ -1985,6 +1985,9 @@ otp16359_cases() ->
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 init_per_suite(Config) ->
+    io:format("init_per_suite -> entry with"
+              "~n   Config: ~p"
+              "~n", [Config]),
     ct:timetrap(?MINS(2)),
     Factor = analyze_and_print_host_info(),
     try socket:info() of
@@ -1992,12 +1995,26 @@ init_per_suite(Config) ->
             socket:use_registry(false),
             case quiet_mode(Config) of
                 default ->
-                    ?LOGGER:start(),
-                    [{esock_factor, Factor} | Config];
+                    case ?LOGGER:start() of
+                        ok ->
+                            [{esock_factor, Factor} | Config];
+                        {error, Reason} ->
+                            io:format("init_per_suite -> Failed starting logger"
+                                      "~n   Reason: ~p"
+                                      "~n", [Reason]),
+                            {skip, "Failed starting logger"}
+                    end;
                 Quiet ->
-                    ?LOGGER:start(Quiet),
-                    [{esock_factor,     Factor},
-                     {esock_test_quiet, Quiet} | Config]
+                    case ?LOGGER:start(Quiet) of
+                        ok ->
+                            [{esock_factor,     Factor},
+                             {esock_test_quiet, Quiet} | Config];
+                        {error, Reason} ->
+                            io:format("init_per_suite -> Failed starting logger"
+                                      "~n   Reason: ~p"
+                                      "~n", [Reason]),
+                            {skip, "Failed starting logger"}
+                    end
             end
     catch
         error : notsup ->
diff --git a/lib/kernel/test/socket_test_logger.erl b/lib/kernel/test/socket_test_logger.erl
index f5d4c8c7b2..6374c70d18 100644
--- a/lib/kernel/test/socket_test_logger.erl
+++ b/lib/kernel/test/socket_test_logger.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 2018-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
 %%
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -44,8 +44,38 @@ start(Quiet) ->
         undefined ->
             Self = self(),
             Pid = spawn(fun() -> init(Self, Quiet) end),
-            yes = global:register_name(?LOGGER, Pid),
-            ok
+            %% We have seen some (strange) cases where the call to 
+            %% register (global:register_name/2) takes *a long time*.
+            %% This operation should not take more than a couple of
+            %% seconds in our case (we have no complex test environment).
+            %% So, we give it a bit more, 15 seconds.
+            %% If it has not completed within that time limit, we give up!
+            %% yes = global:register_name(?LOGGER, Pid),
+            {Register, MRef} = spawn_monitor(fun() -> register_logger(Pid) end),
+            await_register_logger(Register, MRef)
+    end.
+
+register_logger(Pid) when is_pid(Pid) ->
+    print("[~s] try register logger (~p)", [?LIB:formated_timestamp(), Pid]),
+    yes = global:register_name(?LOGGER, Pid),
+    exit(ok).
+
+
+await_register_logger(Pid, MRef) ->
+    receive
+        {'DOWN', MRef, process, Pid, ok} ->
+            print("[~s] logger registration done", [?LIB:formated_timestamp()]),
+            ok;
+        {'DOWN', MRef, process, Pid, Reason} ->
+            print("[~s] <ERROR> logger registration failed: "
+                  "~n      ~p", [?LIB:formated_timestamp(), Reason]),
+            {error, Reason}
+    after 15000 ->
+            print("[~s] <ERROR> logger registration failed: timeout",
+                  [?LIB:formated_timestamp()]),
+            erlang:demonitor(MRef, [flush]),
+            exit(Pid, kill),
+            {error, registration_timeout}
     end.
 
 
@@ -96,6 +126,9 @@ loop(#{parent := Parent,
     end.
 
 
+print(F) ->
+    print(F, []).
+
 print(F, A) ->
     print_str(false, ?LIB:f(F, A)).
 
-- 
2.31.1

openSUSE Build Service is sponsored by