WIP: tests pass, but not finished yet
This commit is contained in:
parent
7bafc1c28a
commit
53f6a753f4
3 changed files with 71 additions and 31 deletions
|
@ -131,28 +131,31 @@ test_react_to_env(Pid) ->
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
get_my_private_projection_members_dict(MgrOpts) ->
|
%% Bootstrapping is a hassle ... when when isn't it?
|
||||||
EmptyDict = orddict:new(),
|
%%
|
||||||
case proplists:get_value(projection_store_registered_name, MgrOpts) of
|
%% If InitMembersDict == [], then we don't know anything about the chain
|
||||||
undefined ->
|
%% that we'll be participating in. We'll have to wait for directions from
|
||||||
EmptyDict;
|
%% our sysadmin later.
|
||||||
Store ->
|
%%
|
||||||
case machi_projection_store:read_latest_projection(Store, private) of
|
%% If InitMembersDict /= [], then we do know what chain we're
|
||||||
{error, not_written} ->
|
%% participating in. It's probably test code, since that's about the
|
||||||
EmptyDict;
|
%% only time that we know so much at init() time.
|
||||||
{ok, P} ->
|
%%
|
||||||
P#projection_v1.members_dict
|
%% In either case, we'll try to create & store an epoch 0 projection
|
||||||
end
|
%% and store it to both projections stores. This is tricky if
|
||||||
end.
|
%% InitMembersDict == [] because InitMembersDict usually contains the
|
||||||
|
%% #p_svrv records that we need to *write* to the projection store,
|
||||||
|
%% even our own private store! For test code, we get the store
|
||||||
|
%% manager's pid in MgrOpts and use direct gen_server calls to the
|
||||||
|
%% local projection store.
|
||||||
|
|
||||||
init({MyName, MembersDict, MgrOpts}) ->
|
init({MyName, InitMembersDict, MgrOpts}) ->
|
||||||
Dx = case MembersDict of
|
ZeroAll_list = [P#p_srvr.name || {_,P} <- orddict:to_list(InitMembersDict)],
|
||||||
[] ->
|
ZeroProj = make_none_projection(MyName, ZeroAll_list, InitMembersDict),
|
||||||
get_my_private_projection_members_dict(MgrOpts);
|
ok = store_zeroth_projection_maybe(ZeroProj, MgrOpts),
|
||||||
_ ->
|
|
||||||
MembersDict
|
MembersDict = get_my_private_projection_members_dict(MgrOpts, InitMembersDict),
|
||||||
end,
|
All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(MembersDict)],
|
||||||
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)},
|
{use_partition_simulator, Opt(use_partition_simulator, true)},
|
||||||
|
@ -247,6 +250,29 @@ make_none_projection(MyName, All_list, MembersDict) ->
|
||||||
UPI_list = [],
|
UPI_list = [],
|
||||||
machi_projection:new(MyName, MembersDict, UPI_list, Down_list, [], []).
|
machi_projection:new(MyName, MembersDict, UPI_list, Down_list, [], []).
|
||||||
|
|
||||||
|
get_my_private_projection_members_dict(MgrOpts, DefaultDict) ->
|
||||||
|
case proplists:get_value(projection_store_registered_name, MgrOpts) of
|
||||||
|
undefined ->
|
||||||
|
DefaultDict;
|
||||||
|
Store ->
|
||||||
|
{ok, P} = machi_projection_store:read_latest_projection(Store,
|
||||||
|
private),
|
||||||
|
P#projection_v1.members_dict
|
||||||
|
end.
|
||||||
|
|
||||||
|
%% Write the epoch 0 projection store, to assist bootstrapping. If the
|
||||||
|
%% 0th epoch is already written, there's no problem.
|
||||||
|
|
||||||
|
store_zeroth_projection_maybe(ZeroProj, MgrOpts) ->
|
||||||
|
case proplists:get_value(projection_store_registered_name, MgrOpts) of
|
||||||
|
undefined ->
|
||||||
|
ok;
|
||||||
|
Store ->
|
||||||
|
_ = machi_projection_store:write(Store, public, ZeroProj),
|
||||||
|
_ = machi_projection_store:write(Store, private, ZeroProj),
|
||||||
|
ok
|
||||||
|
end.
|
||||||
|
|
||||||
set_active_timer(#ch_mgr{name=MyName, members_dict=MembersDict}=S) ->
|
set_active_timer(#ch_mgr{name=MyName, members_dict=MembersDict}=S) ->
|
||||||
FLU_list = [P#p_srvr.name || {_,P} <- orddict:to_list(MembersDict)],
|
FLU_list = [P#p_srvr.name || {_,P} <- orddict:to_list(MembersDict)],
|
||||||
USec = calc_sleep_ranked_order(1000, 2000, MyName, FLU_list),
|
USec = calc_sleep_ranked_order(1000, 2000, MyName, FLU_list),
|
||||||
|
@ -607,6 +633,8 @@ rank_projection(#projection_v1{author_server=Author,
|
||||||
( N * length(Repairing_list)) +
|
( N * length(Repairing_list)) +
|
||||||
(N*N * length(UPI_list)).
|
(N*N * length(UPI_list)).
|
||||||
|
|
||||||
|
do_react_to_env(#ch_mgr{proj=#projection_v1{members_dict=[]}}=S) ->
|
||||||
|
{empty_members_dict, S};
|
||||||
do_react_to_env(S) ->
|
do_react_to_env(S) ->
|
||||||
put(react, []),
|
put(react, []),
|
||||||
react_to_env_A10(S).
|
react_to_env_A10(S).
|
||||||
|
@ -1238,9 +1266,9 @@ 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, "QQQ ~p\n", [QQQ]),
|
||||||
io:format(user, "BestP ~p\n", [BestP]),
|
%% io:format(user, "BestP ~p\n", [BestP]),
|
||||||
io:format(user, "NotBestPs ~p\n", [NotBestPs]),
|
%% 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 ||
|
||||||
|
|
|
@ -239,6 +239,17 @@ info_msg(Fmt, Args) ->
|
||||||
_ -> error_logger:info_msg(Fmt, Args)
|
_ -> error_logger:info_msg(Fmt, Args)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
wait_for_death(Pid, 0) ->
|
||||||
|
exit({not_dead_yet, Pid});
|
||||||
|
wait_for_death(Pid, Iters) when is_pid(Pid) ->
|
||||||
|
case erlang:is_process_alive(Pid) of
|
||||||
|
false ->
|
||||||
|
ok;
|
||||||
|
true ->
|
||||||
|
timer:sleep(1),
|
||||||
|
wait_for_death(Pid, Iters-1)
|
||||||
|
end.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
%% @doc Create a TCP connection to a remote Machi server.
|
%% @doc Create a TCP connection to a remote Machi server.
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
smoke_test() ->
|
smoke_test() ->
|
||||||
|
[os:cmd("rm -rf " ++ X) || X <- ["./data.a", "./data.b", "/data.c"] ],
|
||||||
{ok, SupPid} = 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",
|
||||||
|
@ -51,16 +52,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
|
[begin
|
||||||
QQ = machi_chain_manager1:test_react_to_env(a_chmgr),
|
_QQ = machi_chain_manager1:test_react_to_env(a_chmgr),
|
||||||
io:format(user, "QQ ~p\n", [QQ])
|
ok
|
||||||
end || _ <- [1,2,3]],
|
end || _ <- lists:seq(1,5)],
|
||||||
ok
|
ok
|
||||||
after
|
after
|
||||||
[ok = machi_flu_psup:stop_flu_package(X) || X <- [a,b,c]],
|
exit(SupPid, normal),
|
||||||
unlink(SupPid),
|
machi_util:wait_for_death(SupPid, 100),
|
||||||
exit(SupPid, stop_please)
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
|
Loading…
Reference in a new issue