|
13 | 13 | -module(eradius_client). |
14 | 14 | -export([start_link/0, send_request/2, send_request/3, send_remote_request/3, send_remote_request/4]). |
15 | 15 | %% internal |
16 | | --export([reconfigure/0, send_remote_request_loop/8, find_suitable_peer/1, |
| 16 | +-export([reconfigure/0, send_remote_request_loop/8, |
17 | 17 | restore_upstream_server/1, store_radius_server_from_pool/3, |
18 | 18 | init_server_status_metrics/0]). |
19 | 19 |
|
@@ -92,21 +92,14 @@ send_request({IP, Port, Secret}, Request, Options) when ?GOOD_CMD(Request) andal |
92 | 92 | [] -> |
93 | 93 | SendReqFn(); |
94 | 94 | UpstreamServers -> |
95 | | - case find_suitable_peer([{IP, Port, Secret} | UpstreamServers]) of |
| 95 | + case find_suitable_peer([{IP, Port, Secret, Options} | UpstreamServers]) of |
96 | 96 | [] -> |
97 | 97 | no_active_servers; |
98 | | - {{IP, Port, Secret}, _NewPool} -> |
| 98 | + {{IP, Port, Secret, Options}, _NewPool} -> |
99 | 99 | SendReqFn(); |
100 | | - {NewPeer, []} -> |
101 | | - % Special case, we don't have servers in the pool anymore, but we need |
102 | | - % to preserve `failover` option to mark current server as inactive if |
103 | | - % it will fail |
104 | | - NewOptions = lists:keyreplace(failover, 1, Options, {failover, undefined}), |
105 | | - send_request(NewPeer, Request, NewOptions); |
106 | | - {NewPeer, NewPool} -> |
| 100 | + {{NewPeerAddr, NewPeerPort, NewPeerSecret, PeerOpts}, NewPool} -> |
107 | 101 | % current server is not in list of active servers, so use another one |
108 | | - NewOptions = lists:keyreplace(failover, 1, Options, {failover, NewPool}), |
109 | | - send_request(NewPeer, Request, NewOptions) |
| 102 | + send_request({NewPeerAddr, NewPeerPort, NewPeerSecret}, Request, [{failover, NewPool} | PeerOpts]) |
110 | 103 | end |
111 | 104 | end; |
112 | 105 | send_request({_IP, _Port, _Secret}, _Request, _Options) -> |
@@ -223,10 +216,8 @@ handle_failed_request(Request, {ServerIP, Port} = _FailedServer, UpstreamServers |
223 | 216 | case find_suitable_peer(UpstreamServers) of |
224 | 217 | [] -> |
225 | 218 | Response; |
226 | | - {NewPeer, NewPool} -> |
227 | | - % leave only active upstream servers |
228 | | - NewOptions = lists:keyreplace(failover, 1, Options, {failover, NewPool}), |
229 | | - send_request(NewPeer, Request, NewOptions) |
| 219 | + {{NewPeerAddr, NewPeerPort, NewPeerSecret, PeerOpts}, NewPool} -> |
| 220 | + send_request({NewPeerAddr, NewPeerPort, NewPeerSecret}, Request, [{failover, NewPool} | PeerOpts]) |
230 | 221 | end. |
231 | 222 |
|
232 | 223 | % @private |
@@ -632,27 +623,25 @@ client_response_counter_account_match_spec_compile() -> |
632 | 623 | MatchSpecCompile |
633 | 624 | end. |
634 | 625 |
|
635 | | -find_suitable_peer(undefined) -> |
636 | | - []; |
637 | 626 | find_suitable_peer([]) -> |
638 | 627 | []; |
639 | | -find_suitable_peer([{Host, Port, Secret} | Pool]) when is_list(Host) -> |
| 628 | +find_suitable_peer([{Host, Port, Secret, Opts} | Pool]) when is_list(Host) -> |
640 | 629 | try |
641 | 630 | IP = get_ip(Host), |
642 | | - find_suitable_peer([{IP, Port, Secret} | Pool]) |
| 631 | + find_suitable_peer([{IP, Port, Secret, Opts} | Pool]) |
643 | 632 | catch _:_ -> |
644 | 633 | % can't resolve ip by some reasons, just ignore it |
645 | 634 | find_suitable_peer(Pool) |
646 | 635 | end; |
647 | | -find_suitable_peer([{IP, Port, Secret} | Pool]) -> |
| 636 | +find_suitable_peer([{IP, Port, Secret, Opts} | Pool]) -> |
648 | 637 | case ets:lookup(?MODULE, {IP, Port}) of |
649 | 638 | [] -> |
650 | 639 | find_suitable_peer(Pool); |
651 | 640 | [{{IP, Port}, _Retries, _InitialRetries}] -> |
652 | | - {{IP, Port, Secret}, Pool} |
| 641 | + {{IP, Port, Secret, Opts}, Pool} |
653 | 642 | end; |
654 | | -find_suitable_peer([{IP, Port, Secret, _Opts} | Pool]) -> |
655 | | - find_suitable_peer([{IP, Port, Secret} | Pool]). |
| 643 | +find_suitable_peer([{IP, Port, Secret} | Pool]) -> |
| 644 | + find_suitable_peer([{IP, Port, Secret, []} | Pool]). |
656 | 645 |
|
657 | 646 | get_ip(Host) -> |
658 | 647 | case inet:gethostbyname(Host) of |
|
0 commit comments