diff options
author | Erlang/OTP <otp@erlang.org> | 2021-03-29 15:12:50 +0200 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2021-03-29 15:12:50 +0200 |
commit | 16878bbf487674f95796adaffa70b7dc9488cdd2 (patch) | |
tree | c1b7b3e53b42808528f4cbc8295d1bb646493994 | |
parent | ddcda22c41dfe5b595036a42ab5d42dcb1957b1b (diff) | |
parent | 0dc12045e0ec5a11b2dce00b47b8e396f9544ecc (diff) | |
download | erlang-16878bbf487674f95796adaffa70b7dc9488cdd2.tar.gz |
Merge branch 'hans/ssh/idle_time-bug/OTP-17279' into maint-21
* hans/ssh/idle_time-bug/OTP-17279:
ssh: Fix idle_time bug
ssh: Update idle_time test case
-rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 9 | ||||
-rw-r--r-- | lib/ssh/test/ssh_basic_SUITE.erl | 51 |
2 files changed, 31 insertions, 29 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index eff40a3bc0..5d2f6382a0 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -1449,8 +1449,13 @@ handle_event(info, {'DOWN', _Ref, process, ChannelPid, _Reason}, _, D) -> end, [], Cache), {keep_state, D, cond_set_idle_timer(D)}; -handle_event({timeout,idle_time}, _Data, _StateName, _D) -> - {stop, {shutdown, "Timeout"}}; +handle_event({timeout,idle_time}, _Data, _StateName, D) -> + case ssh_client_channel:cache_info(num_entries, cache(D)) of + 0 -> + {stop, {shutdown, "Timeout"}}; + _ -> + keep_state_and_data + end; %%% So that terminate will be run when supervisor is shutdown handle_event(info, {'EXIT', _Sup, Reason}, StateName, _) -> diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl index 5de6d52092..4f01c9c0ea 100644 --- a/lib/ssh/test/ssh_basic_SUITE.erl +++ b/lib/ssh/test/ssh_basic_SUITE.erl @@ -604,43 +604,40 @@ exec_compressed(Config) when is_list(Config) -> end. %%-------------------------------------------------------------------- -%%% Idle timeout test, client -idle_time_client(Config) -> - SystemDir = filename:join(proplists:get_value(priv_dir, Config), system), - UserDir = proplists:get_value(priv_dir, Config), +%%% Idle timeout test +idle_time_client(Config) -> idle_time_common([], [{idle_time, 2000}], Config). - {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, - {user_dir, UserDir}, - {failfun, fun ssh_test_lib:failfun/2}]), - ConnectionRef = - ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, - {user_dir, UserDir}, - {user_interaction, false}, - {idle_time, 2000}]), - {ok, Id} = ssh_connection:session_channel(ConnectionRef, 1000), - ssh_connection:close(ConnectionRef, Id), - receive - after 10000 -> - {error, closed} = ssh_connection:session_channel(ConnectionRef, 1000) - end, - ssh:stop_daemon(Pid). +idle_time_server(Config) -> idle_time_common([{idle_time, 2000}], [], Config). -%%-------------------------------------------------------------------- -%%% Idle timeout test, server -idle_time_server(Config) -> + +idle_time_common(DaemonExtraOpts, ClientExtraOpts, Config) -> SystemDir = filename:join(proplists:get_value(priv_dir, Config), system), UserDir = proplists:get_value(priv_dir, Config), {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, {user_dir, UserDir}, - {idle_time, 2000}, - {failfun, fun ssh_test_lib:failfun/2}]), + {failfun, fun ssh_test_lib:failfun/2} + | DaemonExtraOpts + ]), ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, {user_dir, UserDir}, - {user_interaction, false}]), - {ok, Id} = ssh_connection:session_channel(ConnectionRef, 1000), - ssh_connection:close(ConnectionRef, Id), + {user_interaction, false} + | ClientExtraOpts + ]), + {ok, Id1} = ssh_sftp:start_channel(ConnectionRef), + {ok, Id2} = ssh_sftp:start_channel(ConnectionRef), + ssh_sftp:stop_channel(Id2), + timer:sleep(2500), + {ok, Id3} = ssh_sftp:start_channel(ConnectionRef), + ssh_sftp:stop_channel(Id1), + ssh_sftp:stop_channel(Id3), + timer:sleep(1000), + {ok, Id4} = ssh_sftp:start_channel(ConnectionRef), + timer:sleep(2500), + {ok, Id5} = ssh_sftp:start_channel(ConnectionRef), + ssh_sftp:stop_channel(Id4), + ssh_sftp:stop_channel(Id5), receive after 10000 -> {error, closed} = ssh_connection:session_channel(ConnectionRef, 1000) |