Add flap disabler for 3 seconds after up/down change
This commit is contained in:
parent
2f82fe0487
commit
ea61fe78bf
1 changed files with 32 additions and 8 deletions
|
@ -69,6 +69,7 @@
|
||||||
flap_start=?NOT_FLAPPING_START
|
flap_start=?NOT_FLAPPING_START
|
||||||
:: {{'epk', integer()}, erlang:timestamp()},
|
:: {{'epk', integer()}, erlang:timestamp()},
|
||||||
flap_last_up=[] :: list(),
|
flap_last_up=[] :: list(),
|
||||||
|
flap_last_up_change=now() :: erlang:now(),
|
||||||
flap_counts_last=[] :: list(),
|
flap_counts_last=[] :: list(),
|
||||||
not_sanes :: orddict:orddict(),
|
not_sanes :: orddict:orddict(),
|
||||||
sane_transitions = 0 :: non_neg_integer(),
|
sane_transitions = 0 :: non_neg_integer(),
|
||||||
|
@ -1614,7 +1615,8 @@ react_to_env_A50(P_latest, FinalProps, #ch_mgr{proj=P_current}=S) ->
|
||||||
|
|
||||||
react_to_env_B10(Retries, P_newprop, P_latest, LatestUnanimousP,
|
react_to_env_B10(Retries, P_newprop, P_latest, LatestUnanimousP,
|
||||||
Rank_newprop, Rank_latest,
|
Rank_newprop, Rank_latest,
|
||||||
#ch_mgr{name=MyName, flap_limit=FlapLimit, proj=P_current}=S)->
|
#ch_mgr{name=MyName, consistency_mode=CMode,
|
||||||
|
flap_limit=FlapLimit, proj=P_current}=S)->
|
||||||
?REACT(b10),
|
?REACT(b10),
|
||||||
|
|
||||||
{P_newprop_flap_time, P_newprop_flap_count} = get_flap_count(P_newprop),
|
{P_newprop_flap_time, P_newprop_flap_count} = get_flap_count(P_newprop),
|
||||||
|
@ -1668,7 +1670,6 @@ react_to_env_B10(Retries, P_newprop, P_latest, LatestUnanimousP,
|
||||||
andalso
|
andalso
|
||||||
%% My down lists are the same, i.e., no state change to announce
|
%% My down lists are the same, i.e., no state change to announce
|
||||||
P_current#projection_v1.down == P_newprop#projection_v1.down,
|
P_current#projection_v1.down == P_newprop#projection_v1.down,
|
||||||
if EnoughAreFlapping_and_IamBad_p -> io:format(user, "B10 ~w ~w current_down ~w newprop_down ~w, ", [MyName, EnoughAreFlapping_and_IamBad_p, P_current#projection_v1.down, P_newprop#projection_v1.down]); true -> ok end,
|
|
||||||
?REACT({b10, ?LINE, [{0,EnoughAreFlapping_and_IamBad_p},
|
?REACT({b10, ?LINE, [{0,EnoughAreFlapping_and_IamBad_p},
|
||||||
{1,inner_projection_exists(P_current)},
|
{1,inner_projection_exists(P_current)},
|
||||||
{2,inner_projection_exists(P_latest)},
|
{2,inner_projection_exists(P_latest)},
|
||||||
|
@ -1679,14 +1680,24 @@ if EnoughAreFlapping_and_IamBad_p -> io:format(user, "B10 ~w ~w current_down ~w
|
||||||
if
|
if
|
||||||
EnoughAreFlapping_and_IamBad_p ->
|
EnoughAreFlapping_and_IamBad_p ->
|
||||||
?REACT({b10, ?LINE, []}),
|
?REACT({b10, ?LINE, []}),
|
||||||
|
|
||||||
%% There's outer flapping happening *and* we ourselves are
|
%% There's outer flapping happening *and* we ourselves are
|
||||||
%% definitely flapping (flapping manifesto, starting clause 1)
|
%% definitely flapping (flapping manifesto, starting clause 1)
|
||||||
%% ... and also we are a member of the all_hosed club. So, we
|
%% ... and also we are a member of the all_hosed club. So, we
|
||||||
%% should shut up and let someone else do the proposing.
|
%% should shut up and let someone else do the proposing.
|
||||||
|
FinalProps = [{muting_myself, true},
|
||||||
|
{all_hosed, P_newprop_AllHosed}],
|
||||||
%% io:format(user, "B10: ~w shut up, latest e=~w/Inner=~w, ", [MyName, P_latest#projection_v1.epoch_number, (inner_projection_or_self(P_latest))#projection_v1.epoch_number]),
|
%% io:format(user, "B10: ~w shut up, latest e=~w/Inner=~w, ", [MyName, P_latest#projection_v1.epoch_number, (inner_projection_or_self(P_latest))#projection_v1.epoch_number]),
|
||||||
react_to_env_A50(P_latest, [{muting_myself, true},
|
if CMode == ap_mode ->
|
||||||
{all_hosed, P_newprop_AllHosed}], S);
|
react_to_env_A50(P_latest, FinalProps, S);
|
||||||
|
CMode == cp_mode ->
|
||||||
|
%% Be more harsh, stop iterating by A49 so that when we
|
||||||
|
%% resume we will have a much small opinion about the
|
||||||
|
%% world.
|
||||||
|
%% WHOOPS, doesn't allow convergence in simple cases,
|
||||||
|
%% needs more work!!!!!!!!!!!!!!!! Monday evening!!!!
|
||||||
|
%% react_to_env_A49(P_latest, FinalProps, S)
|
||||||
|
react_to_env_A50(P_latest, FinalProps, S)
|
||||||
|
end;
|
||||||
|
|
||||||
LatestUnanimousP
|
LatestUnanimousP
|
||||||
andalso
|
andalso
|
||||||
|
@ -2079,10 +2090,17 @@ calculate_flaps(P_newprop, P_latest, _P_current, CurrentUp, _FlapLimit,
|
||||||
#ch_mgr{name=MyName, proj_history=H,
|
#ch_mgr{name=MyName, proj_history=H,
|
||||||
flap_start=FlapStart,
|
flap_start=FlapStart,
|
||||||
flap_count=FlapCount, flap_last_up=FlapLastUp,
|
flap_count=FlapCount, flap_last_up=FlapLastUp,
|
||||||
|
flap_last_up_change=LastUpChange0,
|
||||||
flap_counts_last=FlapCountsLast,
|
flap_counts_last=FlapCountsLast,
|
||||||
runenv=RunEnv1}=S) ->
|
runenv=RunEnv1}=S) ->
|
||||||
UniqueProposalSummaries = make_unique_proposal_summaries(H, P_newprop),
|
UniqueProposalSummaries = make_unique_proposal_summaries(H, P_newprop),
|
||||||
MyUniquePropCount = length(UniqueProposalSummaries),
|
MyUniquePropCount = length(UniqueProposalSummaries),
|
||||||
|
LastUpChange = if CurrentUp /= FlapLastUp ->
|
||||||
|
now();
|
||||||
|
true ->
|
||||||
|
LastUpChange0
|
||||||
|
end,
|
||||||
|
LastUpChange_diff = timer:now_diff(now(), LastUpChange) / 1000000,
|
||||||
|
|
||||||
{_WhateverUnanimous, BestP, Props, _S} =
|
{_WhateverUnanimous, BestP, Props, _S} =
|
||||||
cl_read_latest_projection(private, S),
|
cl_read_latest_projection(private, S),
|
||||||
|
@ -2167,12 +2185,17 @@ calculate_flaps(P_newprop, P_latest, _P_current, CurrentUp, _FlapLimit,
|
||||||
end,
|
end,
|
||||||
LeaveFlapping_p =
|
LeaveFlapping_p =
|
||||||
if
|
if
|
||||||
|
LastUpChange_diff < 3.0 ->
|
||||||
|
%% If the last time we saw a hard change in up/down status
|
||||||
|
%% was less than this time ago, then we do not flap. Give
|
||||||
|
%% the status change some time to propagate.
|
||||||
|
true;
|
||||||
StartFlapping_p ->
|
StartFlapping_p ->
|
||||||
%% If we're starting flapping on this iteration, don't ignore
|
%% If we're starting flapping on this iteration, don't ignore
|
||||||
%% that intent.
|
%% that intent.
|
||||||
false;
|
false;
|
||||||
AmFlappingNow_p andalso
|
AmFlappingNow_p andalso
|
||||||
FlapLastUp /= [] andalso CurrentUp /= FlapLastUp ->
|
CurrentUp /= FlapLastUp ->
|
||||||
?REACT({calculate_flaps,?LINE,[{manifesto_clause,1}]}),
|
?REACT({calculate_flaps,?LINE,[{manifesto_clause,1}]}),
|
||||||
true;
|
true;
|
||||||
AmFlappingNow_p ->
|
AmFlappingNow_p ->
|
||||||
|
@ -2209,7 +2232,7 @@ calculate_flaps(P_newprop, P_latest, _P_current, CurrentUp, _FlapLimit,
|
||||||
?REACT({calculate_flaps,?LINE,[]}),
|
?REACT({calculate_flaps,?LINE,[]}),
|
||||||
false
|
false
|
||||||
end,
|
end,
|
||||||
if LeaveFlapping_p -> io:format(user, "CALC_FLAP: ~w: flapping_now ~w start ~w leave ~w latest-epoch ~w: ~w\n", [MyName, AmFlappingNow_p, StartFlapping_p, LeaveFlapping_p, P_latest#projection_v1.epoch_number, [X || X={calculate_flaps,_,_} <- lists:sublist(get(react), 3)]]); true -> ok end,
|
%% if LeaveFlapping_p andalso (AmFlappingNow_p orelse StartFlapping_p) -> io:format(user, "CALC_FLAP: ~w: flapping_now ~w start ~w leave ~w latest-epoch ~w: ~w\n", [MyName, AmFlappingNow_p, StartFlapping_p, LeaveFlapping_p, P_latest#projection_v1.epoch_number, [X || X={calculate_flaps,_,_} <- lists:sublist(get(react), 3)]]); true -> ok end,
|
||||||
AmFlapping_p = if LeaveFlapping_p -> false;
|
AmFlapping_p = if LeaveFlapping_p -> false;
|
||||||
true -> AmFlappingNow_p orelse StartFlapping_p
|
true -> AmFlappingNow_p orelse StartFlapping_p
|
||||||
end,
|
end,
|
||||||
|
@ -2258,7 +2281,8 @@ if LeaveFlapping_p -> io:format(user, "CALC_FLAP: ~w: flapping_now ~w start ~w l
|
||||||
%% the 'runenv' variable that's threaded through all this code.
|
%% the 'runenv' variable that's threaded through all this code.
|
||||||
%% It isn't doing what I'd originally intended. Fix it.
|
%% It isn't doing what I'd originally intended. Fix it.
|
||||||
S2 = S#ch_mgr{flap_count=NewFlapCount, flap_start=NewFlapStart,
|
S2 = S#ch_mgr{flap_count=NewFlapCount, flap_start=NewFlapStart,
|
||||||
flap_last_up=CurrentUp, flap_counts_last=AllFlapCounts,
|
flap_last_up=CurrentUp, flap_last_up_change=LastUpChange,
|
||||||
|
flap_counts_last=AllFlapCounts,
|
||||||
runenv=RunEnv1},
|
runenv=RunEnv1},
|
||||||
{machi_projection:update_checksum(P_newprop#projection_v1{
|
{machi_projection:update_checksum(P_newprop#projection_v1{
|
||||||
flap=FlappingI}),
|
flap=FlappingI}),
|
||||||
|
|
Loading…
Reference in a new issue