diff options
author | Micael Karlberg <[email protected]> | 2012-01-11 17:56:29 +0100 |
---|---|---|
committer | Micael Karlberg <[email protected]> | 2012-01-12 12:13:18 +0100 |
commit | c2de50f0acc5f30579d0ca0a03cbaf42847dfa9e (patch) | |
tree | f567b24dea37e0a9b842a8bb2b81f0aae6fddf94 | |
parent | ae28d8822e0d0725c23483662d82e6986e5cefa5 (diff) | |
download | otp-c2de50f0acc5f30579d0ca0a03cbaf42847dfa9e.tar.gz otp-c2de50f0acc5f30579d0ca0a03cbaf42847dfa9e.tar.bz2 otp-c2de50f0acc5f30579d0ca0a03cbaf42847dfa9e.zip |
[snmp/agent] Use unique temporary file name during vacm table dumnping
Removed the use synchronization mechanism during vacm table dumping.
This could not be placed in the master agent since it was sometimes
used from the master agent. Also is was credated and used from the
top agent supervisor, befor the master agent process was created...
OTP-9851
-rw-r--r-- | lib/snmp/src/agent/snmp_view_based_acm_mib.erl | 29 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_agent.erl | 4 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_vacm.erl | 80 |
3 files changed, 41 insertions, 72 deletions
diff --git a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl index 37f6dd3f26..2cee91b081 100644 --- a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl +++ b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2011. All Rights Reserved. +%% Copyright Ericsson AB 1999-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -203,18 +203,16 @@ init_sec2group_table([Row | T]) -> init_sec2group_table(T); init_sec2group_table([]) -> true. -init_access_table([{GN, Prefix, Model, Level, Row} | T]) -> -%% ?vtrace("init access table: " -%% "~n GN: ~p" -%% "~n Prefix: ~p" -%% "~n Model: ~p" -%% "~n Level: ~p" -%% "~n Row: ~p",[GN, Prefix, Model, Level, Row]), - Key = [length(GN) | GN] ++ [length(Prefix) | Prefix] ++ [Model, Level], - snmpa_vacm:insert([{Key, Row}], false), - init_access_table(T); -init_access_table([]) -> - snmpa_vacm:dump_table(). +make_access_key(GN, Prefix, Model, Level) -> + [length(GN) | GN] ++ [length(Prefix) | Prefix] ++ [Model, Level]. + +make_access_entry({GN, Prefix, Model, Level, Row}) -> + Key = make_access_key(GN, Prefix, Model, Level), + {Key, Row}. + +init_access_table(TableData) -> + TableData2 = [make_access_entry(E) || E <- TableData], + snmpa_vacm:insert(TableData2, true). init_view_table([Row | T]) -> %% ?vtrace("init view table: " @@ -276,10 +274,7 @@ add_access(GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV) -> Match, RV, WV, NV}, case (catch check_vacm(Access)) of {ok, {vacmAccess, {GN, Pref, SM, SL, Row}}} -> - Key1 = [length(GN) | GN], - Key2 = [length(Pref) | Pref], - Key3 = [SM, SL], - Key = Key1 ++ Key2 ++ Key3, + Key = make_access_key(GN, Pref, SM, SL), snmpa_vacm:insert([{Key, Row}], false), snmpa_agent:invalidate_ca_cache(), {ok, Key}; diff --git a/lib/snmp/src/agent/snmpa_agent.erl b/lib/snmp/src/agent/snmpa_agent.erl index b78f520c50..5db3eab012 100644 --- a/lib/snmp/src/agent/snmpa_agent.erl +++ b/lib/snmp/src/agent/snmpa_agent.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -4081,7 +4081,7 @@ handle_serializer_down(Mon, Tag) -> %% ------------------------------------------------------------------------ -agent_info(#state{worker = W, set_worker = SW}) -> +agent_info(#state{worker = W, set_worker = SW}) -> case (catch get_agent_info(W, SW)) of Info when is_list(Info) -> Info; diff --git a/lib/snmp/src/agent/snmpa_vacm.erl b/lib/snmp/src/agent/snmpa_vacm.erl index efe6378105..2cbc11d280 100644 --- a/lib/snmp/src/agent/snmpa_vacm.erl +++ b/lib/snmp/src/agent/snmpa_vacm.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2010. All Rights Reserved. +%% Copyright Ericsson AB 1999-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -267,71 +267,45 @@ dump_table(_) -> ok. -%% We should really make an effort to serialize the dumping -%% to ensure that several processes that dump at-the-same-time -%% do not trash each others dumps. -%% <SUGGESTION> -%% Send the request to the master agent, which, if there is no -%% dumper already running, spawns a (temporary) dumper process. -%% If there is already a running dumper process, instead increment -%% the dump_request counter. -%% When the dumper process exits, the master agent checks the -%% the dump_request counter, and if that is greater than zero, -%% create another dumper process and resets the counter. -%% In this way the dumping is serialized, but the master-agent -%% process is not burdend by the dumping. -%% </SUGGESTION> dump_table() -> - %% The dumper fun is executed in a specially started process, - %% that does that one thing and then exits. - %% Also, to prevent the system to run "wild" (keep calling - %% dump function before they are done), the agents serialize - %% function return when that dump is done! - Dumper = - fun() -> - [{_, FName}] = ets:lookup(snmp_agent_table, snmpa_vacm_file), - %% TmpName = FName ++ ".tmp", - TmpName = unique_name(FName), - case ets:tab2file(snmpa_vacm, TmpName) of - ok -> - case file:rename(TmpName, FName) of - ok -> - ok; - Else -> % What is this? Undocumented return code... - user_err("Warning: could not move VACM db ~p" - " (~p)", [FName, Else]) - end; - {error, Reason} -> - user_err("Warning: could not save vacm db ~p (~p)", - [FName, Reason]) - end - end, - snmpa_agent:serialize(snmpa_vacm_dump_request, Dumper). - + [{_, FName}] = ets:lookup(snmp_agent_table, snmpa_vacm_file), + TmpName = unique_table_name(FName), + case ets:tab2file(snmpa_vacm, TmpName) of + ok -> + case file:rename(TmpName, FName) of + ok -> + ok; + Else -> % What is this? Undocumented return code... + user_err("Warning: could not move VACM db ~p" + " (~p)", [FName, Else]) + end; + {error, Reason} -> + user_err("Warning: could not save vacm db ~p (~p)", + [FName, Reason]) + end. %% This little thing is an attempt to create a "unique" filename %% in order to minimize the risk of two processes at the same %% time dumping the table. -%% The serialization handled by the agent does this much better, -%% but this also gives us a "timestamp" which could be usefull for -%% debugging reasons. -unique_name(Pre) -> - unique_name(Pre, os:timestamp()). - -unique_name(Pre, {_A, _B, C} = Timestamp) -> - {Date, Time} = calendar:now_to_datetime(Timestamp), +unique_table_name(Pre) -> + %% We want something that is guaranteed to be unique, + %% therefor we use erlang:now() instead of os:timestamp() + unique_table_name(Pre, erlang:now()). + +unique_table_name(Pre, {_A, _B, C} = Now) -> + {Date, Time} = calendar:now_to_datetime(Now), {YYYY, MM, DD} = Date, {Hour, Min, Sec} = Time, FormatDate = io_lib:format("~.4w~.2.0w~.2.0w_~.2.0w~.2.0w~.2.0w_~w", [YYYY, MM, DD, Hour, Min, Sec, round(C/1000)]), - unique_name2(Pre, FormatDate). + unique_table_name2(Pre, FormatDate). -unique_name2(Pre, FormatedDate) -> - PidPart = unique_pid(), +unique_table_name2(Pre, FormatedDate) -> + PidPart = unique_table_name_pid(), lists:flatten(io_lib:format("~s.~s~s.tmp", [Pre, PidPart, FormatedDate])). -unique_pid() -> +unique_table_name_pid() -> case string:tokens(pid_to_list(self()), [$<,$.,$>]) of [A, B, C] -> A ++ B ++ C ++ "."; |