File 4332-kernel-tcp-misc-test-Adjust-accept-system-limit-test.patch of Package erlang
From 751c4fb12045b7461ea64fb2c540189c46c6fe1f Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 26 May 2020 10:50:21 +0200
Subject: [PATCH 32/35] [kernel|tcp|misc-test] Adjust accept-system-limit test
case
Add a skip clause (eaddrnotavail on listen, accept and connect).
---
lib/kernel/test/gen_tcp_misc_SUITE.erl | 70 +++++++++++++++++++-------
1 file changed, 51 insertions(+), 19 deletions(-)
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index 95be9106cc..c58bb91a41 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -3233,41 +3233,73 @@ wait_until_accepting(Proc,N) ->
%% Check that accept returns {error, system_limit}
%% (and not {error, enfile}) when running out of ports.
accept_system_limit(Config) when is_list(Config) ->
- {ok, LS} = gen_tcp:listen(0, []),
+ OldFlag = process_flag(trap_exit, true),
+ Res = try do_accept_system_limit(Config)
+ catch
+ exit:{skip, _} = SKIP ->
+ SKIP
+ end,
+ process_flag(trap_exit, OldFlag),
+ Res.
+
+do_accept_system_limit(_Config) ->
+ p("create listen socket"),
+ LS = case gen_tcp:listen(0, []) of
+ {ok, LSocket} ->
+ LSocket;
+ {error, eaddrnotavail = Reason} ->
+ skip(listen_failed_str(Reason))
+ end,
{ok, TcpPort} = inet:port(LS),
Me = self(),
+ p("create connector"),
Connector = spawn_link(fun () -> connector(TcpPort, Me) end),
+ p("sync with connector (~p)", [Connector]),
receive {Connector, sync} -> Connector ! {self(), continue} end,
- ok = acceptor(LS, false, []),
+ p("begin accepting"),
+ ok = acceptor(Connector, LS, false, []),
+ p("stop connector (~p)", [Connector]),
Connector ! stop,
+ p("done"),
ok.
-acceptor(LS, GotSL, A) ->
+acceptor(Connector, LS, GotSL, A) ->
case gen_tcp:accept(LS, 1000) of
- {ok, S} ->
- acceptor(LS, GotSL, [S|A]);
- {error, system_limit} ->
- acceptor(LS, true, A);
- {error, timeout} when GotSL ->
- ok;
- {error, timeout} ->
- error
+ {ok, S} ->
+ acceptor(Connector, LS, GotSL, [S|A]);
+ {error, eaddrnotavail = Reason} ->
+ exit({skip, accept_failed_str(Reason)});
+ {error, system_limit} ->
+ p("acceptor: system limit => *almost* done (~w)", [length(A)]),
+ acceptor(Connector, LS, true, A);
+ {error, timeout} when GotSL ->
+ p("acceptor: timeout (with system limit) => done (~w)",
+ [length(A)]),
+ ok;
+ {error, timeout} ->
+ error
end.
connector(TcpPort, Tester) ->
+ p("[connector] start"),
ManyPorts = open_ports([]),
Tester ! {self(), sync},
+ p("[connector] sync with tester (~p)", [Tester]),
receive {Tester, continue} -> timer:sleep(100) end,
+ p("[connector] begin connecting"),
ConnF = fun (Port) ->
- case catch gen_tcp:connect({127,0,0,1}, TcpPort, []) of
- {ok, Sock} ->
- Sock;
- _Error ->
- port_close(Port)
- end
- end,
+ case (catch gen_tcp:connect({127,0,0,1}, TcpPort, [])) of
+ {ok, Sock} ->
+ Sock;
+ {error, eaddrnotavail = Reason} ->
+ exit({skip, connect_failed_str(Reason)});
+ _Error ->
+ port_close(Port)
+ end
+ end,
R = [ConnF(Port) || Port <- lists:sublist(ManyPorts, 10)],
- receive stop -> R end.
+ p("[connector] await stop"),
+ receive stop -> p("[connector] stop (~w)", [length(R)]), R end.
open_ports(L) ->
case catch open_port({spawn_driver, "ram_file_drv"}, []) of
--
2.26.2