aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mnesia/src/mnesia_loader.erl
diff options
context:
space:
mode:
authorDan Gudmundsson <[email protected]>2016-10-24 13:02:37 +0200
committerDan Gudmundsson <[email protected]>2016-10-24 13:02:37 +0200
commitf66073c2960a4b072e18c4e1dfed143b94cd60c6 (patch)
treea852fc1a088636d6c006522c6d8a63d509917c00 /lib/mnesia/src/mnesia_loader.erl
parentb74f73a4d2863b40c6076d7c097ca7f10522d793 (diff)
parentf8c047bb96eff53e5ddaff3d1a00d6a85a990bf3 (diff)
downloadotp-f66073c2960a4b072e18c4e1dfed143b94cd60c6.tar.gz
otp-f66073c2960a4b072e18c4e1dfed143b94cd60c6.tar.bz2
otp-f66073c2960a4b072e18c4e1dfed143b94cd60c6.zip
Merge branch 'dgud/mnesia/fix-blocked/OTP-13970' into maint
* dgud/mnesia/fix-blocked/OTP-13970: Avoid some error reports when stopping mnesia mnesia: Fix double blocked tables which could cause a crash
Diffstat (limited to 'lib/mnesia/src/mnesia_loader.erl')
-rw-r--r--lib/mnesia/src/mnesia_loader.erl17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/mnesia/src/mnesia_loader.erl b/lib/mnesia/src/mnesia_loader.erl
index 71e5829c87..c710470a2c 100644
--- a/lib/mnesia/src/mnesia_loader.erl
+++ b/lib/mnesia/src/mnesia_loader.erl
@@ -342,9 +342,12 @@ spawned_receiver(ReplyTo,Tab,Storage,Cs, SenderPid,TabSize,DetsData, Init) ->
Done = do_init_table(Tab,Storage,Cs,
SenderPid,TabSize,DetsData,
ReplyTo, Init),
- ReplyTo ! {self(),Done},
- unlink(ReplyTo),
- unlink(whereis(mnesia_controller)),
+ try
+ ReplyTo ! {self(),Done},
+ unlink(ReplyTo),
+ unlink(whereis(mnesia_controller))
+ catch _:_ -> ok %% avoid error reports when stopping down mnesia
+ end,
exit(normal).
wait_on_load_complete(Pid) ->
@@ -916,9 +919,15 @@ send_packet(_N, _Pid, _Chunk, DataState) ->
finish_copy(Pid, Tab, Storage, RemoteS, NeedLock) ->
RecNode = node(Pid),
DatBin = dat2bin(Tab, Storage, RemoteS),
+ Node = node(Pid),
Trans =
fun() ->
NeedLock andalso mnesia:read_lock_table(Tab),
+ %% Check that receiver is still alive
+ receive {copier_done, Node} ->
+ throw(receiver_died)
+ after 0 -> ok
+ end,
A = val({Tab, access_mode}),
mnesia_controller:sync_and_block_table_whereabouts(Tab, RecNode, RemoteS, A),
cleanup_tab_copier(Pid, Storage, Tab),
@@ -927,7 +936,7 @@ finish_copy(Pid, Tab, Storage, RemoteS, NeedLock) ->
receive
{Pid, no_more} -> % Dont bother about the spurious 'more' message
no_more;
- {copier_done, Node} when Node == node(Pid)->
+ {copier_done, Node} ->
verbose("Tab receiver ~p crashed (more): ~p~n", [Tab, Node]),
receiver_died
end