File 0814-snmp-test-Try-handling-failing-start-and-stop-of-age.patch of Package erlang

From 9f4d0e8992038793c3eb7e6af41ad93626458a7d Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Thu, 14 Nov 2024 13:59:18 +0100
Subject: [PATCH 4/7] [snmp|test] Try handling failing start and stop of agent

Try handling failing start and stop of agent, including
partial start...
---
 lib/snmp/test/snmp_agent_test_lib.erl | 143 ++++++++++++++++----------
 1 file changed, 89 insertions(+), 54 deletions(-)

diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl
index d89e1f62e2..28d73ff7d3 100644
--- a/lib/snmp/test/snmp_agent_test_lib.erl
+++ b/lib/snmp/test/snmp_agent_test_lib.erl
@@ -726,18 +726,29 @@ start_agent(Config, Vsns, Opts) ->
     ?DBG("start_agent -> snmp app supervisor: ~p", [AppSup]),
 
     ?IPRINT("start_agent -> try start master agent",[]),
-    Sup = start_sup(Env),
-    unlink(Sup),
-    ?DBG("start_agent -> snmp supervisor: ~p", [Sup]),
-
-    ?IPRINT("start_agent -> try (rpc) start sub agent on ~p", [SaNode]),
-    SaDir = ?config(sa_dir, Config),
-    {ok, Sub} = start_sub_sup(SaNode, SaDir),
-    ?DBG("start_agent -> done", []),
-
-    [{snmp_app_sup, AppSup},
-     {snmp_sup,     {Sup, self()}}, 
-     {snmp_sub,     Sub} | Config].
+    try start_sup(Env) of
+        Sup ->
+            unlink(Sup),
+            ?DBG("start_agent -> snmp supervisor: ~p", [Sup]),
+            
+            ?IPRINT("start_agent -> try (rpc) start sub agent on ~p", [SaNode]),
+            SaDir = ?config(sa_dir, Config),
+            {ok, Sub} = start_sub_sup(SaNode, SaDir),
+            ?DBG("start_agent -> done", []),
+
+            [{snmp_app_sup, AppSup},
+             {snmp_sup,     {Sup, self()}}, 
+             {snmp_sub,     Sub} | Config]
+    catch
+        C:E:S ->
+            ?EPRINT("start_agent -> "
+                    "failed starting master agent - stop app supervisor: "
+                    "~n   C: ~p"
+                    "~n   E: ~p"
+                    "~n   S: ~p", [C, E, S]),
+            stop_sup(AppSup, undefined),
+            erlang:raise(C, E, S)
+    end.
 
 
 app_agent_env_init(Env0, Opts) ->
@@ -929,49 +940,73 @@ merge_agent_options([{Key, _Value} = Opt|Opts], Options) ->
     end.
 
 
-stop_agent(Config) when is_list(Config) ->
+stop_agent(Config0) when is_list(Config0) ->
     ?IPRINT("stop_agent -> entry with"
-            "~n   Config: ~p",[Config]),
-
-
-    %% Stop the sub-agent (the agent supervisor)
-    {SubSup, SubPar} = ?config(snmp_sub, Config),
-    ?IPRINT("stop_agent -> attempt to stop sub agent (~p)"
-            "~n   Sub Sup info: "
-            "~n      ~p"
-            "~n   Sub Par info: "
-            "~n      ~p",
-            [SubSup, ?PINFO(SubSup), ?PINFO(SubPar)]),
-    stop_sup(SubSup, SubPar),
-    Config2 = lists:keydelete(snmp_sub, 1, Config),
-
-
-    %% Stop the master-agent (the top agent supervisor)
-    {MasterSup, MasterPar} = ?config(snmp_sup, Config),
-    ?IPRINT("stop_agent -> attempt to stop master agent (~p)"
-            "~n   Master Sup: "
-            "~n      ~p"
-            "~n   Master Par: "
-            "~n      ~p"
-            "~n   Agent Info: "
-            "~n      ~p",
-            [MasterSup,
-             ?PINFO(MasterSup), ?PINFO(MasterPar),
-             agent_info(MasterSup)]),
-    stop_sup(MasterSup, MasterPar),
-    Config3 = lists:keydelete(snmp_sup, 1, Config2),
-
-
-    %% Stop the top supervisor (of the snmp app)
-    AppSup = ?config(snmp_app_sup, Config),
-    ?IPRINT("stop_agent -> attempt to app sup ~p"
-            "~n   App Sup: ~p",
-            [AppSup, ?PINFO(AppSup)]),
-    Config4 = lists:keydelete(snmp_app_sup, 1, Config3),
-
-
-    ?IPRINT("stop_agent -> done", []),
-    Config4.
+            "~n   Config: ~p", [Config0]),
+
+    Fs =
+	[
+	 %% Stop the sub-agent (the agent supervisor)
+	 {"Stop the sub-agent (the agent supervisor)",
+	  fun(C) ->
+		  {SubSup, SubPar} = ?config(snmp_sub, C),
+		  ?IPRINT("stop_agent -> attempt to stop sub agent (~p)"
+			  "~n   Sub Sup info: "
+			  "~n      ~p"
+			  "~n   Sub Par info: "
+			  "~n      ~p",
+			  [SubSup, ?PINFO(SubSup), ?PINFO(SubPar)]),
+		  stop_sup(SubSup, SubPar),
+		  lists:keydelete(snmp_sub, 1, C)
+	  end},
+
+	 %% Stop the master-agent (the top agent supervisor)
+	 {"Stop the master-agent (the top agent supervisor)",
+	  fun(C) ->
+		  {MasterSup, MasterPar} = ?config(snmp_sup, C),
+		  ?IPRINT("stop_agent -> attempt to stop master agent (~p)"
+			  "~n   Master Sup: "
+			  "~n      ~p"
+			  "~n   Master Par: "
+			  "~n      ~p"
+			  "~n   Agent Info: "
+			  "~n      ~p",
+			  [MasterSup,
+			   ?PINFO(MasterSup), ?PINFO(MasterPar),
+			   agent_info(MasterSup)]),
+		  stop_sup(MasterSup, MasterPar),
+		  lists:keydelete(snmp_sup, 1, C)
+	  end},
+
+	 %% Stop the top supervisor (of the snmp app)
+	 {"Stop the top supervisor (of the snmp app)",
+	  fun(C) ->
+		  AppSup = ?config(snmp_app_sup, C),
+		  ?IPRINT("stop_agent -> attempt to app sup ~p"
+			  "~n   App Sup: ~p",
+			  [AppSup, ?PINFO(AppSup)]),
+		  stop_sup(AppSup, undefined),
+		  lists:keydelete(snmp_app_sup, 1, C)
+	  end}
+	],
+
+    {Config, Description} = stop_agent_loop(Fs, Config0),
+
+    ?IPRINT("stop_agent -> ~s", [Description]),
+    Config.
+
+stop_agent_loop([], Config) ->
+    {Config, "done"};
+stop_agent_loop([{Desc, F}|Fs], Config0) ->
+    ?IPRINT("try ~s", [Desc]),
+    try F(Config0) of
+	Config when is_list(Config) ->
+	    stop_agent_loop(Fs, Config)
+    catch
+	_:_:_ ->
+	    {"aborted at " ++ Desc, Config0}
+    end.
+
 
 start_app_sup() ->
     case snmp_app_sup:start_link() of
-- 
2.43.0

openSUSE Build Service is sponsored by