WIP: always start chain manager with none projection

This commit is contained in:
Scott Lystig Fritchie 2015-08-06 19:24:14 +09:00
parent 0d7f6c8d7e
commit 3ca0f4491d
2 changed files with 31 additions and 16 deletions

View file

@ -219,15 +219,28 @@ init({MyName, InitMembersDict, MgrOpts}) ->
ZeroProj = make_none_projection(MyName, ZeroAll_list, [], InitMembersDict), ZeroProj = make_none_projection(MyName, ZeroAll_list, [], InitMembersDict),
ok = store_zeroth_projection_maybe(ZeroProj, MgrOpts), ok = store_zeroth_projection_maybe(ZeroProj, MgrOpts),
%% Using whatever is the largest epoch number in our local private
%% store, this manager starts out using the "none" projection. If
%% other members of the chain are running, then we'll simply adopt
%% whatever they're using as a basis for our next suggested
%% projection.
%%
%% If we're in CP mode, we have to be very careful about who we
%% choose to be UPI members when we (or anyone else) restarts.
%% However, that choice is *not* made here: it is made later
%% during our first humming consensus iteration. When we start
%% with the none projection, we're make a safe choice before
%% wading into the deep waters.
{MembersDict, Proj0} = {MembersDict, Proj0} =
get_my_private_proj_boot_info(MgrOpts, InitMembersDict, ZeroProj), get_my_private_proj_boot_info(MgrOpts, InitMembersDict, ZeroProj),
All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(MembersDict)], #projection_v1{epoch_number=CurrentEpoch,
all_members=All_list, witnesses=Witness_list} = Proj0,
Proj1 = make_none_projection(MyName, All_list, Witness_list, MembersDict),
Proj = machi_projection:update_checksum(
Proj1#projection_v1{epoch_number=CurrentEpoch}),
Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end, Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end,
CMode = Opt(consistency_mode, ap_mode), CMode = Opt(consistency_mode, ap_mode),
Proj = if CMode == ap_mode -> Proj0;
CMode == cp_mode -> Proj0 % TODO FIXMEFIXMEFIXME!
end,
RunEnv = [{seed, Opt(seed, now())}, RunEnv = [{seed, Opt(seed, now())},
{use_partition_simulator, Opt(use_partition_simulator, false)}, {use_partition_simulator, Opt(use_partition_simulator, false)},
{simulate_repair, Opt(simulate_repair, true)}, {simulate_repair, Opt(simulate_repair, true)},

View file

@ -247,6 +247,7 @@ convergence_demo_testfun(NumFLUs, MgrOpts0) ->
private_projections_are_stable(Namez, DoIt) private_projections_are_stable(Namez, DoIt)
end, false, lists:seq(0, MaxIters)), end, false, lists:seq(0, MaxIters)),
io:format(user, "\nSweet, private projections are stable\n", []), io:format(user, "\nSweet, private projections are stable\n", []),
io:format(user, "\t~p\n", [get(stable)]),
io:format(user, "Rolling sanity check ... ", []), io:format(user, "Rolling sanity check ... ", []),
MaxFiles = 3*1000, MaxFiles = 3*1000,
PrivProjs = [{Name, begin PrivProjs = [{Name, begin
@ -359,8 +360,8 @@ make_partition_list(All_list) ->
%% Concat = _X_Ys2, %% Concat = _X_Ys2,
%% Concat = _X_Ys1 ++ _X_Ys2, %% Concat = _X_Ys1 ++ _X_Ys2,
%% %% Concat = _X_Ys3, %% %% Concat = _X_Ys3,
%% %% Concat = _X_Ys1 ++ _X_Ys2 ++ _X_Ys3, Concat = _X_Ys1 ++ _X_Ys2 ++ _X_Ys3,
%% random_sort(lists:usort([lists:sort(L) || L <- Concat])). random_sort(lists:usort([lists:sort(L) || L <- Concat])).
%% [ [{a,b},{b,d},{c,b}], %% [ [{a,b},{b,d},{c,b}],
%% [{a,b},{b,d},{c,b}, {a,b},{b,a},{a,c},{c,a},{a,d},{d,a}], %% [{a,b},{b,d},{c,b}, {a,b},{b,a},{a,c},{c,a},{a,d},{d,a}],
@ -401,16 +402,16 @@ make_partition_list(All_list) ->
%% [{a,b}, {c,b}, {c,d}], %% [{a,b}, {c,b}, {c,d}],
%% [{a,b}, {b,c}, {d,c}] ]. %% [{a,b}, {b,c}, {d,c}] ].
[ %% [
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [],
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [],
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [],
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [],
[{a,b}], [], [{a,b}], [], [{a,b}] %% [{a,b}], [], [{a,b}], [], [{a,b}]
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [],
%% [{b,a},{d,e}], %% %% [{b,a},{d,e}],
%% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [] %% %% [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], [], [{a,b}], []
]. %% ].
%% [ [{a,b}, {b,c}, {c,d}, {d,e}], %% [ [{a,b}, {b,c}, {c,d}, {d,e}],
%% [{b,a}, {b,c}, {c,d}, {d,e}], %% [{b,a}, {b,c}, {c,d}, {d,e}],
%% [{a,b}, {c,b}, {c,d}, {d,e}], %% [{a,b}, {c,b}, {c,d}, {d,e}],
@ -450,6 +451,7 @@ private_projections_are_stable(Namez, PollFunc) ->
Private2 = [get_latest_inner_proj_summ(FLU) || {_Name, FLU} <- Namez], Private2 = [get_latest_inner_proj_summ(FLU) || {_Name, FLU} <- Namez],
Is = [Inner_p || {_,_,_,_,Inner_p} <- Private1], Is = [Inner_p || {_,_,_,_,Inner_p} <- Private1],
%% We want either all true or all false (inner or not). %% We want either all true or all false (inner or not).
put(stable, Private1),
Private1 == Private2 andalso length(lists:usort(Is)) == 1. Private1 == Private2 andalso length(lists:usort(Is)) == 1.
get_latest_inner_proj_summ(FLU) -> get_latest_inner_proj_summ(FLU) ->