summaryrefslogtreecommitdiff
path: root/lib/mnesia
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mnesia')
-rw-r--r--lib/mnesia/Makefile1
-rw-r--r--lib/mnesia/doc/misc/Makefile2
-rw-r--r--lib/mnesia/doc/src/Makefile81
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap4.xmlsrc8
-rw-r--r--lib/mnesia/doc/src/mnesia.xml14
-rw-r--r--lib/mnesia/src/Makefile1
-rw-r--r--lib/mnesia/src/mnesia.app.src48
-rw-r--r--lib/mnesia/src/mnesia.erl12
-rw-r--r--lib/mnesia/src/mnesia.hrl2
-rw-r--r--lib/mnesia/src/mnesia_event.erl8
-rw-r--r--lib/mnesia/src/mnesia_kernel_sup.erl1
-rw-r--r--lib/mnesia/src/mnesia_lib.erl56
-rw-r--r--lib/mnesia/src/mnesia_loader.erl4
-rw-r--r--lib/mnesia/src/mnesia_monitor.erl8
-rw-r--r--lib/mnesia/src/mnesia_rpc.erl86
-rw-r--r--lib/mnesia/src/mnesia_schema.erl2
-rw-r--r--lib/mnesia/src/mnesia_sp.erl13
-rw-r--r--lib/mnesia/src/mnesia_sup.erl2
-rw-r--r--lib/mnesia/src/mnesia_text.erl4
-rw-r--r--lib/mnesia/src/mnesia_tm.erl6
20 files changed, 195 insertions, 164 deletions
diff --git a/lib/mnesia/Makefile b/lib/mnesia/Makefile
index 810433c4d0..d0edd48af9 100644
--- a/lib/mnesia/Makefile
+++ b/lib/mnesia/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
# ----------------------------------------------------
include $(ERL_TOP)/make/otp_subdir.mk
+include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/mnesia/doc/misc/Makefile b/lib/mnesia/doc/misc/Makefile
index 29e2682967..0622a0b809 100644
--- a/lib/mnesia/doc/misc/Makefile
+++ b/lib/mnesia/doc/misc/Makefile
@@ -39,7 +39,7 @@ TEX_FILES= $(SGML_FILES:.sgml=.tex)
DVI_FILES= $(SGML_FILES:.sgml=.dvi)
PSFIG_FILES= $(FIG_FILES:.fig=.ps)
PS_FILES= $(SGML_FILES:.sgml=.ps)
-GIF_FILES= min_head.gif
+GIF_FILES=
ERL_FILES=
HRL_FILES=
DATA_FILES=
diff --git a/lib/mnesia/doc/src/Makefile b/lib/mnesia/doc/src/Makefile
index d9647fc081..f14fd33c7a 100644
--- a/lib/mnesia/doc/src/Makefile
+++ b/lib/mnesia/doc/src/Makefile
@@ -30,11 +30,6 @@ VSN=$(MNESIA_VSN)
APPLICATION=mnesia
# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
-
-# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
XML_APPLICATION_FILES = ref_man.xml
@@ -70,81 +65,9 @@ XML_FILES = \
XML_GEN_FILES = $(XML_CHAPTER_GEN_FILES:%=$(XMLDIR)/%)
-GIF_FILES = \
+IMAGE_FILES = \
company.gif
-XML_HTML_FILES = \
- notes_history.xml
-
-
-# ----------------------------------------------------
-
-HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_HTML_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
-
-INFO_FILE = ../../info
-EXTRA_FILES = \
- $(DEFAULT_GIF_FILES) \
- $(DEFAULT_HTML_FILES) \
- $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html)
-
-MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
-
-HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
-
-TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-XML_FLAGS +=
-DVIPS_FLAGS +=
-
# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-$(HTMLDIR)/%.gif: %.gif
- $(INSTALL_DATA) $< $@
-
-docs: pdf html man
-
-$(TOP_PDF_FILE): $(XML_FILES)
-
-pdf: $(TOP_PDF_FILE)
-
-html: gifs $(HTML_REF_MAN_FILE)
-
-clean clean_docs:
- rm -rf $(HTMLDIR)/*
- rm -rf $(XMLDIR)
- rm -f $(MAN3DIR)/*
- rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
- rm -f errs core *~
-
-man: $(MAN3_FILES)
-
-gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
-
-$(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk
- sed -e 's;%VSN%;$(VSN);' $< > $@
-
-debug opt:
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_docs_spec: docs
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DATA) $(TOP_PDF_FILE) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(HTMLDIR)/* \
- "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(INFO_FILE) "$(RELSYSDIR)"
- $(INSTALL_DIR) "$(RELEASE_PATH)/man/man3"
- $(INSTALL_DATA) $(MAN3_FILES) "$(RELEASE_PATH)/man/man3"
-release_spec:
+include $(ERL_TOP)/make/doc.mk
diff --git a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
index b8d86adbf1..b646393ce3 100644
--- a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
@@ -750,7 +750,7 @@ mnesia:all_keys/1</seealso>.
that can overload <c>Mnesia</c> on other nodes.</item>
</list>
<p>By passing the same "fun" as argument to the function
- <seealso marker="mnesia#async_dirty/2">mnesia:async_dirty(Fun [, Args])</seealso>,
+ <seealso marker="mnesia#async_dirty/1">mnesia:async_dirty(Fun [, Args])</seealso>,
it is performed in dirty context. The function calls are mapped to
the corresponding dirty functions. This still involves logging,
replication, and subscriptions but no locking,
@@ -761,9 +761,9 @@ mnesia:all_keys/1</seealso>.
node but not the others. If the table resides locally, no waiting
occurs.</p>
<p>By passing the same "fun" as an argument to the function
- <seealso marker="mnesia#sync_dirty/2">mnesia:sync_dirty(Fun [, Args])</seealso>,
+ <seealso marker="mnesia#sync_dirty/1">mnesia:sync_dirty(Fun [, Args])</seealso>,
it is performed in almost the same context as the function
- <seealso marker="mnesia#async_dirty/2">mnesia:async_dirty/1,2</seealso>.
+ <seealso marker="mnesia#async_dirty/1">mnesia:async_dirty/1,2</seealso>.
The difference is that the operations are performed
synchronously. The caller waits for the updates to be
performed on all active replicas. Using <c>mnesia:sync_dirty/1,2</c>
@@ -788,7 +788,7 @@ mnesia:all_keys/1</seealso>.
recommended if all options have been weighed and the possible
outcomes are understood. By passing the earlier mentioned "fun"
to the function
- <seealso marker="mnesia#ets/2">mnesia:ets(Fun [, Args])</seealso>,
+ <seealso marker="mnesia#ets/1">mnesia:ets(Fun [, Args])</seealso>,
it is performed but in a raw
context. The operations are performed directly on the
local <c>ets</c> tables, assuming that the local storage type is
diff --git a/lib/mnesia/doc/src/mnesia.xml b/lib/mnesia/doc/src/mnesia.xml
index 11b0b8e987..d05693cf8d 100644
--- a/lib/mnesia/doc/src/mnesia.xml
+++ b/lib/mnesia/doc/src/mnesia.xml
@@ -453,7 +453,7 @@ mnesia:add_table_index(person, age)</code>
</desc>
</func>
<func>
- <name since="">async_dirty(Fun, [, Args]) -> ResultOfFun | exit(Reason)</name>
+ <name since="">async_dirty(Fun [, Args]) -> ResultOfFun | exit(Reason)</name>
<fsummary>Calls the <c>Fun</c> in a context that is not protected by a transaction.</fsummary>
<desc>
<marker id="async_dirty"></marker>
@@ -1259,7 +1259,7 @@ mnesia:create_table(person,
</desc>
</func>
<func>
- <name since="">ets(Fun, [, Args]) -> ResultOfFun | exit(Reason)</name>
+ <name since="">ets(Fun [, Args]) -> ResultOfFun | exit(Reason)</name>
<fsummary>Calls the <c>Fun</c> in a raw context that is not protected by a transaction.</fsummary>
<desc>
<marker id="ets"></marker>
@@ -2134,7 +2134,7 @@ mnesia:create_table(employee,
</desc>
</func>
<func>
- <name since="">sync_dirty(Fun, [, Args]) -> ResultOfFun | exit(Reason)</name>
+ <name since="">sync_dirty(Fun [, Args]) -> ResultOfFun | exit(Reason)</name>
<fsummary>Calls the <c>Fun</c> in a context that is not protected by a transaction.</fsummary>
<desc>
<marker id="sync_dirty"></marker>
@@ -2497,8 +2497,12 @@ mnesia:create_table(employee,
table.</p>
</item>
<item>
- <p><c>memory</c>. Returns the number of
- words allocated to the table on this node.</p>
+ <p><c>memory</c>. Returns for <c>ram_copies</c> and
+ <c>disc_copies</c> tables the number of words allocated in
+ memory to the table on this node.
+ For <c>disc_only_copies</c> tables the number of bytes stored
+ on disc is returned.
+ </p>
</item>
<item>
<p><c>ram_copies</c>. Returns the nodes where a
diff --git a/lib/mnesia/src/Makefile b/lib/mnesia/src/Makefile
index 7d316df263..90e8780754 100644
--- a/lib/mnesia/src/Makefile
+++ b/lib/mnesia/src/Makefile
@@ -65,6 +65,7 @@ MODULES= \
mnesia_monitor \
mnesia_recover \
mnesia_registry \
+ mnesia_rpc \
mnesia_schema\
mnesia_snmp_hook \
mnesia_subscr \
diff --git a/lib/mnesia/src/mnesia.app.src b/lib/mnesia/src/mnesia.app.src
index c755b4d4b9..77bd1a7816 100644
--- a/lib/mnesia/src/mnesia.app.src
+++ b/lib/mnesia/src/mnesia.app.src
@@ -2,36 +2,37 @@
[{description, "MNESIA CXC 138 12"},
{vsn, "%VSN%"},
{modules, [
- mnesia,
+ mnesia,
mnesia_app,
mnesia_backend_type,
- mnesia_backup,
- mnesia_bup,
- mnesia_checkpoint,
+ mnesia_backup,
+ mnesia_bup,
+ mnesia_checkpoint,
mnesia_checkpoint_sup,
mnesia_controller,
- mnesia_dumper,
- mnesia_event,
+ mnesia_dumper,
+ mnesia_event,
mnesia_ext_sup,
- mnesia_frag,
- mnesia_frag_hash,
- mnesia_index,
+ mnesia_frag,
+ mnesia_frag_hash,
+ mnesia_index,
mnesia_kernel_sup,
mnesia_late_loader,
- mnesia_lib,
- mnesia_loader,
- mnesia_locker,
- mnesia_log,
- mnesia_monitor,
+ mnesia_lib,
+ mnesia_loader,
+ mnesia_locker,
+ mnesia_log,
+ mnesia_monitor,
mnesia_recover,
mnesia_registry,
- mnesia_schema,
- mnesia_snmp_hook,
- mnesia_subscr,
- mnesia_sup,
+ mnesia_rpc,
+ mnesia_schema,
+ mnesia_snmp_hook,
+ mnesia_subscr,
+ mnesia_sup,
mnesia_sp,
mnesia_text,
- mnesia_tm
+ mnesia_tm
]},
{registered, [
mnesia_dumper_load_regulator,
@@ -39,12 +40,13 @@
mnesia_fallback,
mnesia_controller,
mnesia_kernel_sup,
- mnesia_late_loader,
- mnesia_locker,
+ mnesia_late_loader,
+ mnesia_locker,
mnesia_monitor,
mnesia_recover,
- mnesia_substr,
- mnesia_sup,
+ mnesia_rpc,
+ mnesia_substr,
+ mnesia_sup,
mnesia_tm
]},
{applications, [kernel, stdlib]},
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index 02bc884e36..560ebca824 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -2057,8 +2057,14 @@ dirty_rpc(Tab, M, F, Args) ->
do_dirty_rpc(_Tab, nowhere, _, _, Args) ->
mnesia:abort({no_exists, Args});
+do_dirty_rpc(_Tab, Local, M, F, Args) when Local =:= node() ->
+ try apply(M,F,Args)
+ catch
+ throw:Res -> Res;
+ _:_ -> mnesia:abort({badarg, Args})
+ end;
do_dirty_rpc(Tab, Node, M, F, Args) ->
- case rpc:call(Node, M, F, Args) of
+ case mnesia_rpc:call(Node, M, F, Args) of
{badrpc, Reason} ->
timer:sleep(20), %% Do not be too eager, and can't use yield on SMP
%% Sync with mnesia_monitor
@@ -2166,7 +2172,7 @@ raw_table_info(Tab, Item) ->
disc_only_copies ->
info_reply(dets:info(Tab, Item), Tab, Item);
{ext, Alias, Mod} ->
- info_reply(catch Mod:info(Alias, Tab, Item), Tab, Item);
+ info_reply(Mod:info(Alias, Tab, Item), Tab, Item);
unknown ->
bad_info_reply(Tab, Item)
end
@@ -2731,7 +2737,7 @@ create_table(Arg) ->
create_table(Name, Arg) when is_list(Arg) ->
mnesia_schema:create_table([{name, Name}| Arg]);
create_table(Name, Arg) ->
- {aborted, badarg, Name, Arg}.
+ {aborted, {badarg, Name, Arg}}.
-spec delete_table(Tab::table()) -> t_result('ok').
delete_table(Tab) ->
diff --git a/lib/mnesia/src/mnesia.hrl b/lib/mnesia/src/mnesia.hrl
index fe48a6fe3d..4ddfc17a06 100644
--- a/lib/mnesia/src/mnesia.hrl
+++ b/lib/mnesia/src/mnesia.hrl
@@ -44,6 +44,8 @@
-define(SAFE(OP), try (OP) catch error:_ -> ok end).
-define(CATCH(OP), try (OP) catch _:_Reason -> {'EXIT', _Reason} end).
+-define(CATCHU(OP), fun() -> try (OP) catch _:_Reason -> {'EXIT', _Reason} end end()).
+
-define(catch_val(Var), (try ?ets_lookup_element(mnesia_gvar, Var, 2)
catch error:_ -> {'EXIT', {badarg, []}} end)).
diff --git a/lib/mnesia/src/mnesia_event.erl b/lib/mnesia/src/mnesia_event.erl
index 49b3990086..0e96d5c73f 100644
--- a/lib/mnesia/src/mnesia_event.erl
+++ b/lib/mnesia/src/mnesia_event.erl
@@ -36,6 +36,8 @@
dumped_core = false, %% only dump fatal core once
args}).
+-include("mnesia.hrl").
+
%%%----------------------------------------------------------------
%%% Callback functions from gen_server
%%%----------------------------------------------------------------
@@ -131,14 +133,14 @@ handle_system_event({mnesia_down, Node}, State) ->
"must be restarted. Forcing shutdown "
"after mnesia_down from ~p...~n",
report_fatal(Msg, [Node], nocore, State#state.dumped_core),
- catch exit(whereis(mnesia_monitor), fatal),
+ ?SAFE(exit(whereis(mnesia_monitor), fatal)),
{ok, State};
{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}} ->
+ case ?CATCH(apply(UserMod, UserFunc, [Node])) of
+ {'EXIT', {undef, _R}} ->
%% Backward compatibility
apply(UserMod, UserFunc, []);
{'EXIT', Reason} ->
diff --git a/lib/mnesia/src/mnesia_kernel_sup.erl b/lib/mnesia/src/mnesia_kernel_sup.erl
index a761d5eed0..7f226d92c4 100644
--- a/lib/mnesia/src/mnesia_kernel_sup.erl
+++ b/lib/mnesia/src/mnesia_kernel_sup.erl
@@ -42,6 +42,7 @@ init([]) ->
worker_spec(mnesia_locker, timer:seconds(3), ProcLib),
worker_spec(mnesia_recover, timer:minutes(3), [gen_server]),
worker_spec(mnesia_tm, timer:seconds(30), ProcLib),
+ worker_spec(mnesia_rpc, timer:seconds(3), [gen_server]),
supervisor_spec(mnesia_checkpoint_sup),
worker_spec(mnesia_controller, timer:seconds(3), [gen_server]),
worker_spec(mnesia_late_loader, timer:seconds(3), ProcLib)
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 6abc05fade..dd28686f78 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -675,41 +675,41 @@ mkcore(CrashInfo) ->
% dbg_out("Making a Mnesia core dump...~p~n", [CrashInfo]),
Nodes = [node() |nodes()],
%%TidLocks = (catch ets:tab2list(mnesia_tid_locks)),
- HeldLocks = (catch mnesia:system_info(held_locks)),
+ HeldLocks = ?CATCHU(mnesia:system_info(held_locks)),
Core = [
CrashInfo,
{time, {date(), time()}},
{self, proc_dbg_info(self())},
- {nodes, catch rpc:multicall(Nodes, ?MODULE, get_node_number, [])},
- {applications, catch lists:sort(application:loaded_applications())},
- {flags, catch init:get_arguments()},
- {code_path, catch code:get_path()},
- {code_loaded, catch lists:sort(code:all_loaded())},
- {etsinfo, catch ets_info(ets:all())},
-
- {version, catch mnesia:system_info(version)},
- {schema, catch ets:tab2list(schema)},
- {gvar, catch ets:tab2list(mnesia_gvar)},
- {master_nodes, catch mnesia_recover:get_master_node_info()},
-
- {processes, catch procs()},
- {relatives, catch relatives()},
- {workers, catch workers(mnesia_controller:get_workers(2000))},
- {locking_procs, catch locking_procs(HeldLocks)},
+ {nodes, ?CATCHU(rpc:multicall(Nodes, ?MODULE, get_node_number, []))},
+ {applications, ?CATCHU(lists:sort(application:loaded_applications()))},
+ {flags, ?CATCHU(init:get_arguments())},
+ {code_path, ?CATCHU(code:get_path())},
+ {code_loaded, ?CATCHU(lists:sort(code:all_loaded()))},
+ {etsinfo, ?CATCHU(ets_info(ets:all()))},
+
+ {version, ?CATCHU(mnesia:system_info(version))},
+ {schema, ?CATCHU(ets:tab2list(schema))},
+ {gvar, ?CATCHU(ets:tab2list(mnesia_gvar))},
+ {master_nodes, ?CATCHU(mnesia_recover:get_master_node_info())},
+
+ {processes, ?CATCHU(procs())},
+ {relatives, ?CATCHU(relatives())},
+ {workers, ?CATCHU(workers(mnesia_controller:get_workers(2000)))},
+ {locking_procs, ?CATCHU(locking_procs(HeldLocks))},
{held_locks, HeldLocks},
- {lock_queue, catch mnesia:system_info(lock_queue)},
- {load_info, catch mnesia_controller:get_info(2000)},
- {trans_info, catch mnesia_tm:get_info(2000)},
+ {lock_queue, ?CATCHU(mnesia:system_info(lock_queue))},
+ {load_info, ?CATCHU(mnesia_controller:get_info(2000))},
+ {trans_info, ?CATCHU(mnesia_tm:get_info(2000))},
- {schema_file, catch file:read_file(tab2dat(schema))},
- {dir_info, catch dir_info()},
- {logfile, catch {ok, read_log_files()}}
+ {schema_file, ?CATCHU(file:read_file(tab2dat(schema)))},
+ {dir_info, ?CATCHU(dir_info())},
+ {logfile, ?CATCHU({ok, read_log_files()})}
],
term_to_binary(Core).
procs() ->
- Fun = fun(P) -> {P, (catch lists:zf(fun proc_info/1, process_info(P)))} end,
+ Fun = fun(P) -> {P, (?CATCH(lists:zf(fun proc_info/1, process_info(P))))} end,
lists:map(Fun, processes()).
proc_info({registered_name, Val}) -> {true, Val};
@@ -730,7 +730,7 @@ have_majority(_Tab, AllNodes, HaveNodes) ->
length(Present) > length(Missing).
read_log_files() ->
- [{F, catch file:read_file(F)} || F <- mnesia_log:log_files()].
+ [{F, ?CATCH(file:read_file(F))} || F <- mnesia_log:log_files()].
dir_info() ->
{ok, Cwd} = file:get_cwd(),
@@ -739,7 +739,7 @@ dir_info() ->
{mnesia_dir, Dir, file:read_file_info(Dir)}] ++
case file:list_dir(Dir) of
{ok, Files} ->
- [{mnesia_file, F, catch file:read_file_info(dir(F))} || F <- Files];
+ [{mnesia_file, F, ?CATCH(file:read_file_info(dir(F)))} || F <- Files];
Other ->
[Other]
end.
@@ -854,7 +854,7 @@ vcore(Bin) when is_binary(Bin) ->
Core = binary_to_term(Bin),
Fun = fun({Item, Info}) ->
show("***** ~tp *****~n", [Item]),
- case catch vcore_elem({Item, Info}) of
+ case ?CATCHU(vcore_elem({Item, Info})) of
{'EXIT', Reason} ->
show("{'EXIT', ~tp}~n", [Reason]);
_ -> ok
@@ -1446,7 +1446,7 @@ eval_debug_fun(FunId, EvalContext, EvalFile, EvalLine) ->
ok
end
end
- catch error ->
+ catch _:_ ->
ok
end.
diff --git a/lib/mnesia/src/mnesia_loader.erl b/lib/mnesia/src/mnesia_loader.erl
index 2cdae0c906..c34a83bb6c 100644
--- a/lib/mnesia/src/mnesia_loader.erl
+++ b/lib/mnesia/src/mnesia_loader.erl
@@ -654,8 +654,8 @@ down(Tab, Storage) ->
mnesia_lib:dets_sync_close(Tab),
file:delete(TmpFile);
{ext, Alias, Mod} ->
- catch Mod:close_table(Alias, Tab),
- catch Mod:delete_table(Alias, Tab)
+ ?CATCHU(Mod:close_table(Alias, Tab)),
+ ?CATCHU(Mod:delete_table(Alias, Tab))
end,
mnesia_checkpoint:tm_del_copy(Tab, node()),
mnesia_controller:sync_del_table_copy_whereabouts(Tab, node()),
diff --git a/lib/mnesia/src/mnesia_monitor.erl b/lib/mnesia/src/mnesia_monitor.erl
index 4e50b46da8..5ce1439298 100644
--- a/lib/mnesia/src/mnesia_monitor.erl
+++ b/lib/mnesia/src/mnesia_monitor.erl
@@ -83,9 +83,9 @@
going_down = [], tm_started = false, early_connects = [],
connecting, mq = [], remote_node_status = []}).
--define(current_protocol_version, {8,4}).
+-define(current_protocol_version, {8,5}).
--define(previous_protocol_version, {8,3}).
+-define(previous_protocol_version, {8,4}).
start() ->
gen_server:start_link({local, ?MODULE}, ?MODULE,
@@ -196,7 +196,7 @@ protocol_version() ->
%% A sorted list of acceptable protocols the
%% preferred protocols are first in the list
acceptable_protocol_versions() ->
- [protocol_version(), ?previous_protocol_version].
+ [protocol_version(), ?previous_protocol_version, {8,3}].
needs_protocol_conversion(Node) ->
case {?catch_val({protocol, Node}), protocol_version()} of
@@ -409,7 +409,7 @@ handle_call({unsafe_close_log, Name}, _From, State) ->
{reply, ok, State};
handle_call({unsafe_create_external, Tab, Alias, Mod, Cs}, _From, State) ->
- case catch Mod:create_table(Alias, Tab, mnesia_schema:cs2list(Cs)) of
+ case ?CATCH(Mod:create_table(Alias, Tab, mnesia_schema:cs2list(Cs))) of
{'EXIT', ExitReason} ->
{reply, {error, ExitReason}, State};
Reply ->
diff --git a/lib/mnesia/src/mnesia_rpc.erl b/lib/mnesia/src/mnesia_rpc.erl
new file mode 100644
index 0000000000..bbeacce9db
--- /dev/null
+++ b/lib/mnesia/src/mnesia_rpc.erl
@@ -0,0 +1,86 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019. 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.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%% Don't use the system rpc server since it may overload other
+%% applications when using a lot of dirty read operations.
+
+-module(mnesia_rpc).
+-behaviour(gen_server).
+
+-export([start/0,
+ call/4
+ ]).
+
+
+%% gen_server callbacks
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+ ]).
+
+-include("mnesia.hrl").
+
+start() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [self()],
+ [{timeout, infinity} %%, {debug, [trace]}
+ ]).
+
+call(Node, M, F, Args) ->
+ case ?catch_val({protocol, Node}) of
+ {Ver, _} when Ver < {8,5} ->
+ rpc:call(Node, M, F, Args);
+ _ ->
+ try gen_server:call({?MODULE, Node}, {apply, M, F, Args}, infinity)
+ catch
+ _:Reason -> {badrpc, {'EXIT', Reason}}
+ end
+ end.
+
+init([_Parent]) ->
+ {ok, #{}}.
+
+handle_call({apply, Mod, Fun, Args}, _From, State) ->
+ %% rpc is just for ets:lookups so no need to spawn requests
+ Result = try apply(Mod, Fun, Args)
+ catch throw:Res -> Res;
+ _:Reason -> {badrpc, {'EXIT', Reason}}
+ end,
+ {reply, Result, State};
+handle_call(Msg, _From, State) ->
+ error("~p got unexpected call: ~tp~n", [?MODULE, Msg]),
+ {reply, badop, State}.
+
+handle_cast(Msg, State) ->
+ mnesia_lib:error("~p got unexpected cast: ~tp~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+handle_info(Msg, State) ->
+ mnesia_lib:error("~p got unexpected info: ~tp~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+terminate(_Reason, _State) ->
+ ok.
diff --git a/lib/mnesia/src/mnesia_schema.erl b/lib/mnesia/src/mnesia_schema.erl
index d0f5d0e07b..4a65f3996a 100644
--- a/lib/mnesia/src/mnesia_schema.erl
+++ b/lib/mnesia/src/mnesia_schema.erl
@@ -1271,7 +1271,7 @@ verify_nodes(Cs) ->
lists:foreach(AtomCheck, Nodes).
verify(Expected, Fun, Error) when is_function(Fun) ->
- do_verify(Expected, catch Fun(), Error);
+ do_verify(Expected, ?CATCH(Fun()), Error);
verify(Expected, Actual, Error) ->
do_verify(Expected, Actual, Error).
diff --git a/lib/mnesia/src/mnesia_sp.erl b/lib/mnesia/src/mnesia_sp.erl
index d65c659690..0c56107c41 100644
--- a/lib/mnesia/src/mnesia_sp.erl
+++ b/lib/mnesia/src/mnesia_sp.erl
@@ -30,12 +30,15 @@
init_proc(Who, Mod, Fun, Args) ->
mnesia_lib:verbose("~p starting: ~p~n", [Who, self()]),
- case catch apply(Mod, Fun, Args) of
- {'EXIT', Reason} ->
- mnesia_monitor:terminate_proc(Who, Reason, Args),
+ try
+ apply(Mod, Fun, Args)
+ catch
+ exit:Reason when Reason =:= shutdown; Reason =:= kill; Reason =:= normal ->
+ mnesia_monitor:terminate_proc(Who, Reason, Args),
exit(Reason);
- Other ->
- Other
+ _:Reason:ST ->
+ mnesia_monitor:terminate_proc(Who, {Reason,ST}, Args),
+ exit(Reason)
end.
diff --git a/lib/mnesia/src/mnesia_sup.erl b/lib/mnesia/src/mnesia_sup.erl
index 3e5792900b..fd5156d2a4 100644
--- a/lib/mnesia/src/mnesia_sup.erl
+++ b/lib/mnesia/src/mnesia_sup.erl
@@ -88,7 +88,7 @@ add_event_handler() ->
kill() ->
Mnesia = [mnesia_fallback | mnesia:ms()],
- Kill = fun(Name) -> catch exit(whereis(Name), kill) end,
+ Kill = fun(Name) -> try exit(whereis(Name), kill) catch _:_ -> ok end end,
lists:foreach(Kill, Mnesia),
lists:foreach(fun ensure_dead/1, Mnesia),
timer:sleep(10),
diff --git a/lib/mnesia/src/mnesia_text.erl b/lib/mnesia/src/mnesia_text.erl
index cc21621ff4..ee31fdfd27 100644
--- a/lib/mnesia/src/mnesia_text.erl
+++ b/lib/mnesia/src/mnesia_text.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2019. 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.
@@ -170,7 +170,7 @@ read_terms(Stream, File, Line, L) ->
end.
read_term_from_stream(Stream, File, Line) ->
- R = io:request(Stream, {get_until,'',erl_scan,tokens,[Line]}),
+ R = io:request(Stream, {get_until,latin1,'',erl_scan,tokens,[Line]}),
case R of
{ok,Toks,EndLine} ->
case erl_parse:parse_term(Toks) of
diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl
index 18520423ba..41e7ddce87 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -2082,9 +2082,9 @@ ask_commit(_Protocol, _Tid, [], _DiscNs, _RamNs, WaitFor, Local) ->
{WaitFor, Local}.
convert_old(sync_asym_trans, Node) ->
- case mnesia_monitor:needs_protocol_conversion(Node) of
- true -> asym_trans;
- false -> sync_asym_trans
+ case ?catch_val({protocol, Node}) of
+ {{8,3}, _} -> asym_trans;
+ _ -> sync_asym_trans
end;
convert_old(Protocol, _) ->
Protocol.