mnesia_event.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 258 行

ERL
258
字号
%% ``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%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(mnesia_event).-behaviour(gen_event).%-behaviour(mnesia_event).%% gen_event callback interface-export([init/1,	 handle_event/2,	 handle_call/2,	 handle_info/2,	 terminate/2,	 code_change/3]).-record(state, {nodes = [], 		dumped_core = false,  %% only dump fatal core once		args}).%%%----------------------------------------------------------------%%% Callback functions from gen_server%%%----------------------------------------------------------------%%-----------------------------------------------------------------%% init(Args) ->%%     {ok, State} | Error%%-----------------------------------------------------------------init(Args) ->    {ok, #state{args = Args}}.%%-----------------------------------------------------------------%% handle_event(Event, State) -> %%    {ok, NewState} | remove_handler |%%    {swap_handler, Args1, State1, Mod2, Args2}%%-----------------------------------------------------------------handle_event(Event, State) ->    handle_any_event(Event, State).%%-----------------------------------------------------------------%% handle_info(Msg, State) ->%%    {ok, NewState} | remove_handler |%%    {swap_handler, Args1, State1, Mod2, Args2}%%-----------------------------------------------------------------handle_info(Msg, State) ->    handle_any_event(Msg, State),    {ok, State}.%%-----------------------------------------------------------------%% handle_call(Event, State) -> %%    {ok, Reply, NewState} | {remove_handler, Reply} | %%    {swap_handler, Reply, Args1, State1, Mod2, Args2}%%-----------------------------------------------------------------handle_call(Msg, State) ->    Reply = ok,    {ok, NewState} = handle_any_event(Msg, State),    {ok, Reply, NewState}.%%-----------------------------------------------------------------%% terminate(Reason, State) ->%%     AnyVal%%-----------------------------------------------------------------terminate(_Reason, _State) ->    ok.%%----------------------------------------------------------------------%% Func: code_change/3%% Purpose: Upgrade process when its code is to be changed%% Returns: {ok, NewState}%%----------------------------------------------------------------------code_change(_OldVsn, State, _Extra) ->    {ok, State}.%%-----------------------------------------------------------------%% Internal functions%%-----------------------------------------------------------------handle_any_event({mnesia_system_event, Event}, State) ->    handle_system_event(Event, State);handle_any_event({mnesia_table_event, Event}, State) ->    handle_table_event(Event, State);handle_any_event(Msg, State) ->    report_error("~p got unexpected event: ~p~n", [?MODULE, Msg]),    {ok, State}.handle_table_event({Oper, Record, TransId}, State) ->    report_info("~p performed by ~p on record:~n\t~p~n",		[Oper, TransId, Record]),    {ok, State}.  handle_system_event({mnesia_checkpoint_activated, _Checkpoint}, State) ->    {ok, State};handle_system_event({mnesia_checkpoint_deactivated, _Checkpoint}, State) ->    {ok, State};handle_system_event({mnesia_up, Node}, State) ->    Nodes = [Node | State#state.nodes],    {ok, State#state{nodes = Nodes}}; handle_system_event({mnesia_down, Node}, State) ->    case mnesia:system_info(fallback_activated) of	true ->	    case mnesia_monitor:get_env(fallback_error_function) of		{mnesia, lkill} ->		    Msg = "A fallback is installed and Mnesia "			"must be restarted. Forcing shutdown "			"after mnesia_down from ~p...~n",		    report_fatal(Msg, [Node], nocore, State#state.dumped_core),		    mnesia:lkill(),		    exit(fatal);		{UserMod, UserFunc} ->		    Msg = "Warning: A fallback is installed and Mnesia got mnesia_down "			"from ~p. ~n",		    report_info(Msg, [Node]),		    case catch apply(UserMod, UserFunc, [Node]) of			{'EXIT', {undef, _Reason}} ->			    %% Backward compatibility			    apply(UserMod, UserFunc, []);			{'EXIT', Reason} ->			    exit(Reason);			_ ->			    ok		    end,		    Nodes = lists:delete(Node, State#state.nodes),		    {ok, State#state{nodes = Nodes}}	    end;	false ->	    Nodes = lists:delete(Node, State#state.nodes),	    {ok, State#state{nodes = Nodes}}    end;handle_system_event({mnesia_overload, Details}, State) ->    report_warning("Mnesia is overloaded: ~p~n", [Details]),    {ok, State}; handle_system_event({mnesia_info, Format, Args}, State) ->    report_info(Format, Args),    {ok, State}; handle_system_event({mnesia_warning, Format, Args}, State) ->    report_warning(Format, Args),    {ok, State}; handle_system_event({mnesia_error, Format, Args}, State) ->    report_error(Format, Args),    {ok, State}; handle_system_event({mnesia_fatal, Format, Args, BinaryCore}, State) ->    report_fatal(Format, Args, BinaryCore, State#state.dumped_core),    {ok, State#state{dumped_core = true}};handle_system_event({inconsistent_database, Reason, Node}, State) ->    report_error("mnesia_event got {inconsistent_database, ~w, ~w}~n",		 [Reason, Node]),    {ok, State}; handle_system_event({mnesia_user, Event}, State) ->    report_info("User event: ~p~n", [Event]),    {ok, State}; handle_system_event(Msg, State) ->    report_error("mnesia_event got unexpected system event: ~p~n", [Msg]),    {ok, State}.report_info(Format0, Args0) ->    Format = "Mnesia(~p): " ++ Format0,    Args = [node() | Args0],    case global:whereis_name(mnesia_global_logger) of	undefined ->	    io:format(Format, Args);	Pid ->	    io:format(Pid, Format, Args)    end.report_warning(Format0, Args0) ->    Format = "Mnesia(~p): ** WARNING ** " ++ Format0,    Args = [node() | Args0],    case erlang:function_exported(error_logger, warning_msg, 2) of	true -> 	    error_logger:warning_msg(Format, Args);	false ->	    error_logger:format(Format, Args)    end,    case global:whereis_name(mnesia_global_logger) of	undefined ->	    ok;	Pid ->	    io:format(Pid, Format, Args)    end.report_error(Format0, Args0) ->    Format = "Mnesia(~p): ** ERROR ** " ++ Format0,    Args = [node() | Args0],    error_logger:format(Format, Args),    case global:whereis_name(mnesia_global_logger) of	undefined ->	    ok;	Pid ->	    io:format(Pid, Format, Args)    end.report_fatal(Format, Args, BinaryCore, CoreDumped) ->    UseDir = mnesia_monitor:use_dir(),    CoreDir = mnesia_monitor:get_env(core_dir),    if	list(CoreDir),CoreDumped == false,binary(BinaryCore) ->	    	    core_file(CoreDir,BinaryCore,Format,Args);	(UseDir == true),CoreDumped == false,binary(BinaryCore) ->	    core_file(CoreDir,BinaryCore,Format,Args);	true ->	    report_error("(ignoring core) ** FATAL ** " ++ Format, Args)    end.core_file(CoreDir,BinaryCore,Format,Args) ->    %% Integers = tuple_to_list(date()) ++ tuple_to_list(time()),    Integers = tuple_to_list(now()),    Fun = fun(I) when I < 10 -> ["_0",I];	     (I) -> ["_",I]	  end,    List = lists:append([Fun(I) || I <- Integers]),    CoreFile = if list(CoreDir) ->		       filename:absname(lists:concat(["MnesiaCore.", node()] ++ List), 					CoreDir);		  true ->		       filename:absname(lists:concat(["MnesiaCore.", node()] ++ List))	       end,    case file:write_file(CoreFile, BinaryCore) of	ok ->	    report_error("(core dumped to file: ~p)~n ** FATAL ** " ++ Format,			 [CoreFile] ++ Args);	{error, Reason} ->	    report_error("(could not write core file: ~p)~n ** FATAL ** " ++ Format,			 [Reason] ++ Args)    end.	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?