mirror of
https://github.com/valitydev/hellgate.git
synced 2024-11-06 02:45:20 +00:00
OPS-465: Fix pin functionality (#125)
* OPS-465: Fix pin functionality * Fix * Fix * Remove unneeded include * Fix 2
This commit is contained in:
parent
67837eb732
commit
b5488dea6c
@ -25,9 +25,9 @@
|
|||||||
-record(route, {
|
-record(route, {
|
||||||
provider_ref :: dmsl_domain_thrift:'ProviderRef'(),
|
provider_ref :: dmsl_domain_thrift:'ProviderRef'(),
|
||||||
terminal_ref :: dmsl_domain_thrift:'TerminalRef'(),
|
terminal_ref :: dmsl_domain_thrift:'TerminalRef'(),
|
||||||
weight :: integer(),
|
|
||||||
priority :: integer(),
|
priority :: integer(),
|
||||||
pin :: pin(),
|
pin :: pin(),
|
||||||
|
weight :: integer(),
|
||||||
fd_overrides :: fd_overrides()
|
fd_overrides :: fd_overrides()
|
||||||
}).
|
}).
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
-define(fd_overrides(Enabled), #domain_RouteFaultDetectorOverrides{enabled = Enabled}).
|
-define(fd_overrides(Enabled), #domain_RouteFaultDetectorOverrides{enabled = Enabled}).
|
||||||
|
|
||||||
|
-define(ZERO, 0).
|
||||||
|
|
||||||
-type fd_service_stats() :: fd_proto_fault_detector_thrift:'ServiceStatistics'().
|
-type fd_service_stats() :: fd_proto_fault_detector_thrift:'ServiceStatistics'().
|
||||||
|
|
||||||
-type terminal_priority_rating() :: integer().
|
-type terminal_priority_rating() :: integer().
|
||||||
@ -342,7 +344,25 @@ find_best_routes([First | Rest]) ->
|
|||||||
Rest
|
Rest
|
||||||
).
|
).
|
||||||
|
|
||||||
select_better_route(Left, Right) ->
|
select_better_route({LeftScore, _} = Left, {RightScore, _} = Right) ->
|
||||||
|
LeftPin = LeftScore#domain_PaymentRouteScores.route_pin,
|
||||||
|
RightPin = RightScore#domain_PaymentRouteScores.route_pin,
|
||||||
|
case {LeftPin, RightPin} of
|
||||||
|
_ when LeftPin /= ?ZERO, RightPin /= ?ZERO ->
|
||||||
|
select_better_pinned_route(Left, Right);
|
||||||
|
_ ->
|
||||||
|
select_better_regular_route(Left, Right)
|
||||||
|
end.
|
||||||
|
|
||||||
|
select_better_pinned_route({LeftScore, _Route1} = Left, {RightScore, _Route2} = Right) ->
|
||||||
|
case max(LeftScore, RightScore) of
|
||||||
|
LeftScore ->
|
||||||
|
Left;
|
||||||
|
RightScore ->
|
||||||
|
Right
|
||||||
|
end.
|
||||||
|
|
||||||
|
select_better_regular_route(Left, Right) ->
|
||||||
max(Left, Right).
|
max(Left, Right).
|
||||||
|
|
||||||
select_better_route_ideal(Left, Right) ->
|
select_better_route_ideal(Left, Right) ->
|
||||||
@ -504,9 +524,14 @@ score_route_ext({Route, ProviderStatus}) ->
|
|||||||
|
|
||||||
score_route(Route) ->
|
score_route(Route) ->
|
||||||
PriorityRate = hg_route:priority(Route),
|
PriorityRate = hg_route:priority(Route),
|
||||||
RandomCondition = hg_route:weight(Route),
|
|
||||||
Pin = hg_route:pin(Route),
|
Pin = hg_route:pin(Route),
|
||||||
PinHash = erlang:phash2(Pin),
|
{RandomCondition, PinHash} =
|
||||||
|
case Pin of
|
||||||
|
#{} when map_size(Pin) == 0 ->
|
||||||
|
{hg_route:weight(Route), ?ZERO};
|
||||||
|
_ ->
|
||||||
|
{?ZERO, erlang:phash2(Pin)}
|
||||||
|
end,
|
||||||
#domain_PaymentRouteScores{
|
#domain_PaymentRouteScores{
|
||||||
terminal_priority_rating = PriorityRate,
|
terminal_priority_rating = PriorityRate,
|
||||||
route_pin = PinHash,
|
route_pin = PinHash,
|
||||||
@ -816,6 +841,33 @@ record_comparsion_test() ->
|
|||||||
},
|
},
|
||||||
?assertEqual(Bigger, select_better_route(Bigger, Smaller)).
|
?assertEqual(Bigger, select_better_route(Bigger, Smaller)).
|
||||||
|
|
||||||
|
-spec pin_random_test() -> _.
|
||||||
|
pin_random_test() ->
|
||||||
|
Pin = #{
|
||||||
|
email => <<"example@mail.com">>
|
||||||
|
},
|
||||||
|
Scores = {{alive, 0.0}, {normal, 0.0}},
|
||||||
|
Route1 = {hg_route:new(?prv(1), ?trm(1), 50, 1, Pin), Scores},
|
||||||
|
Route2 = {hg_route:new(?prv(2), ?trm(2), 50, 1, Pin), Scores},
|
||||||
|
lists:foldl(
|
||||||
|
fun(_I, Acc) ->
|
||||||
|
BalancedRoutes = balance_routes([Route1, Route2]),
|
||||||
|
ScoredRoutes = score_routes(BalancedRoutes),
|
||||||
|
{{_, ChosenScoredRoute}, _IdealRoute} = find_best_routes(ScoredRoutes),
|
||||||
|
case Acc of
|
||||||
|
undefined ->
|
||||||
|
ChosenScoredRoute;
|
||||||
|
_ ->
|
||||||
|
ChosenTerminal = hg_route:terminal_ref(ChosenScoredRoute),
|
||||||
|
AccTerminal = hg_route:terminal_ref(Acc),
|
||||||
|
_ = ?assertEqual(ChosenTerminal, AccTerminal),
|
||||||
|
ChosenScoredRoute
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
undefined,
|
||||||
|
lists:seq(0, 1000)
|
||||||
|
).
|
||||||
|
|
||||||
-spec balance_routes_test_() -> [testcase()].
|
-spec balance_routes_test_() -> [testcase()].
|
||||||
balance_routes_test_() ->
|
balance_routes_test_() ->
|
||||||
Status = {{alive, 0.0}, {normal, 0.0}},
|
Status = {{alive, 0.0}, {normal, 0.0}},
|
||||||
|
Loading…
Reference in New Issue
Block a user