File 3221-snmp-manager-Make-it-possible-to-restart-the-net-if.patch of Package erlang
From 7e6b8ff83228ca672ad3d2ebc170db4f4a7dba0f Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 4 Feb 2020 17:03:22 +0100
Subject: [PATCH 1/5] [snmp|manager] Make it possible to restart the net-if
Make it possible to restart the net-if. This can be usefull
if the net-if process "gets stuck"...
OTP-16447
---
lib/snmp/src/manager/snmpm.erl | 15 +++++++++++++--
lib/snmp/src/manager/snmpm_server.erl | 36 +++++++++++++++++++++++------------
2 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/lib/snmp/src/manager/snmpm.erl b/lib/snmp/src/manager/snmpm.erl
index 8e60cecaf9..fe30dbbdff 100644
--- a/lib/snmp/src/manager/snmpm.erl
+++ b/lib/snmp/src/manager/snmpm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2020. 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.
@@ -90,7 +90,8 @@
sys_up_time/0,
info/0,
- verbosity/2
+ verbosity/2,
+ restart/1
]).
-export([format_reason/1, format_reason/2]).
@@ -316,6 +317,16 @@ verbosity(all, V) ->
snmpm_server:verbosity(note_store, V).
+%% -- Restart --
+
+%% Restart various component processes in the manager
+%% Note that the effects of this is diffiult to
+%% predict, so it should be use with *caution*!
+
+restart(net_if = What) ->
+ snmpm_server:restart(What).
+
+
%% -- Users --
%% Register the 'user'.
diff --git a/lib/snmp/src/manager/snmpm_server.erl b/lib/snmp/src/manager/snmpm_server.erl
index fe2c22d9ba..b3740b4d83 100644
--- a/lib/snmp/src/manager/snmpm_server.erl
+++ b/lib/snmp/src/manager/snmpm_server.erl
@@ -45,13 +45,13 @@
%% discovery/2, discovery/3, discovery/4, discovery/5, discovery/6,
- %% system_info_updated/2,
get_log_type/0, set_log_type/1,
reconfigure/0,
info/0,
- verbosity/1, verbosity/2
+ verbosity/1, verbosity/2,
+ restart/1
]).
@@ -492,6 +492,9 @@ cancel_async_request(UserId, ReqId) ->
call({cancel_async_request, UserId, ReqId}).
+info() ->
+ call(info).
+
verbosity(Verbosity) ->
case ?vvalidate(Verbosity) of
Verbosity ->
@@ -500,9 +503,6 @@ verbosity(Verbosity) ->
{error, {invalid_verbosity, Verbosity}}
end.
-info() ->
- call(info).
-
verbosity(net_if = Ref, Verbosity) ->
verbosity2(Ref, Verbosity);
verbosity(note_store = Ref, Verbosity) ->
@@ -516,9 +516,10 @@ verbosity2(Ref, Verbosity) ->
{error, {invalid_verbosity, Verbosity}}
end.
-%% Target -> all | server | net_if
-%% system_info_updated(Target, What) ->
-%% call({system_info_updated, Target, What}).
+
+restart(net_if = What) ->
+ cast({restart, What}).
+
get_log_type() ->
call(get_log_type).
@@ -624,7 +625,7 @@ do_init_note_store(Prio) ->
end.
do_init_net_if(NoteStore) ->
- ?vdebug("try start net if", []),
+ ?vdebug("try start net-if", []),
{ok, NetIfModule} = snmpm_config:system_info(net_if_module),
case snmpm_misc_sup:start_net_if(NetIfModule, NoteStore) of
{ok, Pid} ->
@@ -638,6 +639,7 @@ do_init_net_if(NoteStore) ->
throw({error, {failed_starting_net_if, Reason}})
end.
+
%% ---------------------------------------------------------------------
%% ---------------------------------------------------------------------
@@ -1017,6 +1019,13 @@ handle_call(Req, _From, State) ->
{reply, {error, unknown_request}, State}.
+handle_cast({restart, net_if},
+ #state{net_if = Pid} = State) ->
+ ?vlog("received net_if (~p) restart message", [Pid]),
+ %% We will get an exit signel/message, which will trigger a (re-)start
+ exit(Pid, kill),
+ {noreply, State};
+
handle_cast(Msg, State) ->
warning_msg("received unknown message: ~n~p", [Msg]),
{noreply, State}.
@@ -1080,7 +1089,7 @@ handle_info(gc_timeout, #state{gct = GCT} = State) ->
handle_info({'DOWN', _MonRef, process, Pid, _Reason},
#state{note_store = NoteStore,
net_if = Pid} = State) ->
- ?vlog("received 'DOWN' message regarding net_if", []),
+ ?vlog("received 'DOWN' message regarding net_if (~p)", [Pid]),
{NetIf, _, Ref} = do_init_net_if(NoteStore),
{noreply, State#state{net_if = NetIf, net_if_ref = Ref}};
@@ -1089,7 +1098,7 @@ handle_info({'DOWN', _MonRef, process, Pid, _Reason},
#state{note_store = Pid,
net_if = NetIf,
net_if_mod = Mod} = State) ->
- ?vlog("received 'DOWN' message regarding note_store", []),
+ ?vlog("received 'DOWN' message regarding note_store (~p)", [Pid]),
{ok, Prio} = snmpm_config:system_info(prio),
{NoteStore, Ref} = do_init_note_store(Prio),
Mod:note_store(NetIf, NoteStore),
@@ -3651,6 +3660,9 @@ is_started(#state{net_if = _Pid, net_if_mod = _Mod}) ->
%%----------------------------------------------------------------------
+cast(Req) ->
+ gen_server:cast(?SERVER, Req).
+
call(Req) ->
call(Req, infinity).
--
2.16.4