WIP: stop for the night, we are broken
This commit is contained in:
parent
99fd7e7fe1
commit
7bafc1c28a
3 changed files with 77 additions and 11 deletions
|
@ -131,10 +131,31 @@ test_react_to_env(Pid) ->
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
get_my_private_projection_members_dict(MgrOpts) ->
|
||||||
|
EmptyDict = orddict:new(),
|
||||||
|
case proplists:get_value(projection_store_registered_name, MgrOpts) of
|
||||||
|
undefined ->
|
||||||
|
EmptyDict;
|
||||||
|
Store ->
|
||||||
|
case machi_projection_store:read_latest_projection(Store, private) of
|
||||||
|
{error, not_written} ->
|
||||||
|
EmptyDict;
|
||||||
|
{ok, P} ->
|
||||||
|
P#projection_v1.members_dict
|
||||||
|
end
|
||||||
|
end.
|
||||||
|
|
||||||
init({MyName, MembersDict, MgrOpts}) ->
|
init({MyName, MembersDict, MgrOpts}) ->
|
||||||
All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(MembersDict)],
|
Dx = case MembersDict of
|
||||||
|
[] ->
|
||||||
|
get_my_private_projection_members_dict(MgrOpts);
|
||||||
|
_ ->
|
||||||
|
MembersDict
|
||||||
|
end,
|
||||||
|
All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(Dx)],
|
||||||
Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end,
|
Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end,
|
||||||
RunEnv = [{seed, Opt(seed, now())},
|
RunEnv = [{seed, Opt(seed, now())},
|
||||||
|
{use_partition_simulator, Opt(use_partition_simulator, true)},
|
||||||
{network_partitions, Opt(network_partitions, [])},
|
{network_partitions, Opt(network_partitions, [])},
|
||||||
{network_islands, Opt(network_islands, [])},
|
{network_islands, Opt(network_islands, [])},
|
||||||
{flapping_i, Opt(flapping, [])},
|
{flapping_i, Opt(flapping, [])},
|
||||||
|
@ -277,16 +298,21 @@ cl_write_public_proj_remote(FLUs, Partitions, _Epoch, Proj, S) ->
|
||||||
{{remote_write_results, Rs}, S}.
|
{{remote_write_results, Rs}, S}.
|
||||||
|
|
||||||
do_cl_read_latest_public_projection(ReadRepairP,
|
do_cl_read_latest_public_projection(ReadRepairP,
|
||||||
#ch_mgr{proj=Proj1} = S) ->
|
#ch_mgr{name=MyName, proj=Proj1} = S) ->
|
||||||
_Epoch1 = Proj1#projection_v1.epoch_number,
|
_Epoch1 = Proj1#projection_v1.epoch_number,
|
||||||
case cl_read_latest_projection(public, S) of
|
case cl_read_latest_projection(public, S) of
|
||||||
{needs_repair, FLUsRs, Extra, S3} ->
|
{needs_repair, FLUsRs, Extra, S3} ->
|
||||||
if not ReadRepairP ->
|
if not ReadRepairP ->
|
||||||
{not_unanimous, todoxyz, [{results, FLUsRs}|Extra], S3};
|
{not_unanimous, todoxyz, [{unanimous_flus, []},
|
||||||
|
{results, FLUsRs}|Extra], S3};
|
||||||
true ->
|
true ->
|
||||||
{_Status, S4} = do_read_repair(FLUsRs, Extra, S3),
|
{_Status, S4} = do_read_repair(FLUsRs, Extra, S3),
|
||||||
do_cl_read_latest_public_projection(ReadRepairP, S4)
|
do_cl_read_latest_public_projection(ReadRepairP, S4)
|
||||||
end;
|
end;
|
||||||
|
{error_unwritten, FLUsRs, Extra, S3} ->
|
||||||
|
NoneProj = make_none_projection(MyName, [], orddict:new()),
|
||||||
|
{not_unanimous, NoneProj, [{unanimous_flus, []},
|
||||||
|
{results, FLUsRs}|Extra], S3};
|
||||||
{UnanimousTag, Proj2, Extra, S3}=_Else ->
|
{UnanimousTag, Proj2, Extra, S3}=_Else ->
|
||||||
{UnanimousTag, Proj2, Extra, S3}
|
{UnanimousTag, Proj2, Extra, S3}
|
||||||
end.
|
end.
|
||||||
|
@ -319,7 +345,7 @@ cl_read_latest_projection(ProjectionType, AllHosed, S) ->
|
||||||
rank_and_sort_projections_with_extra(All_queried_list, FLUsRs, S2).
|
rank_and_sort_projections_with_extra(All_queried_list, FLUsRs, S2).
|
||||||
|
|
||||||
rank_and_sort_projections_with_extra(All_queried_list, FLUsRs,
|
rank_and_sort_projections_with_extra(All_queried_list, FLUsRs,
|
||||||
#ch_mgr{proj=CurrentProj}=S) ->
|
#ch_mgr{name=MyName,proj=CurrentProj}=S) ->
|
||||||
UnwrittenRs = [x || {_, error_unwritten} <- FLUsRs],
|
UnwrittenRs = [x || {_, error_unwritten} <- FLUsRs],
|
||||||
Ps = [Proj || {_FLU, Proj} <- FLUsRs, is_record(Proj, projection_v1)],
|
Ps = [Proj || {_FLU, Proj} <- FLUsRs, is_record(Proj, projection_v1)],
|
||||||
BadAnswerFLUs = [FLU || {FLU, Answer} <- FLUsRs,
|
BadAnswerFLUs = [FLU || {FLU, Answer} <- FLUsRs,
|
||||||
|
@ -328,7 +354,17 @@ rank_and_sort_projections_with_extra(All_queried_list, FLUsRs,
|
||||||
if All_queried_list == []
|
if All_queried_list == []
|
||||||
orelse
|
orelse
|
||||||
length(UnwrittenRs) == length(FLUsRs) ->
|
length(UnwrittenRs) == length(FLUsRs) ->
|
||||||
{error_unwritten, FLUsRs, [todo_fix_caller_perhaps], S};
|
NoneProj = make_none_projection(MyName, [], orddict:new()),
|
||||||
|
Extra2 = [{all_members_replied, true},
|
||||||
|
{all_queried_list, All_queried_list},
|
||||||
|
{flus_rs, FLUsRs},
|
||||||
|
{unanimous_flus,[]},
|
||||||
|
{not_unanimous_flus, []},
|
||||||
|
{bad_answer_flus, BadAnswerFLUs},
|
||||||
|
{not_unanimous_answers, []},
|
||||||
|
{trans_all_hosed, []},
|
||||||
|
{trans_all_flap_counts, []}],
|
||||||
|
{not_unanimous, NoneProj, Extra2, S};
|
||||||
UnwrittenRs /= [] ->
|
UnwrittenRs /= [] ->
|
||||||
{needs_repair, FLUsRs, [flarfus], S};
|
{needs_repair, FLUsRs, [flarfus], S};
|
||||||
true ->
|
true ->
|
||||||
|
@ -493,7 +529,13 @@ calc_up_nodes(#ch_mgr{name=MyName, proj=Proj, runenv=RunEnv1}=S) ->
|
||||||
{UpNodes, Partitions, S#ch_mgr{runenv=RunEnv2}}.
|
{UpNodes, Partitions, S#ch_mgr{runenv=RunEnv2}}.
|
||||||
|
|
||||||
calc_up_nodes(MyName, AllMembers, RunEnv1) ->
|
calc_up_nodes(MyName, AllMembers, RunEnv1) ->
|
||||||
{Partitions2, Islands2} = machi_partition_simulator:get(AllMembers),
|
{Partitions2, Islands2} =
|
||||||
|
case proplists:get_value(use_partition_simulator, RunEnv1) of
|
||||||
|
true ->
|
||||||
|
machi_partition_simulator:get(AllMembers);
|
||||||
|
false ->
|
||||||
|
{[], [AllMembers]}
|
||||||
|
end,
|
||||||
catch ?REACT({partitions,Partitions2}),
|
catch ?REACT({partitions,Partitions2}),
|
||||||
catch ?REACT({islands,Islands2}),
|
catch ?REACT({islands,Islands2}),
|
||||||
UpNodes = lists:sort(
|
UpNodes = lists:sort(
|
||||||
|
@ -581,6 +623,9 @@ react_to_env_A20(Retries, S) ->
|
||||||
%% The UnanimousTag isn't quite sufficient for our needs. We need
|
%% The UnanimousTag isn't quite sufficient for our needs. We need
|
||||||
%% to determine if *all* of the UPI+Repairing FLUs are members of
|
%% to determine if *all* of the UPI+Repairing FLUs are members of
|
||||||
%% the unanimous server replies.
|
%% the unanimous server replies.
|
||||||
|
io:format(user, "\nReact ~P\n", [lists:reverse(get(react)), 10]),
|
||||||
|
io:format(user, "\nReadExtra ~p\n", [ReadExtra]),
|
||||||
|
io:format(user, "\nP_latest ~p\n", [P_latest]),
|
||||||
UnanimousFLUs = lists:sort(proplists:get_value(unanimous_flus, ReadExtra)),
|
UnanimousFLUs = lists:sort(proplists:get_value(unanimous_flus, ReadExtra)),
|
||||||
UPI_Repairing_FLUs = lists:sort(P_latest#projection_v1.upi ++
|
UPI_Repairing_FLUs = lists:sort(P_latest#projection_v1.upi ++
|
||||||
P_latest#projection_v1.repairing),
|
P_latest#projection_v1.repairing),
|
||||||
|
@ -614,6 +659,9 @@ react_to_env_A30(Retries, P_latest, LatestUnanimousP, _ReadExtra,
|
||||||
?REACT({a30, ?LINE, [{newprop1, machi_projection:make_summary(P_newprop1)}]}),
|
?REACT({a30, ?LINE, [{newprop1, machi_projection:make_summary(P_newprop1)}]}),
|
||||||
|
|
||||||
%% Are we flapping yet?
|
%% Are we flapping yet?
|
||||||
|
io:format(user, "React 2 ~P\n", [lists:reverse(get(react)), 109999]),
|
||||||
|
io:format(user, "NewProp1 ~p\n", [P_newprop1]),
|
||||||
|
io:format(user, "Current ~p\n", [P_current]),
|
||||||
{P_newprop2, S3} = calculate_flaps(P_newprop1, P_current, FlapLimit, S2),
|
{P_newprop2, S3} = calculate_flaps(P_newprop1, P_current, FlapLimit, S2),
|
||||||
|
|
||||||
%% Move the epoch number up ... originally done in C300.
|
%% Move the epoch number up ... originally done in C300.
|
||||||
|
@ -1186,9 +1234,13 @@ calculate_flaps(P_newprop, _P_current, _FlapLimit,
|
||||||
P#projection_v1.repairing,
|
P#projection_v1.repairing,
|
||||||
P#projection_v1.down} || P <- Ps]),
|
P#projection_v1.down} || P <- Ps]),
|
||||||
|
|
||||||
|
QQQ =
|
||||||
{_WhateverUnanimous, BestP, Props, _S} =
|
{_WhateverUnanimous, BestP, Props, _S} =
|
||||||
cl_read_latest_projection(private, S),
|
cl_read_latest_projection(private, S),
|
||||||
NotBestPs = proplists:get_value(not_unanimous_answers, Props),
|
NotBestPs = proplists:get_value(not_unanimous_answers, Props, []),
|
||||||
|
io:format(user, "QQQ ~p\n", [QQQ]),
|
||||||
|
io:format(user, "BestP ~p\n", [BestP]),
|
||||||
|
io:format(user, "NotBestPs ~p\n", [NotBestPs]),
|
||||||
DownUnion = lists:usort(
|
DownUnion = lists:usort(
|
||||||
lists:flatten(
|
lists:flatten(
|
||||||
[P#projection_v1.down ||
|
[P#projection_v1.down ||
|
||||||
|
@ -1628,6 +1680,8 @@ merge_flap_counts([FlapCount|Rest], D1) ->
|
||||||
end, D1, D2),
|
end, D1, D2),
|
||||||
merge_flap_counts(Rest, D3).
|
merge_flap_counts(Rest, D3).
|
||||||
|
|
||||||
|
%% proxy_pid(Name, #ch_mgr{proxies_dict=[]}) ->
|
||||||
|
%% throw(empty_proxies_dict);
|
||||||
proxy_pid(Name, #ch_mgr{proxies_dict=ProxiesDict}) ->
|
proxy_pid(Name, #ch_mgr{proxies_dict=ProxiesDict}) ->
|
||||||
orddict:fetch(Name, ProxiesDict).
|
orddict:fetch(Name, ProxiesDict).
|
||||||
|
|
||||||
|
@ -1672,6 +1726,7 @@ perhaps_call_t(S, Partitions, FLU, DoIt) ->
|
||||||
perhaps_call(#ch_mgr{name=MyName}=S, Partitions, FLU, DoIt) ->
|
perhaps_call(#ch_mgr{name=MyName}=S, Partitions, FLU, DoIt) ->
|
||||||
ProxyPid = proxy_pid(FLU, S),
|
ProxyPid = proxy_pid(FLU, S),
|
||||||
RemoteFLU_p = FLU /= MyName,
|
RemoteFLU_p = FLU /= MyName,
|
||||||
|
try
|
||||||
case RemoteFLU_p andalso lists:member({MyName, FLU}, Partitions) of
|
case RemoteFLU_p andalso lists:member({MyName, FLU}, Partitions) of
|
||||||
false ->
|
false ->
|
||||||
Res = DoIt(ProxyPid),
|
Res = DoIt(ProxyPid),
|
||||||
|
@ -1685,6 +1740,9 @@ perhaps_call(#ch_mgr{name=MyName}=S, Partitions, FLU, DoIt) ->
|
||||||
_ ->
|
_ ->
|
||||||
(catch put(react, [{timeout1,me,MyName,to,FLU,RemoteFLU_p,Partitions}|get(react)])),
|
(catch put(react, [{timeout1,me,MyName,to,FLU,RemoteFLU_p,Partitions}|get(react)])),
|
||||||
exit(timeout)
|
exit(timeout)
|
||||||
|
end
|
||||||
|
catch throw:empty_proxies_dict ->
|
||||||
|
asdflkjweoiasd
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
|
@ -58,15 +58,16 @@ init([FluName, TcpPort, DataDir, Props0]) ->
|
||||||
SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},
|
SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},
|
||||||
|
|
||||||
ProjRegName = make_proj_supname(FluName),
|
ProjRegName = make_proj_supname(FluName),
|
||||||
|
Props = [{projection_store_registered_name, ProjRegName},
|
||||||
|
{use_partition_simulator,false}|Props0],
|
||||||
ProjSpec = {ProjRegName,
|
ProjSpec = {ProjRegName,
|
||||||
{machi_projection_store, start_link,
|
{machi_projection_store, start_link,
|
||||||
[ProjRegName, DataDir, zarfus_todo]},
|
[ProjRegName, DataDir, zarfus_todo]},
|
||||||
permanent, 5000, worker, []},
|
permanent, 5000, worker, []},
|
||||||
MgrSpec = {make_mgr_supname(FluName),
|
MgrSpec = {make_mgr_supname(FluName),
|
||||||
{machi_chain_manager1, start_link,
|
{machi_chain_manager1, start_link,
|
||||||
[FluName, [], Props0]},
|
[FluName, [], Props]},
|
||||||
permanent, 5000, worker, []},
|
permanent, 5000, worker, []},
|
||||||
Props = [{projection_store_registered_name, ProjRegName}|Props0],
|
|
||||||
FluSpec = {FluName,
|
FluSpec = {FluName,
|
||||||
{machi_flu1, start_link,
|
{machi_flu1, start_link,
|
||||||
[ [{FluName, TcpPort, DataDir}|Props] ]},
|
[ [{FluName, TcpPort, DataDir}|Props] ]},
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
smoke_test() ->
|
smoke_test() ->
|
||||||
{ok, PidA} = machi_flu_sup:start_link(),
|
{ok, SupPid} = machi_flu_sup:start_link(),
|
||||||
try
|
try
|
||||||
{ok, _} = machi_flu_psup:start_flu_package(a, 5555, "./data.a",
|
{ok, _} = machi_flu_psup:start_flu_package(a, 5555, "./data.a",
|
||||||
[{active_mode,false}]),
|
[{active_mode,false}]),
|
||||||
|
@ -51,9 +51,16 @@ smoke_test() ->
|
||||||
[{active_mode,false}]),
|
[{active_mode,false}]),
|
||||||
{ok, _} = machi_flu_psup:start_flu_package(c, 5557, "./data.c",
|
{ok, _} = machi_flu_psup:start_flu_package(c, 5557, "./data.c",
|
||||||
[{active_mode,false}]),
|
[{active_mode,false}]),
|
||||||
|
|
||||||
|
[begin
|
||||||
|
QQ = machi_chain_manager1:test_react_to_env(a_chmgr),
|
||||||
|
io:format(user, "QQ ~p\n", [QQ])
|
||||||
|
end || _ <- [1,2,3]],
|
||||||
ok
|
ok
|
||||||
after
|
after
|
||||||
[ok = machi_flu_psup:stop_flu_package(X) || X <- [a,b,c]]
|
[ok = machi_flu_psup:stop_flu_package(X) || X <- [a,b,c]],
|
||||||
|
unlink(SupPid),
|
||||||
|
exit(SupPid, stop_please)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
|
Loading…
Reference in a new issue