diff options
author | Anders Svensson <[email protected]> | 2016-03-10 17:43:50 +0100 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2016-03-13 07:10:11 +0100 |
commit | 993d540a3ad0f2fc932fdfb0aabba06cb03f320c (patch) | |
tree | c7f07b76f72aed653695885f8021494873cd6ac1 | |
parent | 2ffb288d8daeb72c27c5cead30ce779682bdd8b0 (diff) | |
download | otp-993d540a3ad0f2fc932fdfb0aabba06cb03f320c.tar.gz otp-993d540a3ad0f2fc932fdfb0aabba06cb03f320c.tar.bz2 otp-993d540a3ad0f2fc932fdfb0aabba06cb03f320c.zip |
Let a throttling callback discard a received message
This can be used as a simple form of overload protection, discarding the
message before it's passed into diameter to become one more request
process in a flood. Replying with 3004 would be more appropriate when
the request has been directed at a specific server (the RFC's
requirement) however, and possibly it should be possible for a callback
to do this as well.
-rw-r--r-- | lib/diameter/src/transport/diameter_tcp.erl | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/diameter/src/transport/diameter_tcp.erl b/lib/diameter/src/transport/diameter_tcp.erl index 7f9255c097..b68a16b521 100644 --- a/lib/diameter/src/transport/diameter_tcp.erl +++ b/lib/diameter/src/transport/diameter_tcp.erl @@ -892,6 +892,15 @@ throttle({NPid, F}, #transport{throttled = Msg} = S) when is_pid(NPid), is_binary(Msg) -> throttle(NPid, S#transport{throttle_cb = F}); +%% Callback to accept a received message says to discard it. +throttle(discard, #transport{throttled = Msg} = S) + when is_binary(Msg) -> + throttle(S#transport{throttled = true}); + +throttle({discard = T, F}, #transport{throttled = Msg} = S) + when is_binary(Msg) -> + throttle(T, S#transport{throttle_cb = F}); + %% Callback says to ask again in the specified number of milliseconds. throttle({timeout, Tmo}, #transport{} = S) -> erlang:send_after(Tmo, self(), throttle), |