diff options
author | Michael Klishin <klishinm@vmware.com> | 2023-04-24 14:49:12 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 14:49:12 +0400 |
commit | c094bbb8288beb0b0184f9d7887cee396da21fff (patch) | |
tree | 0a26b1295d68a965467f6670e568c8aac1750783 | |
parent | 3a17b928686b872cf5920546224530745799de6c (diff) | |
parent | 6b4d8814032dccdd0e29c16aff6402075ff5853e (diff) | |
download | rabbitmq-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.erl | 27 |
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); |