diff options
author | Anders Svensson <[email protected]> | 2014-12-01 14:53:16 +0100 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2014-12-01 14:53:16 +0100 |
commit | ef8c0f5cc93ed988e1919a53b6b6689c73e72eb4 (patch) | |
tree | c19e20ab5715684ef4ad053b27c538ad42e43ebd /lib/diameter | |
parent | 5a053f10425a6c517c113c375d6306f9716bfe31 (diff) | |
parent | ae92510847831609b12673be1d70106b395a2f36 (diff) | |
download | otp-ef8c0f5cc93ed988e1919a53b6b6689c73e72eb4.tar.gz otp-ef8c0f5cc93ed988e1919a53b6b6689c73e72eb4.tar.bz2 otp-ef8c0f5cc93ed988e1919a53b6b6689c73e72eb4.zip |
Merge branch 'anders/diameter/request_leak/OTP-12196' into maint
* anders/diameter/request_leak/OTP-12196:
Fix remote diameter_request table leak
Diffstat (limited to 'lib/diameter')
-rw-r--r-- | lib/diameter/src/base/diameter_traffic.erl | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/diameter/src/base/diameter_traffic.erl b/lib/diameter/src/base/diameter_traffic.erl index 280d09d7e8..e4812f3dc9 100644 --- a/lib/diameter/src/base/diameter_traffic.erl +++ b/lib/diameter/src/base/diameter_traffic.erl @@ -1632,12 +1632,23 @@ send_request(TPid, #diameter_packet{} = Pkt, Req, SvcName, Timeout) -> %% send/1 -send({TPid, Pkt, #request{handler = Pid} = Req, SvcName, Timeout, TRef}) -> - Ref = send_request(TPid, - Pkt, - Req#request{handler = self()}, - SvcName, - Timeout), +send({TPid, Pkt, #request{handler = Pid} = Req0, SvcName, Timeout, TRef}) -> + Seqs = diameter_codec:sequence_numbers(Pkt), + Req = Req0#request{handler = self()}, + Ref = send_request(TPid, Pkt, Req, SvcName, Timeout), + + try + recv(TPid, Pid, TRef, Ref) + after + %% Remove only the entry for this specific send since a resend + %% from the originating node can pick another transport on + %% this one. + ets:delete_object(?REQUEST_TABLE, {Seqs, Req, Ref}) + end. + +%% recv/4 + +recv(TPid, Pid, TRef, Ref) -> receive {answer, _, _, _, _} = A -> Pid ! A; |