File 2185-kernel-esock-test-Add-sendv-local-bench-test-case.patch of Package erlang
From 2d3f4492879965cd2a3aee8c30654fb50ff0e2fa Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 8 Apr 2025 18:39:23 +0200
Subject: [PATCH 05/10] [kernel|esock|test] Add sendv (local) bench test case
---
lib/kernel/test/socket_traffic_SUITE.erl | 79 +++++++++++++++++-------
1 file changed, 56 insertions(+), 23 deletions(-)
diff --git a/lib/kernel/test/socket_traffic_SUITE.erl b/lib/kernel/test/socket_traffic_SUITE.erl
index 788c8489d6..59353e348f 100644
--- a/lib/kernel/test/socket_traffic_SUITE.erl
+++ b/lib/kernel/test/socket_traffic_SUITE.erl
@@ -155,7 +155,8 @@
traffic_bench_sendv_and_recv_tcp4/1,
traffic_bench_send_and_recv_tcp4/1,
traffic_bench_sendv_and_recv_tcp6/1,
- traffic_bench_send_and_recv_tcp6/1
+ traffic_bench_send_and_recv_tcp6/1,
+ traffic_bench_sendv_and_recv_tcpL/1
]).
@@ -268,8 +269,8 @@ traffic_bench_cases() ->
traffic_bench_sendv_and_recv_tcp4,
traffic_bench_send_and_recv_tcp4,
traffic_bench_sendv_and_recv_tcp6,
- traffic_bench_send_and_recv_tcp6 %%,
- %% traffic_bench_sendv_and_recv_tcpL,
+ traffic_bench_send_and_recv_tcp6,
+ traffic_bench_sendv_and_recv_tcpL%%,
%% traffic_bench_send_and_recv_tcpL
].
@@ -7128,11 +7129,27 @@ traffic_bench_send_and_recv_tcp6(Config) when is_list(Config) ->
do_traffic_bench_send_and_recv(InitState)
end).
+traffic_bench_sendv_and_recv_tcpL(Config) when is_list(Config) ->
+ ?TT(?MINS(2)), %% Test *should* run for 60 secs
+ IOV = tb_iov(),
+ Send = fun(S, Data) when is_list(Data) ->
+ socket:sendv(S, Data)
+ end,
+ tc_try(?FUNCTION_NAME,
+ fun() -> has_support_unix_domain_socket() end,
+ fun() ->
+ InitState = #{domain => local,
+ send => Send,
+ iov => IOV,
+ run_time => ?MINS(1)},
+ do_traffic_bench_send_and_recv(InitState)
+ end).
+
do_traffic_bench_send_and_recv(#{run_time := RTime} = InitState) ->
?SEV_IPRINT("[ctrl] start server"),
- {PortNumber, Server} = tb_server_start(InitState),
+ {PathOrPort, Server} = tb_server_start(InitState),
?SEV_IPRINT("[ctrl] start client"),
- Client = tb_client_start(InitState, PortNumber),
+ Client = tb_client_start(InitState, PathOrPort),
TRef = erlang:start_timer(RTime, self(), tb_timeout),
?SEV_IPRINT("[ctrl] await completion"),
tb_await_completion(Server, Client, TRef).
@@ -7208,13 +7225,18 @@ tb_server_start(#{domain := Fam,
Self = self(),
Server = {Pid, MRef} =
spawn_monitor(fun() ->
+ ?SEV_IPRINT("~w:fun -> "
+ "Received down from client",
+ [?FUNCTION_NAME]),
tb_server_init(#{parent => Self,
domain => Fam,
send => Send})
end),
receive
- {Pid, PortNumber} ->
- {PortNumber, Server};
+ {Pid, PathOrPort} ->
+ ?SEV_IPRINT("~w -> server started: ~p",
+ [?FUNCTION_NAME, PathOrPort]),
+ {PathOrPort, Server};
{'DOWN', MRef, process, Pid, Info} ->
?SEV_EPRINT("[ctrl] server start failure: "
"~n ~p", [Info]),
@@ -7232,10 +7254,15 @@ tb_decode(<<Sz:32/integer, Data:Sz/binary, Rest/binary>>, Acc) ->
tb_server_init(#{parent := Pid, domain := Fam} = State) ->
SA = which_local_socket_addr(Fam),
{ok, LS} = socket:open(Fam, stream),
- ok = socket:bind(LS, SA#{port => 0}),
+ ok = socket:bind(LS, SA),
ok = socket:listen(LS),
- {ok, #{port := Port}} = socket:sockname(LS),
- Pid ! {self(), Port},
+ case SA of
+ #{path := Path} ->
+ Pid ! {self(), {path, Path}};
+ _ ->
+ {ok, #{port := Port}} = socket:sockname(LS),
+ Pid ! {self(), {port, Port}}
+ end,
{ok, AS} = socket:accept(LS),
tb_server_loop(State#{listen => LS,
accept => AS}).
@@ -7281,15 +7308,15 @@ tb_server_loop(#{listen := LS, accept := AS, send := Send} = State) ->
tb_client_start(#{domain := Fam,
send := Send,
- iov := IOV}, PortNumber) ->
+ iov := IOV}, PathOrPort) ->
Self = self(),
Client = {Pid, MRef} =
spawn_monitor(fun() ->
- tb_client_init(#{parent => Self,
- domain => Fam,
- send => Send,
- iov => IOV,
- port => PortNumber})
+ tb_client_init(#{parent => Self,
+ domain => Fam,
+ send => Send,
+ iov => IOV,
+ path_or_port => PathOrPort})
end),
receive
{Pid, ok} ->
@@ -7300,15 +7327,21 @@ tb_client_start(#{domain := Fam,
exit({tb_client_start, Info})
end.
-tb_client_init(#{parent := Pid,
- domain := Fam,
- port := Port,
- send := Send,
- iov := IOV}) ->
+tb_client_init(#{parent := Pid,
+ domain := Fam,
+ path_or_port := PathOrPort,
+ send := Send,
+ iov := IOV}) ->
SA = which_local_socket_addr(Fam),
{ok, CS} = socket:open(Fam, stream),
- ok = socket:bind(CS, SA#{port => 0}),
- ok = socket:connect(CS, SA#{port => Port}),
+ ok = socket:bind(CS, SA),
+ SSA = case PathOrPort of
+ {path, Path} ->
+ SA#{path => Path};
+ {port, Port} ->
+ SA#{port => Port}
+ end,
+ ok = socket:connect(CS, SSA),
Pid ! {self(), ok},
tb_client_loop(Pid, CS, Send, IOV, ts(), 0, 0).
--
2.43.0