diff options
author | Micael Karlberg <[email protected]> | 2012-01-09 17:50:47 +0100 |
---|---|---|
committer | Micael Karlberg <[email protected]> | 2012-01-12 12:13:11 +0100 |
commit | daf5b0eeb6f0d8c805f7a0e2fc117c8c788b855c (patch) | |
tree | 1a67da27edd104358aef66e269ba63a660804566 /lib/snmp/src | |
parent | 021d5c2e49e623d4f43c0cc88a097bc99f3564e6 (diff) | |
download | otp-daf5b0eeb6f0d8c805f7a0e2fc117c8c788b855c.tar.gz otp-daf5b0eeb6f0d8c805f7a0e2fc117c8c788b855c.tar.bz2 otp-daf5b0eeb6f0d8c805f7a0e2fc117c8c788b855c.zip |
[snmp/agent] Creating a unique temporary file whe dumping vacm
Attempting to create a unique temporary file when dumping the
vacm table to disk.
OTP-9851
Diffstat (limited to 'lib/snmp/src')
-rw-r--r-- | lib/snmp/src/agent/snmpa_vacm.erl | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/lib/snmp/src/agent/snmpa_vacm.erl b/lib/snmp/src/agent/snmpa_vacm.erl index 892dc265f1..c31b8e61a3 100644 --- a/lib/snmp/src/agent/snmpa_vacm.erl +++ b/lib/snmp/src/agent/snmpa_vacm.erl @@ -266,9 +266,24 @@ dump_table(true) -> 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 greated than zero, +%% create another dumper process and resets the counter. +%% In this way the dumping is serializede, but the master-agent +%% process is not burdened by the dumping. +%% </SUGGESTION> dump_table() -> [{_, FName}] = ets:lookup(snmp_agent_table, snmpa_vacm_file), - TmpName = FName ++ ".tmp", + TmpName = unique(FName), case ets:tab2file(snmpa_vacm, TmpName) of ok -> case file:rename(TmpName, FName) of @@ -283,6 +298,32 @@ dump_table() -> [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. +unique(Pre) -> + {A, B, C} = os:timestamp(), + {D, _} = erlang:statistics(reductions), + {E, _} = erlang:statistics(runtime), + {F, _} = erlang:statistics(wall_clock), + {G, H, _} = erlang:statistics(garbage_collection), + Data = [A, B, C, D, E, F, G, H], + unique(Pre, Data, 0). + +unique(Pre, [], Unique) -> + PidPart = unique_pid(), + lists:flatten(io_lib:format("~s.~s~w.tmp", [Pre, PidPart, Unique])); +unique(Pre, [H|T], Unique) -> + unique(Pre, T, Unique bxor H). + +unique_pid() -> + case string:tokens(pid_to_list(self()), [$<,$.,$>]) of + [A, B, C] -> + A ++ B ++ C ++ "."; + _ -> + "" + end. + %%----------------------------------------------------------------- %% Alg. |