Re-add a flapping check, but also take advantage of confirmed accepted epoch
This commit is contained in:
parent
34f8632f19
commit
a27425147d
1 changed files with 23 additions and 16 deletions
|
@ -92,8 +92,11 @@
|
||||||
-define(REPAIR_START_STABILITY_TIME, 10).
|
-define(REPAIR_START_STABILITY_TIME, 10).
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
|
||||||
%% Magic constant for looping "too frequently" breaker. TODO revisit & revise.
|
%% Maximum length of the history of adopted projections (via C120).
|
||||||
-define(TOO_FREQUENT_BREAKER, 10).
|
-define(MAX_HISTORY_LENGTH, 8).
|
||||||
|
|
||||||
|
%% Magic constant for looping "too frequently" breaker.
|
||||||
|
-define(TOO_FREQUENT_BREAKER, (?MAX_HISTORY_LENGTH+5)).
|
||||||
|
|
||||||
-define(RETURN2(X), begin (catch put(why2, [?LINE|get(why2)])), X end).
|
-define(RETURN2(X), begin (catch put(why2, [?LINE|get(why2)])), X end).
|
||||||
|
|
||||||
|
@ -103,9 +106,6 @@
|
||||||
%% Amount of epoch number skip-ahead for set_chain_members call
|
%% Amount of epoch number skip-ahead for set_chain_members call
|
||||||
-define(SET_CHAIN_MEMBERS_EPOCH_SKIP, 1111).
|
-define(SET_CHAIN_MEMBERS_EPOCH_SKIP, 1111).
|
||||||
|
|
||||||
%% Maximum length of the history of adopted projections (via C120).
|
|
||||||
-define(MAX_HISTORY_LENGTH, 30).
|
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start_link/2, start_link/3, stop/1, ping/1,
|
-export([start_link/2, start_link/3, stop/1, ping/1,
|
||||||
set_chain_members/2, set_chain_members/6, set_active/2,
|
set_chain_members/2, set_chain_members/6, set_active/2,
|
||||||
|
@ -463,7 +463,7 @@ get_my_proj_boot_info(MgrOpts, DefaultDict, DefaultProj, ProjType) ->
|
||||||
{DefaultDict, DefaultProj};
|
{DefaultDict, DefaultProj};
|
||||||
Store ->
|
Store ->
|
||||||
{ok, P} = machi_projection_store:read_latest_projection(Store,
|
{ok, P} = machi_projection_store:read_latest_projection(Store,
|
||||||
ProjType),
|
ProjType, 7789),
|
||||||
{P#projection_v1.members_dict, P}
|
{P#projection_v1.members_dict, P}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -840,7 +840,10 @@ calc_projection2(LastProj, RelativeToServer, AllHosed, Dbg,
|
||||||
D_foo=[{repair_done, {repair_final_status, ok, (S#ch_mgr.proj)#projection_v1.epoch_number}}],
|
D_foo=[{repair_done, {repair_final_status, ok, (S#ch_mgr.proj)#projection_v1.epoch_number}}],
|
||||||
{NewUPI_list ++ Repairing_list2, [], RunEnv2};
|
{NewUPI_list ++ Repairing_list2, [], RunEnv2};
|
||||||
true ->
|
true ->
|
||||||
D_foo=[d_foo2],
|
D_foo=[d_foo2, {sim_p,Simulator_p},
|
||||||
|
{simr_p,SimRepair_p}, {same_epoch,SameEpoch_p},
|
||||||
|
{rel_to,RelativeToServer},
|
||||||
|
{repch,RepChk_LastInUPI}, {repair_fs,RepairFS}],
|
||||||
{NewUPI_list, OldRepairing_list, RunEnv2}
|
{NewUPI_list, OldRepairing_list, RunEnv2}
|
||||||
end;
|
end;
|
||||||
{_ABC, _XYZ} ->
|
{_ABC, _XYZ} ->
|
||||||
|
@ -1977,7 +1980,7 @@ react_to_env_C110(P_latest, #ch_mgr{name=MyName} = S) ->
|
||||||
%% In contrast to the public projection store writes, Humming Consensus
|
%% In contrast to the public projection store writes, Humming Consensus
|
||||||
%% doesn't care about the status of writes to the public store: it's
|
%% doesn't care about the status of writes to the public store: it's
|
||||||
%% always relying only on successful reads of the public store.
|
%% always relying only on successful reads of the public store.
|
||||||
case {?FLU_PC:write_projection(MyStorePid, private, P_latest2,?TO*30),Goo} of
|
case {?FLU_PC:write_projection(MyStorePid, private, P_latest2,?TO*30+66),Goo} of
|
||||||
{ok, Goo} ->
|
{ok, Goo} ->
|
||||||
?REACT({c110, [{write, ok}]}),
|
?REACT({c110, [{write, ok}]}),
|
||||||
react_to_env_C111(P_latest, P_latest2, Extra1, MyStorePid, S);
|
react_to_env_C111(P_latest, P_latest2, Extra1, MyStorePid, S);
|
||||||
|
@ -2070,20 +2073,21 @@ react_to_env_C120(P_latest, FinalProps, #ch_mgr{proj_history=H,
|
||||||
false ->
|
false ->
|
||||||
S2;
|
S2;
|
||||||
{{_ConfEpoch, _ConfCSum}, ConfTime} ->
|
{{_ConfEpoch, _ConfCSum}, ConfTime} ->
|
||||||
io:format(user, "\nCONFIRM debug C120 ~w was annotated ~w\n", [S#ch_mgr.name, P_latest#projection_v1.epoch_number]),
|
P_latestEpoch = P_latest#projection_v1.epoch_number,
|
||||||
|
io:format(user, "\nCONFIRM debug C120 ~w was annotated ~w\n", [S#ch_mgr.name, P_latestEpoch]),
|
||||||
S2#ch_mgr{proj_unanimous=ConfTime}
|
S2#ch_mgr{proj_unanimous=ConfTime}
|
||||||
end,
|
end,
|
||||||
V = case file:read_file("/tmp/moomoo."++atom_to_list(S#ch_mgr.name)) of {ok,_} -> true; _ -> false end,
|
V = case file:read_file("/tmp/moomoo."++atom_to_list(S#ch_mgr.name)) of {ok,_} -> true; _ -> false end,
|
||||||
if V -> io:format("C120: ~w: ~p\n", [S#ch_mgr.name, get(react)]); true -> ok end,
|
if V -> io:format("C120: ~w: ~p\n", [S#ch_mgr.name, get(react)]); true -> ok end,
|
||||||
{{now_using, FinalProps, P_latest#projection_v1.epoch_number}, S3}.
|
{{now_using, FinalProps, P_latest#projection_v1.epoch_number}, S3}.
|
||||||
|
|
||||||
add_and_trunc_history(P_latest, H, MaxLength) ->
|
add_and_trunc_history(#projection_v1{epoch_number=0}, H, _MaxLength) ->
|
||||||
|
H;
|
||||||
|
add_and_trunc_history(#projection_v1{} = P_latest, H, MaxLength) ->
|
||||||
Latest_U_R = {P_latest#projection_v1.upi, P_latest#projection_v1.repairing},
|
Latest_U_R = {P_latest#projection_v1.upi, P_latest#projection_v1.repairing},
|
||||||
H2 = if P_latest#projection_v1.epoch_number > 0 ->
|
add_and_trunc_history(Latest_U_R, H, MaxLength);
|
||||||
queue:in(Latest_U_R, H);
|
add_and_trunc_history(Item, H, MaxLength) ->
|
||||||
true ->
|
H2 = queue:in(Item, H),
|
||||||
H
|
|
||||||
end,
|
|
||||||
case queue:len(H2) of
|
case queue:len(H2) of
|
||||||
X when X > MaxLength ->
|
X when X > MaxLength ->
|
||||||
{_V, Hxx} = queue:out(H2),
|
{_V, Hxx} = queue:out(H2),
|
||||||
|
@ -2499,7 +2503,10 @@ poll_private_proj_is_upi_unanimous3(#ch_mgr{name=MyName, proj=P_current} = S) ->
|
||||||
%% Unwedge our FLU.
|
%% Unwedge our FLU.
|
||||||
{ok, NotifyPid} = machi_projection_store:get_wedge_notify_pid(ProjStore),
|
{ok, NotifyPid} = machi_projection_store:get_wedge_notify_pid(ProjStore),
|
||||||
_ = machi_flu1:update_wedge_state(NotifyPid, false, EpochID),
|
_ = machi_flu1:update_wedge_state(NotifyPid, false, EpochID),
|
||||||
S2#ch_mgr{proj_unanimous=Now};
|
#ch_mgr{proj_history=H} = S2,
|
||||||
|
H2 = add_and_trunc_history({confirm, Epoch}, H,
|
||||||
|
?MAX_HISTORY_LENGTH),
|
||||||
|
S2#ch_mgr{proj_unanimous=Now, proj_history=H2};
|
||||||
_ ->
|
_ ->
|
||||||
S2
|
S2
|
||||||
end;
|
end;
|
||||||
|
|
Loading…
Reference in a new issue