summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <klishinm@vmware.com>2023-04-24 14:49:12 +0400
committerGitHub <noreply@github.com>2023-04-24 14:49:12 +0400
commitc094bbb8288beb0b0184f9d7887cee396da21fff (patch)
tree0a26b1295d68a965467f6670e568c8aac1750783
parent3a17b928686b872cf5920546224530745799de6c (diff)
parent6b4d8814032dccdd0e29c16aff6402075ff5853e (diff)
downloadrabbitmq-server-git-c094bbb8288beb0b0184f9d7887cee396da21fff.tar.gz
Merge pull request #7927 from rabbitmq/otp-26-tcp-send
Make tcp send OTP 26 compatible
-rw-r--r--deps/rabbit_common/src/rabbit_net.erl27
1 files changed, 26 insertions, 1 deletions
diff --git a/deps/rabbit_common/src/rabbit_net.erl b/deps/rabbit_common/src/rabbit_net.erl
index 433dc20cf7..36e367e05a 100644
--- a/deps/rabbit_common/src/rabbit_net.erl
+++ b/deps/rabbit_common/src/rabbit_net.erl
@@ -168,7 +168,32 @@ port_command(Sock, Data) when ?IS_SSL(Sock) ->
{error, Reason} -> erlang:error(Reason)
end;
port_command(Sock, Data) when is_port(Sock) ->
- erlang:port_command(Sock, Data).
+ Fun = case persistent_term:get(rabbit_net_tcp_send, undefined) of
+ undefined ->
+ Rel = list_to_integer(erlang:system_info(otp_release)),
+ %% gen_tcp:send/2 does a selective receive of
+ %% {inet_reply, Sock, Status[, CallerTag]}
+ F = if Rel >= 26 ->
+ %% Selective receive is optimised:
+ %% https://github.com/erlang/otp/issues/6455
+ fun gen_tcp_send/2;
+ Rel < 26 ->
+ %% Avoid costly selective receive.
+ fun erlang:port_command/2
+ end,
+ ok = persistent_term:put(rabbit_net_tcp_send, F),
+ F;
+ F ->
+ F
+ end,
+ Fun(Sock, Data).
+
+gen_tcp_send(Sock, Data) ->
+ case gen_tcp:send(Sock, Data) of
+ ok -> self() ! {inet_reply, Sock, ok},
+ true;
+ {error, Reason} -> erlang:error(Reason)
+ end.
getopts(Sock, Options) when ?IS_SSL(Sock) ->
ssl:getopts(Sock, Options);