diff options
author | Hans Nilsson <hans@erlang.org> | 2019-09-13 11:41:31 +0200 |
---|---|---|
committer | Hans Nilsson <hans@erlang.org> | 2019-09-13 11:41:31 +0200 |
commit | 4eb52e85b156132da98cdfa0ff2e811bceb69e8f (patch) | |
tree | 7cc86516e8573110affee925b1b2a0178e4fb9f9 | |
parent | 5d54f90dbe9eed6c1200a83eeda5b15d56367999 (diff) | |
parent | 8bf44865e32553a270645e06372b1c2fd83999e2 (diff) | |
download | erlang-4eb52e85b156132da98cdfa0ff2e811bceb69e8f.tar.gz |
Merge branch 'hans/ssh/client_sup/OTP-16026'
* hans/ssh/client_sup/OTP-16026:
ssh: Extend the sshc_sup tests
ssh: Fix ssh_info module so it reports tunnel channels
-rw-r--r-- | lib/ssh/src/ssh_info.erl | 35 | ||||
-rw-r--r-- | lib/ssh/test/ssh_sup_SUITE.erl | 56 |
2 files changed, 74 insertions, 17 deletions
diff --git a/lib/ssh/src/ssh_info.erl b/lib/ssh/src/ssh_info.erl index 11f4bc51e6..91365205aa 100644 --- a/lib/ssh/src/ssh_info.erl +++ b/lib/ssh/src/ssh_info.erl @@ -79,8 +79,8 @@ print_clients() -> lists:map(fun print_client/1, supervisor:which_children(sshc_sup)) catch - C:E -> - io_lib:format('***print_clients FAILED: ~p:~p~n',[C,E]) + C:E:S -> + io_lib:format('***print_clients FAILED: ~p:~p,~n ~p~n',[C,E,S]) end. print_client({undefined,Pid,supervisor,[ssh_connection_handler]}) -> @@ -94,9 +94,9 @@ print_client({undefined,Pid,supervisor,[ssh_connection_handler]}) -> io_lib:format(?INDENT?INDENT?INDENT"No channels~n",[]) end]; -print_client(Other) -> - io_lib:format(" [[Other 1: ~p]]~n",[Other]). - +print_client({{client,ssh_system_sup,_,_,_},Pid,supervisor,[ssh_system_sup]}) when is_pid(Pid) -> + lists:map(fun print_system_sup/1, + supervisor:which_children(Pid)). %%%================================================================ print_servers() -> @@ -104,8 +104,8 @@ print_servers() -> lists:map(fun print_server/1, supervisor:which_children(sshd_sup)) catch - C:E -> - io_lib:format('***print_servers FAILED: ~p:~p~n',[C,E]) + C:E:S -> + io_lib:format('***print_servers FAILED: ~p:~p,~n ~p~n',[C,E,S]) end. @@ -140,22 +140,33 @@ print_system_sup({{ssh_acceptor_sup,_LocalHost,_LocalPort,_Profile}, Pid, superv -print_channels({{server,ssh_channel_sup,_,_},Pid,supervisor,[ssh_channel_sup]}) when is_pid(Pid) -> +print_channels({{Role,ssh_channel_sup,_,_},Pid,supervisor,[ssh_channel_sup]}) when is_pid(Pid) -> + ChanBehaviour = + case Role of + server -> ssh_server_channel; + client -> ssh_client_channel + end, Children = supervisor:which_children(Pid), - ChannelPids = [P || {R,P,worker,[ssh_server_channel]} <- Children, + ChannelPids = [P || {R,P,worker,[Mod]} <- Children, + ChanBehaviour == Mod, is_pid(P), is_reference(R)], case ChannelPids of [] -> io_lib:format(?INDENT?INDENT"No channels~n",[]); [Ch1Pid|_] -> - {{ConnManager,_}, _Str} = ssh_server_channel:get_print_info(Ch1Pid), + {{ConnManager,_}, _Str} = ChanBehaviour:get_print_info(Ch1Pid), {{_,Remote},_} = ssh_connection_handler:get_print_info(ConnManager), [io_lib:format(?INDENT?INDENT"Remote: ~s ConnectionRef = ~p~n",[fmt_host_port(Remote),ConnManager]), lists:map(fun print_ch/1, ChannelPids) ] end; -print_channels({{server,ssh_connection_sup,_,_},Pid,supervisor,[ssh_connection_sup]}) when is_pid(Pid) -> - []. % The supervisor of the connections socket owning process +print_channels({{_Role,ssh_connection_sup,_,_},Pid,supervisor,[ssh_connection_sup]}) when is_pid(Pid) -> + []; % The supervisor of the connections socket owning process + +print_channels({Ref,Pid,supervisor,[ssh_tcpip_forward_acceptor_sup]}) when is_pid(Pid), + is_reference(Ref) -> + []. % The supervisor of the forward_acceptor process + print_ch(Pid) -> try diff --git a/lib/ssh/test/ssh_sup_SUITE.erl b/lib/ssh/test/ssh_sup_SUITE.erl index 3b5e858c53..0bf4d87f0a 100644 --- a/lib/ssh/test/ssh_sup_SUITE.erl +++ b/lib/ssh/test/ssh_sup_SUITE.erl @@ -116,8 +116,11 @@ sshc_subtree(Config) when is_list(Config) -> {user_interaction, false}, {user, ?USER}, {password, ?PASSWD},{user_dir, UserDir}]), - ?wait_match([{_, _,supervisor,[ssh_system_sup]}], - supervisor:which_children(sshc_sup)), + ?wait_match([{{client,ssh_system_sup, LocalIP, LocalPort, ?DEFAULT_PROFILE}, + SysSup, supervisor,[ssh_system_sup]}], + supervisor:which_children(sshc_sup), + [SysSup, LocalIP, LocalPort]), + check_sshc_system_tree(SysSup, Pid1, LocalIP, LocalPort, Config), {ok, Pid2} = ssh:connect(Host, Port, [{silently_accept_hosts, true}, {user_interaction, false}, @@ -389,12 +392,55 @@ check_sshd_system_tree(Daemon, Config) -> ?wait_match([], supervisor:which_children(ChannelSup)), - ssh_sftp:start_channel(Client), + {ok,PidC} = ssh_sftp:start_channel(Client), + + ?wait_match([{_, PidS,worker,[ssh_server_channel]}], + supervisor:which_children(ChannelSup), + [PidS]), + true = (PidS =/= PidC), - ?wait_match([{_, _,worker,[ssh_server_channel]}], - supervisor:which_children(ChannelSup)), ssh:close(Client). + +check_sshc_system_tree(SysSup, Connection, LocalIP, LocalPort, _Config) -> + ?wait_match([{_,SubSysSup,supervisor,[ssh_subsystem_sup]}], + supervisor:which_children(SysSup), + [SubSysSup]), + ?wait_match([{{client,ssh_connection_sup, LocalIP, LocalPort}, + ConnectionSup, supervisor, + [ssh_connection_sup]}, + {{client,ssh_channel_sup, LocalIP, LocalPort}, + ChannelSup,supervisor, + [ssh_channel_sup]}], + supervisor:which_children(SubSysSup), + [ConnectionSup,ChannelSup]), + ?wait_match([{_, Connection, worker,[ssh_connection_handler]}], + supervisor:which_children(ConnectionSup)), + ?wait_match([], supervisor:which_children(ChannelSup)), + + {ok,ChPid1} = ssh_sftp:start_channel(Connection), + ?wait_match([{_,ChPid1,worker,[ssh_client_channel]}], + supervisor:which_children(ChannelSup)), + + {ok,ChPid2} = ssh_sftp:start_channel(Connection), + ?wait_match([{_,ChPidA,worker,[ssh_client_channel]}, + {_,ChPidB,worker,[ssh_client_channel]}], + supervisor:which_children(ChannelSup), + [ChPidA, ChPidB]), + lists:sort([ChPidA, ChPidB]) == lists:sort([ChPid1, ChPid2]), + + ct:pal("Expect a SUPERVISOR REPORT with offender {pid,~p}....~n", [ChPid1]), + exit(ChPid1, kill), + ?wait_match([{_,ChPid2,worker,[ssh_client_channel]}], + supervisor:which_children(ChannelSup)), + + ct:pal("Expect a SUPERVISOR REPORT with offender {pid,~p}....~n", [ChPid2]), + exit(ChPid2, kill), + ?wait_match([], supervisor:which_children(ChannelSup)), + ct:pal("... now there should not be any SUPERVISOR REPORT.~n", []). + + + acceptor_pid(DaemonPid) -> Parent = self(), Pid = spawn(fun() -> |