Hrm, fewer deadlocks, but lots of !@#$! mystery hangs @ startup & teardown
This commit is contained in:
parent
d331e09923
commit
3a4624ab06
4 changed files with 54 additions and 8 deletions
|
@ -27,10 +27,16 @@
|
||||||
|
|
||||||
-behaviour(application).
|
-behaviour(application).
|
||||||
|
|
||||||
|
-ifdef(PULSE).
|
||||||
|
-compile({parse_transform, pulse_instrument}).
|
||||||
|
-include_lib("pulse_otp/include/pulse_otp.hrl").
|
||||||
|
-endif.
|
||||||
|
|
||||||
%% Application callbacks
|
%% Application callbacks
|
||||||
-export([start/2, stop/1]).
|
-export([start/2, stop/1]).
|
||||||
|
|
||||||
start(_StartType, _StartArgs) ->
|
start(_StartType, _StartArgs) ->
|
||||||
|
erlang:display({machi_app,self()}),
|
||||||
case machi_sup:start_link() of
|
case machi_sup:start_link() of
|
||||||
{ok, Pid} ->
|
{ok, Pid} ->
|
||||||
{ok, Pid};
|
{ok, Pid};
|
||||||
|
|
|
@ -27,6 +27,11 @@
|
||||||
|
|
||||||
-behaviour(supervisor).
|
-behaviour(supervisor).
|
||||||
|
|
||||||
|
-ifdef(PULSE).
|
||||||
|
-compile({parse_transform, pulse_instrument}).
|
||||||
|
-include_lib("pulse_otp/include/pulse_otp.hrl").
|
||||||
|
-endif.
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start_link/0]).
|
-export([start_link/0]).
|
||||||
|
|
||||||
|
@ -39,6 +44,7 @@ start_link() ->
|
||||||
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
|
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
|
||||||
|
|
||||||
init([]) ->
|
init([]) ->
|
||||||
|
erlang:display({flu_sup,self()}),
|
||||||
RestartStrategy = one_for_one,
|
RestartStrategy = one_for_one,
|
||||||
MaxRestarts = 1000,
|
MaxRestarts = 1000,
|
||||||
MaxSecondsBetweenRestarts = 3600,
|
MaxSecondsBetweenRestarts = 3600,
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
%% The following functions contains side_effects but are run outside
|
%% The following functions contains side_effects but are run outside
|
||||||
%% PULSE, i.e. PULSE needs to leave them alone
|
%% PULSE, i.e. PULSE needs to leave them alone
|
||||||
-compile({pulse_skip,[{prop_pulse_test_,0}, {prop_pulse_regression_test_,0},
|
-compile({pulse_skip,[{prop_pulse_test_,0}, {prop_pulse_regression_test_,0},
|
||||||
|
{prop_pulse,1},
|
||||||
{shutdown_hard,0}]}).
|
{shutdown_hard,0}]}).
|
||||||
-compile({pulse_no_side_effect,[{file,'_','_'}, {erlang, now, 0}]}).
|
-compile({pulse_no_side_effect,[{file,'_','_'}, {erlang, now, 0}]}).
|
||||||
|
|
||||||
|
@ -180,13 +181,25 @@ setup(Num, Seed) ->
|
||||||
end || {_P, Dir} <- All_listE],
|
end || {_P, Dir} <- All_listE],
|
||||||
?V(",z~w", [?LINE]),
|
?V(",z~w", [?LINE]),
|
||||||
|
|
||||||
%% Start partition simulator
|
%% GRRR, not PULSE: {ok, _} = application:ensure_all_started(machi),
|
||||||
{ok, PSimPid} = machi_partition_simulator:start_link(Seed, 0, 100),
|
[begin
|
||||||
|
?V(",z~w,~w", [?LINE,App]),
|
||||||
|
_QQ = (catch application:start(App)),
|
||||||
|
erlang:display({app_start,App,_QQ})
|
||||||
|
end || App <- [machi] ],
|
||||||
|
?V(",z~w", [?LINE]),
|
||||||
|
|
||||||
|
SimSpec = {part_sim, {machi_partition_simulator, start_link,
|
||||||
|
[{0,0,0}, 0, 100]},
|
||||||
|
permanent, 500, worker, []},
|
||||||
|
?V(",z~w", [?LINE]),
|
||||||
|
{ok, PSimPid} = supervisor:start_child(machi_sup, SimSpec),
|
||||||
|
?V(",z~w", [?LINE]),
|
||||||
|
ok = machi_partition_simulator:set_seed(Seed),
|
||||||
_Partitions = machi_partition_simulator:get(All_list),
|
_Partitions = machi_partition_simulator:get(All_list),
|
||||||
?V(",z~w", [?LINE]),
|
?V(",z~w", [?LINE]),
|
||||||
|
|
||||||
%% Start FLUs and their associated procs
|
%% Start FLUs and their associated procs
|
||||||
{ok, SupPid} = machi_flu_sup:start_link(),
|
|
||||||
FluOpts = [{use_partition_simulator, true}, {active_mode, false}],
|
FluOpts = [{use_partition_simulator, true}, {active_mode, false}],
|
||||||
[begin
|
[begin
|
||||||
#p_srvr{name=Name, port=Port} = P,
|
#p_srvr{name=Name, port=Port} = P,
|
||||||
|
@ -197,6 +210,7 @@ setup(Num, Seed) ->
|
||||||
?V(",z~w", [?LINE]),
|
?V(",z~w", [?LINE]),
|
||||||
[machi_chain_manager1:set_chain_members(get_chmgr(P), Dict) ||
|
[machi_chain_manager1:set_chain_members(get_chmgr(P), Dict) ||
|
||||||
{P, _Dir} <- All_listE],
|
{P, _Dir} <- All_listE],
|
||||||
|
|
||||||
%% Trigger some environment reactions for humming consensus: first
|
%% Trigger some environment reactions for humming consensus: first
|
||||||
%% do all the same server first, then round-robin evenly across
|
%% do all the same server first, then round-robin evenly across
|
||||||
%% servers.
|
%% servers.
|
||||||
|
@ -211,7 +225,7 @@ setup(Num, Seed) ->
|
||||||
|
|
||||||
ProxiesDict = ?FLU_PC:start_proxies(Dict),
|
ProxiesDict = ?FLU_PC:start_proxies(Dict),
|
||||||
|
|
||||||
Res = {PSimPid, SupPid, ProxiesDict, All_listE},
|
Res = {PSimPid, 'machi_flu_sup', ProxiesDict, All_listE},
|
||||||
put(manager_pids_hack, Res),
|
put(manager_pids_hack, Res),
|
||||||
?V("),", []),
|
?V("),", []),
|
||||||
Res.
|
Res.
|
||||||
|
@ -308,11 +322,14 @@ prop_pulse() ->
|
||||||
prop_pulse(new).
|
prop_pulse(new).
|
||||||
|
|
||||||
prop_pulse(Style) when Style == new; Style == regression ->
|
prop_pulse(Style) when Style == new; Style == regression ->
|
||||||
|
_ = application:start(sasl),
|
||||||
|
_ = application:start(crypto),
|
||||||
?FORALL({Cmds0, Seed}, {gen_commands(Style), pulse:seed()},
|
?FORALL({Cmds0, Seed}, {gen_commands(Style), pulse:seed()},
|
||||||
?IMPLIES(1 < length(Cmds0) andalso length(Cmds0) < 11,
|
?IMPLIES(1 < length(Cmds0) andalso length(Cmds0) < 11,
|
||||||
begin
|
begin
|
||||||
erlang:display({prop,?MODULE,?LINE,self()}),
|
erlang:display({prop,?MODULE,?LINE,self()}),
|
||||||
ok = shutdown_hard(),
|
ok = shutdown_hard(),
|
||||||
|
erlang:display({prop,?MODULE,?LINE,self()}),
|
||||||
%% PULSE can be really unfair, of course, including having exec_ticks
|
%% PULSE can be really unfair, of course, including having exec_ticks
|
||||||
%% run where all of FLU a does its ticks then FLU b. Such a situation
|
%% run where all of FLU a does its ticks then FLU b. Such a situation
|
||||||
%% doesn't always allow unanimous private projection store values:
|
%% doesn't always allow unanimous private projection store values:
|
||||||
|
@ -337,8 +354,8 @@ erlang:display({prop,?MODULE,?LINE,self()}),
|
||||||
fun() ->
|
fun() ->
|
||||||
?V("PROP-~w,", [self()]),
|
?V("PROP-~w,", [self()]),
|
||||||
%% {_H, _S, _R} = run_commands(?MODULE, Cmds)
|
%% {_H, _S, _R} = run_commands(?MODULE, Cmds)
|
||||||
QAQA = run_commands(?MODULE, Cmds)
|
_QAQA = run_commands(?MODULE, Cmds)
|
||||||
,?V("pid681=~p", [process_info(list_to_pid("<0.681.0>"))]), QAQA
|
%% ,?V("pid681=~p", [process_info(list_to_pid("<0.681.0>"))]), _QAQA
|
||||||
end, [{seed, Seed},
|
end, [{seed, Seed},
|
||||||
{strategy, unfair}]),
|
{strategy, unfair}]),
|
||||||
ok = shutdown_hard(),
|
ok = shutdown_hard(),
|
||||||
|
@ -457,8 +474,20 @@ get_do_shrink() ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
shutdown_hard() ->
|
shutdown_hard() ->
|
||||||
|
erlang:display({hard,?MODULE,?LINE,self()}),
|
||||||
|
%% HANG: [catch machi_flu_psup:stop_flu_package(FLU) || FLU <- all_list()],
|
||||||
|
erlang:display({apps,?LINE,application:which_applications()}),
|
||||||
|
%%erlang:display({apps,?LINE,application:which_applications()}),
|
||||||
|
[begin
|
||||||
|
erlang:display({hard,?MODULE,?LINE,self()}),
|
||||||
|
_STOP = application:stop(App),
|
||||||
|
erlang:display({stop, App, _STOP})
|
||||||
|
end || App <- [machi] ],
|
||||||
|
timer:sleep(100),
|
||||||
|
|
||||||
(catch unlink(whereis(machi_partition_simulator))),
|
(catch unlink(whereis(machi_partition_simulator))),
|
||||||
[begin
|
[begin
|
||||||
|
erlang:display({hard,?MODULE,?LINE,self(),X}),
|
||||||
Pid = whereis(X),
|
Pid = whereis(X),
|
||||||
%%%%%%DELME deadlock source? spawn(fun() -> ?QC_FMT("shutdown-~w,", [self()]), (catch X:stop()) end),
|
%%%%%%DELME deadlock source? spawn(fun() -> ?QC_FMT("shutdown-~w,", [self()]), (catch X:stop()) end),
|
||||||
timer:sleep(50),
|
timer:sleep(50),
|
||||||
|
@ -466,7 +495,7 @@ shutdown_hard() ->
|
||||||
(catch exit(Pid, shutdown)),
|
(catch exit(Pid, shutdown)),
|
||||||
timer:sleep(1),
|
timer:sleep(1),
|
||||||
(catch exit(Pid, kill))
|
(catch exit(Pid, kill))
|
||||||
end || X <- [machi_partition_simulator, machi_flu_sup] ],
|
end || X <- [machi_partition_simulator, machi_flu_sup, machi_sup] ],
|
||||||
timer:sleep(100),
|
timer:sleep(100),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
-export([start_link/3, stop/0,
|
-export([start_link/3, stop/0,
|
||||||
get/1, reset_thresholds/2,
|
get/1, reset_thresholds/2, set_seed/1,
|
||||||
no_partitions/0, always_last_partitions/0, always_these_partitions/1]).
|
no_partitions/0, always_last_partitions/0, always_these_partitions/1]).
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
terminate/2, code_change/3]).
|
terminate/2, code_change/3]).
|
||||||
|
@ -67,6 +67,9 @@ get(Nodes) ->
|
||||||
reset_thresholds(OldThreshold, NoPartitionThreshold) ->
|
reset_thresholds(OldThreshold, NoPartitionThreshold) ->
|
||||||
gen_server:call(?MODULE, {reset_thresholds, OldThreshold, NoPartitionThreshold}, infinity).
|
gen_server:call(?MODULE, {reset_thresholds, OldThreshold, NoPartitionThreshold}, infinity).
|
||||||
|
|
||||||
|
set_seed(Seed) ->
|
||||||
|
gen_server:call(?MODULE, {set_seed, Seed}, infinity).
|
||||||
|
|
||||||
no_partitions() ->
|
no_partitions() ->
|
||||||
reset_thresholds(-999, 999).
|
reset_thresholds(-999, 999).
|
||||||
|
|
||||||
|
@ -98,6 +101,8 @@ handle_call({get, Nodes}, _From, S) ->
|
||||||
handle_call({reset_thresholds, OldThreshold, NoPartitionThreshold}, _From, S) ->
|
handle_call({reset_thresholds, OldThreshold, NoPartitionThreshold}, _From, S) ->
|
||||||
{reply, ok, S#state{old_threshold=OldThreshold,
|
{reply, ok, S#state{old_threshold=OldThreshold,
|
||||||
no_partition_threshold=NoPartitionThreshold}};
|
no_partition_threshold=NoPartitionThreshold}};
|
||||||
|
handle_call({set_seed, Seed}, _From, S) ->
|
||||||
|
{reply, ok, S#state{seed=Seed}};
|
||||||
handle_call({always_these_partitions, Parts}, _From, S) ->
|
handle_call({always_these_partitions, Parts}, _From, S) ->
|
||||||
{reply, ok, S#state{old_partitions={Parts,[na_reset_by_always]}}};
|
{reply, ok, S#state{old_partitions={Parts,[na_reset_by_always]}}};
|
||||||
handle_call({stop}, _From, S) ->
|
handle_call({stop}, _From, S) ->
|
||||||
|
|
Loading…
Reference in a new issue